develop in rails & android & perl 30 pages

30
Develop in Rails & Android & Perl 30 pages @sambaiz NDS#39 Niigata.pm tech talk

Upload: taiki-sakamoto

Post on 18-Jul-2015

258 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Develop in Rails & Android & Perl 30 pages

Develop

in

Rails & Android & Perl

30 pages @sambaiz

NDS#39 Niigata.pm tech talk

Page 2: Develop in Rails & Android & Perl 30 pages

@sambaiz

エアコンが壊れた

助けてRailsマン

Page 3: Develop in Rails & Android & Perl 30 pages

Rails new

$ perl -e’sytem(“rails new nemui_man -T”)’

Page 4: Develop in Rails & Android & Perl 30 pages

.gitignore

https://www.gitignore.io/

Page 5: Develop in Rails & Android & Perl 30 pages

Test (今回は使ってないのもある)

group :development, :test do

gem 'rspec-rails', '~> 3.1.0'

gem "shoulda-matchers"

gem 'factory_girl_rails', '~> 4.4.1'

gem 'faker', '~> 1.4.3'

gem 'capybara', '~> 2.4.3'

gem 'poltergeist'

gem 'database_cleaner', '~> 1.3.0'

end

Page 6: Develop in Rails & Android & Perl 30 pages

Install RSpec

$ perl -e‘system(“rails g rspec:install”)’

Page 7: Develop in Rails & Android & Perl 30 pages

Config Rspec

#application.rb

config.generators do |g|

g.test_framework :rspec,

fixtures: true,

view_specs: false,

helper_specs: false,

routing_specs: false,

controller_specs: true,

request_specs: false

g.fixture_replacement :factory_girl, dir: 'spec/factories'

end

Page 8: Develop in Rails & Android & Perl 30 pages

Config Poltergeist & FactoryGirl

# spec/rails_helper.rb

require 'capybara/poltergeist'

Capybara.javascript_driver = :poltergeist

RSpec.configure do |config|

config.include FactoryGirl::Syntax::Methods

end

Page 9: Develop in Rails & Android & Perl 30 pages

Guard

group :development do

gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i

gem 'terminal-notifier-guard', '~> 1.6.1'

gem 'guard-livereload', require: false

gem 'guard-rubocop', require: false

gem 'guard-rspec', require: false

end

Page 10: Develop in Rails & Android & Perl 30 pages

Gurad init

$ perl -e ‘system(“guard init livereload rubocop

rspec”)’

Page 11: Develop in Rails & Android & Perl 30 pages

Grape micro-framework for creating REST-like APIs

gem 'grape'

gem 'grape-jbuilder' # 今回は使ってない

gem 'grape-swagger'

gem 'grape-swagger-rails'

Page 12: Develop in Rails & Android & Perl 30 pages

Config grape

# routes.rb

mount API::Base => 'api'

mount GrapeSwaggerRails::Engine => '/apidoc'

# application.rb

config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')

config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]

# initializers/grape_swagger_rails.rb

GrapeSwaggerRails.options.url = "api/swagger_doc.json"

GrapeSwaggerRails.options.app_name = 'SamuiNemui'

GrapeSwaggerRails.options.app_url = '/'

Page 13: Develop in Rails & Android & Perl 30 pages

API Root

# app/api/app.rb

module API

class Base < Grape::API

mount API_V1::Base # バージョンを変えるときはここを切り替える

end

end

Page 14: Develop in Rails & Android & Perl 30 pages

API V1

# app/api/api_v1.rb

module API_V1

class Base < Grape::API

mount V1::SamuiApi

mount V1::NemuiApi

add_swagger_documentation(

api_version: '1.0',

base_path: "/api",

hide_documentation_path: true

)

end

end

Page 15: Develop in Rails & Android & Perl 30 pages

Samui API(0)

# app/api/v1/samui_api.rb

module V1

class SamuiApi < Grape::API

format :json

formatter :json, Grape::Formatter::Jbuilder

resource :samui do

# ここにいろいろ書く

end

end

Page 16: Develop in Rails & Android & Perl 30 pages

Test(1-success) for Samui API

# spec/requests/v1/samui_spec.rb

require 'rails_helper.rb'

describe 'Samui API', type: :request do

it 'gets samui' do

attr = {

name: Faker::Name.name,

}

post '/api/samui', attr

expect(response).to be_success

end

end

Page 17: Develop in Rails & Android & Perl 30 pages

Test(1-failure) for Samui API

it 'gets wrong samui' do

attr = {

name: nil

}

post '/api/samui', attr

expect(response).not_to be_success

end

Page 18: Develop in Rails & Android & Perl 30 pages

Samui API(1)

resource :samui do

desc ‘さむい’

params do

requires :name, type: String, desc: ‘名前’

optional :hash, type: String, desc: ‘ハッシュ’

end

post do

# ここにいろいろ書くend

end

Page 19: Develop in Rails & Android & Perl 30 pages

Test(2) for Samui API

it 'gets samui then return ganbare' do

attr = {

name: Faker::Name.name,

}

post '/api/samui', attr

expect(response).to be_success

json = JSON.parse(response.body)

expect(json['message']).to eq 'がんばれ'

end

Page 20: Develop in Rails & Android & Perl 30 pages

Samui API(2)

post do

{ message: ‘がんばれ’ }

end

Page 21: Develop in Rails & Android & Perl 30 pages

/apidoc

Page 22: Develop in Rails & Android & Perl 30 pages

コード

https://github.com/sambaiz/nemui

Page 23: Develop in Rails & Android & Perl 30 pages

ここからAndroidのはなし

最高のAPIができたのでAndroidから叩くはなし

Page 24: Develop in Rails & Android & Perl 30 pages

Volley

https://android.googlesource.com/platform/fram

eworks/volley

TODO:

import module

module dependencyの設定

Page 25: Develop in Rails & Android & Perl 30 pages

JSonic

http://jsonic.sourceforge.jp/

TODO:

jar -> /libs

Page 26: Develop in Rails & Android & Perl 30 pages

Request

queue=Volley.newRequestQueue(getApplicationContext());

queue.add(requestGanbare("https://nemui.herokuapp.com/

api/samui"));

Page 27: Develop in Rails & Android & Perl 30 pages

Request Ganbare(1)

private void requestGanbare(String url){

StringRequest request = new StringRequest(Request.Method.POST, url, new

Response.Listener<String>() {

@Override

public void onResponse(String response) {

Ganbare gnb = JSON.decode(response, Ganbare.class); # POJOります

Toast.makeText(getApplication(), gnb.getMessage(), Toast.LENGTH_LONG).show();

}

},

new Response.ErrorListener() {

@Override public void onErrorResponse(VolleyError error) {

Toast.makeText(getApplication(), error.networkResponse.statusCode,

Toast.LENGTH_LONG).show();

}

})

Page 28: Develop in Rails & Android & Perl 30 pages

Request Ganbare(2)

{

@Override

protected Map<String, String> getParams() {

Map<String, String> params = new HashMap<String, String>();

params.put("name", "hogehoge");

return params;

}

};

}

Page 29: Develop in Rails & Android & Perl 30 pages

Ganbare Class

public class Ganbare {

private String message;

public Ganbare(String message) {

this.message = message;

}

public String getMessage() {

return message;

}

}

Page 30: Develop in Rails & Android & Perl 30 pages

30枚目

動作確認してないです!ありがとうございます!