jeckle 0.3.0 → 0.3.1

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: 0fedf58b9859236e613f70bb3cfaf8f34fcba6cd
4
- data.tar.gz: f5671e5ec06652de45455208795669c487decaa8
3
+ metadata.gz: f21821c33e6f22dc7c478aea1e3362943909fa73
4
+ data.tar.gz: 7a95a145731b2d5b00c025bff09d54e8d1572531
5
5
  SHA512:
6
- metadata.gz: d052c4ef86214fcd06f9f84c9f959e02c5c83c2d3560652f8d0fb5206f3a090f8b09d8662cd500bb125206f20cd3d7f44d2dcf33a464bfdbac66b7f99ef6d0a1
7
- data.tar.gz: 58f383cc88ac992dbef23a98e2c5af620d0c14fdf774373f8a8aa9f07a0b0f722ee496caa03769fd4324c6e7b3e060c0f65bb12f0e424e8ddb56b18da4a86ffc
6
+ metadata.gz: edd8cae15a4e4779c72e8e0d1fc93e2038d467c2d9089f751472e6c10bbf2e284f902247c32f1f8c3211f409fcdb7d2d8fc92274092d8d47050111c86a502d70
7
+ data.tar.gz: 7a3f7ebe5e921202cea52c038e77506e9a69ecb6a3568cced27f0c35c702b60f3c21cfadb3189a063e5d622636be65e64b6c29366a6c6d1923dd41d589c79c6a
data/.travis.yml CHANGED
@@ -7,6 +7,7 @@ rvm:
7
7
  - ruby-head
8
8
  - ruby
9
9
  - jruby
10
+ - 2.2.2
10
11
  - 2.1.0
11
12
  - 2.0.0
12
13
  - 1.9.3
data/History.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ ## v.0.3.1
2
+
3
+ * Add attribute aliasing
4
+ * Add possibility to change the resource name when call Resource.search.
5
+
1
6
  ## v.0.3.0
2
7
 
3
8
  * Change Jeckle::Resource.default_api to Jeckle::Resource.api
@@ -8,4 +13,4 @@
8
13
 
9
14
  ## v.0.2.0
10
15
 
11
- * Add Jeckle middlewares
16
+ * Add Jeckle middlewares
data/README.md CHANGED
@@ -20,19 +20,25 @@ Let third party APIs be Heckle for your app's Jeckle.
20
20
 
21
21
  Add this line to your application's Gemfile:
22
22
 
23
- gem 'jeckle'
23
+ ```ruby
24
+ gem 'jeckle'
25
+ ```
24
26
 
25
27
  And then execute:
26
28
 
27
- $ bundle
29
+ ```sh
30
+ $ bundle
31
+ ```
28
32
 
29
- ### For Rails applications
33
+ ## Usage
30
34
 
31
- We recommend to create a initializer:
35
+ ### Configuring an API
32
36
 
33
- ```ruby
34
- # config/initializers/jeckle.rb
37
+ Let's say you'd like to connect your app to Dribbble.com - a community of designers sharing screenshots of their work, process, and projects.
38
+
39
+ First, you would need to configure the API:
35
40
 
41
+ ```ruby
36
42
  Jeckle.configure do |config|
37
43
  config.register :some_service do |api|
38
44
  api.base_uri = 'http://api.someservice.com'
@@ -46,17 +52,13 @@ Jeckle.configure do |config|
46
52
  end
47
53
  ```
48
54
 
49
- And then put your API stuff scoped inside a `services` folder:
50
-
51
- ```ruby
52
- # app/services/some_service/models/my_resource.rb
55
+ ### Mapping resources
53
56
 
54
- module SomeService
55
- module Models
56
- class MyResource
57
- include Jeckle::Resource
57
+ Following the previous example, Dribbble.com consists of pieces of web designers work called "Shots". Each shot has the attributes `id`, `name`, `url` and `image_url`. A Jeckle resource representing Dribbble's shots would be something like this:
58
58
 
59
- api :some_service
59
+ ```ruby
60
+ class Shot
61
+ include Jeckle::Resource
60
62
 
61
63
  attribute :id
62
64
  end
@@ -64,9 +66,60 @@ module SomeService
64
66
  end
65
67
  ```
66
68
 
69
+ ### Fetching data
70
+
71
+ The resource class allows us to search shots through HTTP requests to the API, based on the provided information. For example, we can find a specific shot by providing its id to the `find` method:
72
+
73
+ ```ruby
74
+ # GET http://api.dribbble.com/shots/1600459
75
+ shot = Shot.find 1600459
76
+ ```
77
+
78
+ That will return a `Shot` instance, containing the shot info:
79
+
80
+ ```ruby
81
+ shot.id
82
+ => 1600459
83
+
84
+ shot.name
85
+ => "Daryl Heckle And Jeckle Oates"
86
+
87
+ shot.image_url
88
+ => "https://d13yacurqjgara.cloudfront.net/users/85699/screenshots/1600459/daryl_heckle_and_jeckle_oates-dribble.jpg"
89
+ ```
90
+
91
+ You can also look for many shots matching one or more attributes, by using the `search` method:
92
+
93
+ ```ruby
94
+ # GET http://api.dribbble.com/shots?name=avengers
95
+ shots = Shot.search name: 'avengers'
96
+ ```
97
+
98
+ ### Attribute Aliasing
99
+
100
+ Sometimes you want to call the API's attributes something else, either because their names aren't very concise or because they're out of you app's convention. If that's the case, you can add an `as` option:
101
+
102
+ ```ruby
103
+ attribute :thumbnailSize, String, as: :thumbnail_size
104
+ ```
105
+
106
+ Both mapping will work:
107
+
108
+ ```ruby
109
+ shot.thumbnailSize
110
+ => "50x50"
111
+
112
+ shot.thumbnail_size
113
+ => "50x50"
114
+ ```
115
+
116
+ We're all set! Now we can expand the mapping of our API, e.g to add ability to search Dribbble Designer directory by adding Designer class, or we can expand the original mapping of Shot class to include more attributes, such as tags or comments.
117
+
118
+ ## Examples
119
+
120
+ You can see more examples here: [https://github.com/tomas-stefano/jeckle/tree/master/examples](https://github.com/tomas-stefano/jeckle/tree/master/examples)
121
+
67
122
  ## Roadmap
68
123
 
69
- - Faraday middleware abstraction
70
- - Per action API
71
- - Comprehensive restful actions
72
- - Testability
124
+ Follow [GitHub's milestones](https://github.com/tomas-stefano/jeckle/milestones)
125
+ >>>>>>> 14eb4ce... Merge pull request #49 from tomas-stefano/attribute-mapping
data/examples/dribbble.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  require 'jeckle'
2
2
 
3
+ # Here is an example using the Dribbble API
4
+
3
5
  Jeckle.configure do |config|
4
6
  config.register :dribbble do |api|
5
7
  api.base_uri = 'http://api.dribbble.com'
8
+ api.middlewares do
9
+ response :json
10
+ end
6
11
  end
7
12
  end
8
13
 
@@ -14,7 +19,7 @@ class Shot
14
19
  attribute :id, Integer
15
20
  attribute :name, String
16
21
  attribute :url, String
17
- attribute :image_url, String
22
+ attribute :image_url, String, as: :image
18
23
  end
19
24
 
20
25
  shot = Shot.find 1600459
@@ -25,5 +30,5 @@ shot.id
25
30
  shot.name
26
31
  # => Daryl Heckle And Jeckle Oates
27
32
 
28
- shot.image_url
33
+ puts "The shot image URL is #{shot.image}"
29
34
  # => https://d13yacurqjgara.cloudfront.net/users/85699/screenshots/1600459/daryl_heckle_and_jeckle_oates-dribble.jpg
data/jeckle.gemspec CHANGED
@@ -21,11 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'activemodel', '>= 4.0'
22
22
  spec.add_dependency 'faraday', '~> 0.9'
23
23
  spec.add_dependency 'faraday_middleware'
24
- spec.add_dependency 'virtus', '~> 1.0'
24
+ spec.add_dependency 'virtus'
25
25
 
26
- spec.add_development_dependency 'bundler', '~> 1.6'
26
+ spec.add_development_dependency 'bundler', '>= 1.6'
27
27
  spec.add_development_dependency 'rake'
28
- spec.add_development_dependency 'rspec', '~> 3.1'
28
+ spec.add_development_dependency 'rspec', '~> 3.2'
29
29
 
30
30
  if RUBY_ENGINE == 'rbx'
31
31
  spec.add_development_dependency 'rubinius-compiler'
@@ -34,6 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'pry'
35
35
  else
36
36
  spec.add_development_dependency 'pry-nav' if RUBY_VERSION < '2.0.0'
37
- spec.add_development_dependency 'pry-byebug' if RUBY_VERSION >= '2.0.0'
37
+ spec.add_development_dependency 'pry-byebug', '3.1.0' if RUBY_VERSION >= '2.0.0'
38
38
  end
39
39
  end
data/lib/jeckle.rb CHANGED
@@ -5,7 +5,7 @@ require 'virtus'
5
5
 
6
6
  require 'jeckle/version'
7
7
 
8
- %w(setup api model request http rest_actions resource errors).each do |file_name|
8
+ %w(setup api model request http rest_actions resource errors attribute_aliasing).each do |file_name|
9
9
  require "jeckle/#{file_name}"
10
10
  end
11
11
 
@@ -0,0 +1,13 @@
1
+ module Jeckle
2
+ module AttributeAliasing
3
+ def attribute(name, coercion, options = {})
4
+ if custom_name = options.delete(:as)
5
+ super(custom_name, coercion, options)
6
+
7
+ alias_attribute name, custom_name
8
+ else
9
+ super
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,6 +6,8 @@ module Jeckle
6
6
  base.send :include, Jeckle::Model
7
7
  base.send :include, Jeckle::HTTP
8
8
  base.send :include, Jeckle::RESTActions
9
+
10
+ base.send :extend, Jeckle::AttributeAliasing
9
11
  end
10
12
  end
11
13
  end
@@ -13,11 +13,13 @@ module Jeckle
13
13
  end
14
14
 
15
15
  def search(params = {})
16
- response = run_request(resource_name, params).response.body || []
16
+ custom_resource_name = params.delete(:resource_name) if params.kind_of?(Hash)
17
+
18
+ response = run_request(custom_resource_name || resource_name, params: params).response.body || []
17
19
  collection = response.kind_of?(Array) ? response : response[resource_name]
18
20
 
19
21
  Array(collection).collect { |attrs| new attrs }
20
22
  end
21
23
  end
22
24
  end
23
- end
25
+ end
data/lib/jeckle/setup.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Jeckle
2
2
  class Setup
3
- # Register apis, providing all the configurations to it.
3
+ # Register APIs, providing all the configurations to it.
4
4
  #
5
5
  # @example
6
6
  #
@@ -1,3 +1,3 @@
1
1
  module Jeckle
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
File without changes
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ class AttributeAliasingResource
4
+ include Jeckle::Resource
5
+
6
+ attribute :firstName, String, as: :first_name
7
+ end
8
+
9
+ RSpec.describe Jeckle::AttributeAliasing do
10
+ let(:first_name) { 'First Name' }
11
+ let(:resource) { AttributeAliasingResource.new(firstName: first_name) }
12
+
13
+ describe '.attribute' do
14
+ it 'initializes attributes by :as options' do
15
+ expect(resource.first_name).to eq first_name
16
+ expect(resource.firstName).to eq first_name
17
+ end
18
+ end
19
+ end
File without changes
File without changes
File without changes
File without changes
@@ -30,7 +30,7 @@ RSpec.describe Jeckle::RESTActions do
30
30
 
31
31
  it 'calls default API connection with GET and search params' do
32
32
  expect(Jeckle::Request).to receive(:run)
33
- .with(api, 'fake_resources', query).and_return(fake_request)
33
+ .with(api, 'fake_resources', { params: query }).and_return(fake_request)
34
34
 
35
35
  FakeResource.search query
36
36
  end
@@ -69,5 +69,18 @@ RSpec.describe Jeckle::RESTActions do
69
69
  expect(FakeResource.search query).to match []
70
70
  end
71
71
  end
72
+
73
+ context 'when the endpoint is overwritten' do
74
+ let(:endpoint) { 'custom_endpoint' }
75
+ let(:query) { { resource_name: endpoint, name: 'cocada' } }
76
+ let(:body) { [{ id: 1001 }, { id: 1002 }] }
77
+
78
+ it 'calls default API connection with GET and search params' do
79
+ expect(Jeckle::Request).to receive(:run)
80
+ .with(api, endpoint, params: query).and_return(fake_request)
81
+
82
+ FakeResource.search query
83
+ end
84
+ end
72
85
  end
73
- end
86
+ end
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeckle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas D'Stefano
@@ -9,120 +9,120 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-22 00:00:00.000000000 Z
12
+ date: 2015-05-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '4.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '4.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: faraday
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0.9'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0.9'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: faraday_middleware
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: virtus
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ~>
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: '1.0'
62
+ version: '0'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ~>
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '1.0'
69
+ version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ~>
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: '1.6'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ~>
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '1.6'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rake
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rspec
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ~>
102
+ - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '3.1'
104
+ version: '3.2'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ~>
109
+ - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '3.1'
111
+ version: '3.2'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: pry-byebug
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - '='
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: 3.1.0
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - '='
124
124
  - !ruby/object:Gem::Version
125
- version: '0'
125
+ version: 3.1.0
126
126
  description: Simple module for building client APIs
127
127
  email:
128
128
  - tomas_stefano@successoft.com
@@ -131,9 +131,9 @@ executables: []
131
131
  extensions: []
132
132
  extra_rdoc_files: []
133
133
  files:
134
- - .gitignore
135
- - .rspec
136
- - .travis.yml
134
+ - ".gitignore"
135
+ - ".rspec"
136
+ - ".travis.yml"
137
137
  - Gemfile
138
138
  - History.markdown
139
139
  - LICENSE.txt
@@ -143,6 +143,7 @@ files:
143
143
  - jeckle.gemspec
144
144
  - lib/jeckle.rb
145
145
  - lib/jeckle/api.rb
146
+ - lib/jeckle/attribute_aliasing.rb
146
147
  - lib/jeckle/errors.rb
147
148
  - lib/jeckle/http.rb
148
149
  - lib/jeckle/model.rb
@@ -154,13 +155,14 @@ files:
154
155
  - spec/fixtures/jeckle_config.rb
155
156
  - spec/fixtures/models/fake_model.rb
156
157
  - spec/fixtures/resources/fake_resource.rb
157
- - spec/jeckle/api_spec.rb
158
- - spec/jeckle/http_spec.rb
159
- - spec/jeckle/model_spec.rb
160
- - spec/jeckle/request_spec.rb
161
- - spec/jeckle/resource_spec.rb
162
- - spec/jeckle/rest_actions_spec.rb
163
- - spec/jeckle/setup_spec.rb
158
+ - spec/lib/jeckle/api_spec.rb
159
+ - spec/lib/jeckle/attribute_aliasing_spec.rb
160
+ - spec/lib/jeckle/http_spec.rb
161
+ - spec/lib/jeckle/model_spec.rb
162
+ - spec/lib/jeckle/request_spec.rb
163
+ - spec/lib/jeckle/resource_spec.rb
164
+ - spec/lib/jeckle/rest_actions_spec.rb
165
+ - spec/lib/jeckle/setup_spec.rb
164
166
  - spec/spec_helper.rb
165
167
  - spec/support/shared_examples.rb
166
168
  homepage: https://github.com/tomas-stefano/jeckle
@@ -173,17 +175,17 @@ require_paths:
173
175
  - lib
174
176
  required_ruby_version: !ruby/object:Gem::Requirement
175
177
  requirements:
176
- - - '>='
178
+ - - ">="
177
179
  - !ruby/object:Gem::Version
178
180
  version: '0'
179
181
  required_rubygems_version: !ruby/object:Gem::Requirement
180
182
  requirements:
181
- - - '>='
183
+ - - ">="
182
184
  - !ruby/object:Gem::Version
183
185
  version: '0'
184
186
  requirements: []
185
187
  rubyforge_project:
186
- rubygems_version: 2.0.5
188
+ rubygems_version: 2.4.5
187
189
  signing_key:
188
190
  specification_version: 4
189
191
  summary: Simple module for building client APIs
@@ -191,12 +193,13 @@ test_files:
191
193
  - spec/fixtures/jeckle_config.rb
192
194
  - spec/fixtures/models/fake_model.rb
193
195
  - spec/fixtures/resources/fake_resource.rb
194
- - spec/jeckle/api_spec.rb
195
- - spec/jeckle/http_spec.rb
196
- - spec/jeckle/model_spec.rb
197
- - spec/jeckle/request_spec.rb
198
- - spec/jeckle/resource_spec.rb
199
- - spec/jeckle/rest_actions_spec.rb
200
- - spec/jeckle/setup_spec.rb
196
+ - spec/lib/jeckle/api_spec.rb
197
+ - spec/lib/jeckle/attribute_aliasing_spec.rb
198
+ - spec/lib/jeckle/http_spec.rb
199
+ - spec/lib/jeckle/model_spec.rb
200
+ - spec/lib/jeckle/request_spec.rb
201
+ - spec/lib/jeckle/resource_spec.rb
202
+ - spec/lib/jeckle/rest_actions_spec.rb
203
+ - spec/lib/jeckle/setup_spec.rb
201
204
  - spec/spec_helper.rb
202
205
  - spec/support/shared_examples.rb