json_client 0.0.2 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7cb4bba261119f65721f26b628f479a38e75f51
4
- data.tar.gz: 22b36d3aed2ef8d04dc893b687fc2e41cb4d9267
3
+ metadata.gz: 702dbe914a769256fa420b376e62097b91f8cc2b
4
+ data.tar.gz: 0fa43e21e5dbfec83ca99537f3d9d16089fd6edf
5
5
  SHA512:
6
- metadata.gz: 6bf62b6375988b27e103251979fa0127b6a08882b9d46c57726f32ce088c0323dfa5264dc375a9ff9fa7de213c1f1cf8b684085603cfd6c7f2d4db59ecbb504d
7
- data.tar.gz: a860985b6ffdbf33c15fb8cfd94928aa85712ccbe099b3686f2cbf300f1575be21d8a6d78e4b93cb20be792a729cffb0fc41f774e950b0827e34e946cf0f4291
6
+ metadata.gz: 32833898addf3fd748f79681cfbf77542768233f24c77f2dacdee05c0c5e0c7d5a9b06b74c8e6016c252e4f91a439be6a046ee7fe048780bca887d6df7daa991
7
+ data.tar.gz: bdfabe4c865a9461d59a83adceb325f527e214e3dc5450397278d67222624b4ed754d69022141e633db59bc7c5f3a43721f33bc5c7b0632b499e0b8863bd9f49
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # JsonClient
2
+ [![Gem
3
+ Version](https://badge.fury.io/rb/json_client.svg)](http://badge.fury.io/rb/json_client)
2
4
  [![Build
3
5
  Status](https://travis-ci.org/johnmcconnell/json_client.svg?branch=master)](https://travis-ci.org/johnmcconnell/json_client)
4
6
  [![Coverage
@@ -52,23 +54,20 @@ config = {
52
54
  api_password: 'api_password'
53
55
  }
54
56
 
55
-
56
57
  client = Client.new(config)
57
58
 
58
59
  # GET https://example.host.com/api/v1/objects?api_key=api_key&api_password=api_password
59
60
  client.index.json
60
61
  => { 'server_json' : 'is_parsed_here' }
61
62
 
62
-
63
-
64
63
  # GET https://my.host.com/api/v1/objects/2?api_key=api_key&api_password=api_password
65
- client.show(2).json # fetches from
64
+ client.show(2).json
66
65
  => { 'object_json' : 'is_parsed_here' }
67
66
  ```
68
67
 
69
68
  ## Best Guide
70
69
 
71
- Is [this
70
+ The best guide is [this
72
71
  test](https://github.com/johnmcconnell/json_client/blob/master/spec/json_client/base_spec.rb).
73
72
  Sorry non rspec people
74
73
 
data/json_client.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'rest-client', '~> 1.7.2'
22
+ spec.add_dependency 'attr_init', '~> 0.0.4'
22
23
 
23
24
  spec.add_development_dependency "simplecov", "~> 0.8.0"
24
25
  spec.add_development_dependency "coveralls", "~> 0.7.0"
data/lib/json_client.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "json_client/version"
2
2
  require "json_client/base"
3
3
  require "json_client/pather"
4
+ require "json_client/dsl"
4
5
 
5
6
  module JsonClient
6
7
  def self.new(pather, config)
@@ -1,11 +1,47 @@
1
1
  require 'rest_client'
2
+
3
+ require 'json_client/dsl'
2
4
  require 'json_client/responses'
3
5
  require 'json_client/requests'
6
+ require 'json_client/base_serializer'
7
+ require 'json_client/empty_serializer'
8
+ require 'json_client/base_requests/index'
9
+ require 'json_client/base_requests/show'
10
+ require 'json_client/base_requests/create'
11
+ require 'json_client/base_requests/update'
12
+ require 'json_client/base_requests/destroy'
13
+ require 'json_client/base_responses/index'
14
+ require 'json_client/base_responses/show'
15
+ require 'json_client/base_responses/create'
16
+ require 'json_client/base_responses/update'
17
+ require 'json_client/base_responses/destroy'
4
18
 
5
19
  module JsonClient
6
20
  class Base
21
+ extend DSL
7
22
  attr_reader :api_key, :api_password, :pather
8
23
 
24
+ requests do |r|
25
+ r.on :index, use: BaseRequests::Index.new
26
+ r.on :show, use: BaseRequests::Show.new
27
+ r.on :create, use: BaseRequests::Create.new
28
+ r.on :update, use: BaseRequests::Update.new
29
+ r.on :destroy, use: BaseRequests::Destroy.new
30
+ end
31
+
32
+ responses do |r|
33
+ r.on :index, use: BaseResponses::Index
34
+ r.on :show, use: BaseResponses::Show
35
+ r.on :create, use: BaseResponses::Create
36
+ r.on :update, use: BaseResponses::Update
37
+ r.on :destroy, use: BaseResponses::Destroy
38
+ end
39
+
40
+ serializers do |s|
41
+ s.on :create, :update, :destroy, use: BaseSerializer.new
42
+ s.on :index, :show, use: EmptySerializer.new
43
+ end
44
+
9
45
  def initialize(pather, config)
10
46
  @api_key = config[:api_key]
11
47
  @api_password = config[:api_password]
@@ -14,52 +50,42 @@ module JsonClient
14
50
  end
15
51
 
16
52
  def index
17
- response = requestors.index.new.fetch(request_path, auth_params)
18
- responders.index.new(response.body, response.code)
53
+ result(:index, nil)
19
54
  end
20
55
 
21
56
  def show(id)
22
- response = requestors.show.new.fetch(request_path(id), auth_params)
23
- responders.show.new(response.body, response.code)
57
+ result(:show, nil, id)
24
58
  end
25
59
 
26
60
  def create(model)
27
- response = requestors.create.new.fetch(
28
- request_path, auth_params, model
29
- )
30
- responders.create.new(response.body, response.code)
61
+ result(:create, model)
31
62
  end
32
63
 
33
64
  def update(id, model)
34
- response = requestors.update.new.fetch(
35
- request_path(id), auth_params, model
36
- )
37
- responders.update.new(response.body, response.code)
65
+ result(:update, model, id)
38
66
  end
39
67
 
40
68
  def destroy(id)
41
- response = requestors.destroy.new.fetch(
42
- request_path(id), auth_params
43
- )
44
- responders.destroy.new(response.body, response.code)
69
+ result(:destroy, nil, id)
45
70
  end
46
71
 
47
72
  protected
48
73
 
49
- def requestors
50
- @requestors ||= Requests.new
51
- end
52
-
53
- def responders
54
- @responders ||= Responses.new
74
+ def result(name, model, id = nil)
75
+ response_class = responses.public_send(name)
76
+ response_class.new(fetch_response(name, model, id))
55
77
  end
56
78
 
57
- def update_params(model)
58
- model.to_json
79
+ def fetch_response(name, model, id = nil)
80
+ path = pather.path(id)
81
+ request = requests.public_send(name)
82
+ serializer = serializers.public_send(name)
83
+ params = serializer.serialize(model)
84
+ fetch(path, request, params)
59
85
  end
60
86
 
61
- def request_path(id = nil)
62
- pather.path(id)
87
+ def fetch(path, request, params)
88
+ request.fetch(path, auth_params, params)
63
89
  end
64
90
 
65
91
  def auth_params
@@ -3,20 +3,14 @@ require_relative 'request'
3
3
  module JsonClient
4
4
  module BaseRequests
5
5
  class Create < Request
6
- def fetch(url, auth_params, model)
6
+ def fetch(url, auth_params, params)
7
7
  client.post(
8
8
  url,
9
- auth_params.merge(create_params(model)).to_json,
9
+ auth_params.merge(params).to_json,
10
10
  content_type: :json,
11
11
  accept: :json
12
12
  )
13
13
  end
14
-
15
- private
16
-
17
- def create_params(model)
18
- model.to_h
19
- end
20
14
  end
21
15
  end
22
16
  end
@@ -3,7 +3,7 @@ require_relative 'request'
3
3
  module JsonClient
4
4
  module BaseRequests
5
5
  class Destroy < Request
6
- def fetch(url, auth_params)
6
+ def fetch(url, auth_params, params)
7
7
  client.delete(
8
8
  url, params: auth_params
9
9
  )
@@ -3,7 +3,7 @@ require_relative 'request'
3
3
  module JsonClient
4
4
  module BaseRequests
5
5
  class Index < Request
6
- def fetch(url, auth_params)
6
+ def fetch(url, auth_params, params = nil)
7
7
  client.get url, params: auth_params
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ require_relative 'request'
3
3
  module JsonClient
4
4
  module BaseRequests
5
5
  class Show < Request
6
- def fetch(url, auth_params)
6
+ def fetch(url, auth_params, params)
7
7
  client.get url, params: auth_params
8
8
  end
9
9
  end
@@ -3,20 +3,14 @@ require_relative 'request'
3
3
  module JsonClient
4
4
  module BaseRequests
5
5
  class Update < Request
6
- def fetch(url, auth_params, model)
6
+ def fetch(url, auth_params, params)
7
7
  client.put(
8
8
  url,
9
- auth_params.merge(update_params(model)).to_json,
9
+ auth_params.merge(params).to_json,
10
10
  content_type: :json,
11
11
  accept: :json
12
12
  )
13
13
  end
14
-
15
- protected
16
-
17
- def update_params(model)
18
- model.to_h
19
- end
20
14
  end
21
15
  end
22
16
  end
@@ -3,9 +3,6 @@ require_relative 'response'
3
3
  module JsonClient
4
4
  module BaseResponses
5
5
  class Create < Response
6
- def initialize(body, code)
7
- super
8
- end
9
6
  end
10
7
  end
11
8
  end
@@ -3,9 +3,6 @@ require_relative 'response'
3
3
  module JsonClient
4
4
  module BaseResponses
5
5
  class Destroy < Response
6
- def initialize(body, code)
7
- super
8
- end
9
6
  end
10
7
  end
11
8
  end
@@ -3,9 +3,6 @@ require_relative 'response'
3
3
  module JsonClient
4
4
  module BaseResponses
5
5
  class Index < Response
6
- def initialize(body, code)
7
- super
8
- end
9
6
  end
10
7
  end
11
8
  end
@@ -1,19 +1,18 @@
1
1
  module JsonClient
2
2
  module BaseResponses
3
3
  class Response
4
- attr_reader :body, :code
4
+ attr_reader :raw_response
5
5
 
6
- def initialize(body, code)
7
- @body = body
8
- @code = code
6
+ def initialize(raw_response)
7
+ @raw_response = raw_response
9
8
  end
10
9
 
11
- def json
12
- parse_json
10
+ def method_missing(name, *args)
11
+ raw_response.public_send(name, *args)
13
12
  end
14
13
 
15
- def success?
16
- code >= 200 && code < 300
14
+ def json
15
+ parse_json
17
16
  end
18
17
 
19
18
  protected
@@ -3,9 +3,6 @@ require_relative 'response'
3
3
  module JsonClient
4
4
  module BaseResponses
5
5
  class Show < Response
6
- def initialize(body, code)
7
- super
8
- end
9
6
  end
10
7
  end
11
8
  end
@@ -3,9 +3,6 @@ require_relative 'response'
3
3
  module JsonClient
4
4
  module BaseResponses
5
5
  class Update < Response
6
- def initialize(body, code)
7
- super
8
- end
9
6
  end
10
7
  end
11
8
  end
@@ -0,0 +1,12 @@
1
+
2
+ module JsonClient
3
+ class BaseSerializer
4
+ def serialize(model)
5
+ if model.nil?
6
+ {}
7
+ else
8
+ model.to_h
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ require 'json_client/dsl/serializers_collector'
2
+ require 'json_client/dsl/requests_collector'
3
+ require 'json_client/dsl/on_use_collector'
4
+
5
+ module JsonClient
6
+ module DSL
7
+ def serializers_collector
8
+ @serializers_collector ||= SerializersCollector.new
9
+ end
10
+
11
+ def serializers
12
+ collector = serializers_collector
13
+
14
+ yield collector
15
+
16
+ define_method :serializers do
17
+ collector
18
+ end
19
+ end
20
+
21
+ def requests_collector
22
+ @requests_collector ||= RequestsCollector.new
23
+ end
24
+
25
+ def requests
26
+ collector = requests_collector
27
+
28
+ yield collector
29
+
30
+ define_method :requests do
31
+ collector
32
+ end
33
+ end
34
+
35
+ def responses_collector
36
+ @responses_collector ||= OnUseCollector.new
37
+ end
38
+
39
+ def responses
40
+ collector = responses_collector
41
+
42
+ yield collector
43
+
44
+ define_method :responses do
45
+ collector
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ require 'json_client/dsl/collector'
2
+
3
+ module JsonClient
4
+ module DSL
5
+ class Collector
6
+ def method_missing(method_name, *collection)
7
+ define_singleton_method(method_name) do
8
+ collection.first
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ module JsonClient
2
+ module DSL
3
+ class OnUseCollector
4
+ def on(*names, opts)
5
+ validate_opts!(opts)
6
+
7
+ thing = opts[:use]
8
+
9
+ Array(names).each do |name|
10
+ define_singleton_method(name) do
11
+ thing
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+ protected
18
+
19
+ def collector_name
20
+ 'thing'
21
+ end
22
+
23
+ def use_not_defined_message
24
+ "use: `#{collector_name}` must be defined"
25
+ end
26
+
27
+ def validate_opts!(opts)
28
+ fail use_not_defined_message if opts[:use].nil?
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ require 'json_client/dsl/on_use_collector'
2
+ require 'json_client/dsl/collector'
3
+
4
+ module JsonClient
5
+ module DSL
6
+ class RequestsCollector < OnUseCollector
7
+
8
+ protected
9
+
10
+ def collector_name
11
+ 'request'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'json_client/dsl/on_use_collector'
2
+ require 'json_client/dsl/collector'
3
+
4
+ module JsonClient
5
+ module DSL
6
+ class SerializersCollector < OnUseCollector
7
+
8
+ protected
9
+
10
+ def collector_name
11
+ 'serializer'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+
2
+ module JsonClient
3
+ class EmptySerializer
4
+ def serialize(model)
5
+ {}
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ require 'rest_client'
2
+ require 'json_client/responses'
3
+ require 'json_client/requests'
4
+
5
+ module JsonClient
6
+ class ResourceHandler
7
+
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module JsonClient
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -18,14 +18,20 @@ describe JsonClient::BaseResponses::Response do
18
18
  %q<{ "hello" : "world" }>
19
19
  end
20
20
 
21
+ let(:response) do
22
+ Object.new.tap do |r|
23
+ def r.code; 200; end
24
+ def r.body; %q<{ "hello" : "world" }>; end
25
+ end
26
+ end
27
+
21
28
  let(:json) do
22
29
  JSON.parse(body)
23
30
  end
24
31
 
25
32
  subject do
26
33
  described_class.new(
27
- body,
28
- code
34
+ response
29
35
  )
30
36
  end
31
37
 
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'rspec/collection_matchers'
3
+ require 'json_client'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |c|
7
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
8
+ c.hook_into :webmock
9
+ end
10
+
11
+ describe JsonClient::DSL::Collector do
12
+ let(:collected) do
13
+ 'hello world'
14
+ end
15
+
16
+ subject { described_class.new }
17
+
18
+ describe '::method_missing' do
19
+ it 'defines the method and returns the first argument' do
20
+ subject.index collected
21
+
22
+ expect(subject.index).to eq 'hello world'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'rspec/collection_matchers'
3
+ require 'json_client'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |c|
7
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
8
+ c.hook_into :webmock
9
+ end
10
+
11
+ describe JsonClient::DSL::SerializersCollector do
12
+ let(:collected) do
13
+ 'hello world'
14
+ end
15
+
16
+ subject { described_class.new }
17
+
18
+ describe '::method_missing' do
19
+ it 'defines the method and returns the first argument' do
20
+ subject.on :a, :b, use: 'hello'
21
+
22
+ expect(subject.a).to eq 'hello'
23
+ expect(subject.b).to eq 'hello'
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'rspec/collection_matchers'
3
+ require 'json_client'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |c|
7
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
8
+ c.hook_into :webmock
9
+ end
10
+
11
+ describe JsonClient::DSL do
12
+ let(:example_class) do
13
+ class A
14
+ extend JsonClient::DSL
15
+
16
+ requests do |r|
17
+ r.on :index, use: 'abc'
18
+ r.on :delete, use: 'xyz'
19
+ end
20
+
21
+ serializers do |s|
22
+ s.on :index, :show, :read, use: 'hello'
23
+ s.on :delete, use: 'world'
24
+ end
25
+
26
+ responses do |r|
27
+ r.on :index, use: '0'
28
+ r.on :show, use: '1'
29
+ end
30
+ end
31
+
32
+ # return the class
33
+ A
34
+ end
35
+
36
+ let(:serializers) do
37
+ example_class.new.serializers
38
+ end
39
+
40
+ let(:requests) do
41
+ example_class.new.requests
42
+ end
43
+
44
+ let(:responses) do
45
+ example_class.new.responses
46
+ end
47
+
48
+
49
+ describe '#serializers' do
50
+ it 'adds a way of dynamically adding serializers' do
51
+
52
+ expect(serializers.index).to eq 'hello'
53
+ expect(serializers.show).to eq 'hello'
54
+ expect(serializers.read).to eq 'hello'
55
+
56
+ expect(serializers.delete).to eq 'world'
57
+ end
58
+ end
59
+
60
+ describe '#responses' do
61
+ it 'adds a way of dynamically adding responses' do
62
+ expect(responses.index).to eq '0'
63
+ expect(responses.show).to eq '1'
64
+ end
65
+ end
66
+
67
+ describe '#requests' do
68
+ it 'adds a way of dynamically adding requests' do
69
+ expect(requests.index).to eq 'abc'
70
+ expect(requests.delete).to eq 'xyz'
71
+ end
72
+ end
73
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - johnmcconnell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.7.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: attr_init
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.4
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: simplecov
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -150,8 +164,16 @@ files:
150
164
  - lib/json_client/base_responses/response.rb
151
165
  - lib/json_client/base_responses/show.rb
152
166
  - lib/json_client/base_responses/update.rb
167
+ - lib/json_client/base_serializer.rb
168
+ - lib/json_client/dsl.rb
169
+ - lib/json_client/dsl/collector.rb
170
+ - lib/json_client/dsl/on_use_collector.rb
171
+ - lib/json_client/dsl/requests_collector.rb
172
+ - lib/json_client/dsl/serializers_collector.rb
173
+ - lib/json_client/empty_serializer.rb
153
174
  - lib/json_client/pather.rb
154
175
  - lib/json_client/requests.rb
176
+ - lib/json_client/resource_handler.rb
155
177
  - lib/json_client/responses.rb
156
178
  - lib/json_client/version.rb
157
179
  - spec/fixtures/vcr_cassettes/all_success.yml
@@ -163,6 +185,9 @@ files:
163
185
  - spec/json_client/base_requests/request_spec.rb
164
186
  - spec/json_client/base_responses/response_spec.rb
165
187
  - spec/json_client/base_spec.rb
188
+ - spec/json_client/dsl/collector_spec.rb
189
+ - spec/json_client/dsl/serializers_collector_spec.rb
190
+ - spec/json_client/dsl_spec.rb
166
191
  - spec/json_client/pather_spec.rb
167
192
  - spec/json_client/requests_spec.rb
168
193
  - spec/json_client/responses_spec.rb
@@ -202,6 +227,9 @@ test_files:
202
227
  - spec/json_client/base_requests/request_spec.rb
203
228
  - spec/json_client/base_responses/response_spec.rb
204
229
  - spec/json_client/base_spec.rb
230
+ - spec/json_client/dsl/collector_spec.rb
231
+ - spec/json_client/dsl/serializers_collector_spec.rb
232
+ - spec/json_client/dsl_spec.rb
205
233
  - spec/json_client/pather_spec.rb
206
234
  - spec/json_client/requests_spec.rb
207
235
  - spec/json_client/responses_spec.rb