Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてgemを作ったはなし / Making gem for the first time

Asami Mori
December 08, 2017

はじめてgemを作ったはなし / Making gem for the first time

はじめてGemを作ったはなし / ホスTech MTG #6

Asami Mori

December 08, 2017
Tweet

More Decks by Asami Mori

Other Decks in Programming

Transcript

  1. サインインして [~] curl -X "POST" "https://api.mc.lolipop/login" \ > -H "Content-Type:

    application/json" \ > -d '{"username":"___@____", "password":"____"}' "xxxx...xxxx"% # -> token
  2. ゲットしたトークンを使ってプロジェクト作成〜 [~] curl -X "POST" "https://api.mc.lolipop/projects" \ > -H "Content-Type:

    application/json" \ > -H "Authorization: Bearer <TOKEN>” \ > -d '{"type":"rails", "db_password":"____"}' { "project_name":"crimson-akune-8238", "domain":"crimson-akune-8238.lolipop.io" }
  3. できた感じする! [~] curl -X "GET" "https://api.mc.lolipop/projects" \ > -H "Content-Type:

    application/json" \ > -H "Authorization: Bearer <TOKEN>” \ [ { "id":3464, "created_at":"2017-12-07T02:03:25.19289Z", "updated_at":"2017-12-07T02:11:56.345571Z", "cid":"crimson-akune-8238.lolipop.io-ef0943603f", "project_id":433, "status":3, "hacofile":"rails.haco", ... }
  4. こんな感じの設定をしておくと… Lolp.configure do |config| config.api_endpoint = 'LOLIPOP MC API ENDPOINT'

    config.username = 'LOLIPOP MC USERNAME' config.password = 'LOLIPOP MC PASSWORD' end
  5. こんな感じで使えるようになりました # GET /projects
 Lolp.projects 
 # POST /projects Lolp.create_project(:rails)

    
 # POST /projects/:name/custom-domain Lolp.create_custom_domain( 'jungly-naha-2778.lolipop.ohr', ‘example.com' )
  6. LolpはLolp::Clientをインスタンスとして持っていて module Lolp class << self def client @client ||=

    Lolp::Client.new end def method_missing(method_name, *args, &block) if client.respond_to?(method_name) return client.send(method_name, *args, &block) end super end
  7. Lolp.xxxで叩かれたメソッドはmethod_missingがキャッチ Lolp::Clientにメソッドがあればそれを呼び出します module Lolp class << self def client @client

    ||= Lolp::Client.new end def method_missing(method_name, *args, &block) if client.respond_to?(method_name) return client.send(method_name, *args, &block) end super end
  8. connectionを使ってAPIを叩いています module Lolp class Project def projects connection.get('projects') end def

    create_project(template, params = {}) connection.post( 'projects', params.merge(haco_type: template) ) end end
  9. インクルードしてあげるだけ〜カンタン! module Lolp class Client include Lolp::Project include Lolp::Hoge include

    Lolp::Configuration def connection @connection ||= Lolp::Connection.new(config) end end end
  10. また、connectionなるものを使ってAPIを叩いていたのですが module Lolp class Project def projects connection.get('projects') end def

    create_project(template, params = {}) connection.post( 'projects', params.merge(haco_type: template) ) end end
  11. connectionはLolp::Connectionというクラスのインスタンス module Lolp class Connection def initialize(config) @config = config

    authenticate ... end def authenticate @token ||= connection.post( 'login', username: @config.username, password: @config.password ).body end
  12. そのインスタンスを作る時に
 認証を通してトークンを保持するようにしてあります module Lolp class Connection def initialize(config) @config =

    config authenticate ... end def authenticate @token ||= connection.post( 'login', username: @config.username, password: @config.password ).body end
  13. 初回だけトークンを保持するようにして隠しました module Lolp class Connection def initialize(config) @config = config

    authenticate ... end def authenticate @token ||= connection.post( 'login', username: @config.username, password: @config.password ).body end
  14. これで認証通っているかどうかは気にせずに
 マネクラAPIを利用することができます〜 # GET /projects
 Lolp.projects 
 # POST /projects

    Lolp.create_project(:rails) 
 # POST /projects/:name/custom-domain Lolp.create_custom_domain( 'jungly-naha-2778.lolipop.ohr', ‘example.com' )