spigot 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 78085ef374e7bfcf77dd307ab4d659152baddaf0
4
- data.tar.gz: 8852de5e0d8a2e3ad3ea6d2ba467b61483617be3
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Mzk3YmFlOGM4MmQ1M2JkNDBmNjBjYzZmZTNmYWFkOGJjMDE5MGMyMg==
5
+ data.tar.gz: !binary |-
6
+ ZTE4ZGJjNzQyYzk2YzZhZTcwNmQxY2I2NzdmNzgyMjZkNDJmZjllYw==
5
7
  SHA512:
6
- metadata.gz: 0b71f04cd9d4677e6a090cf59460b6ef0619b88cddb4f4fd9ce2f8f890b4e93ddf4288def1ccd15205675e0f4b924e85e78b3bbea25f767b68f17cc17ab69e84
7
- data.tar.gz: 2acb389f90be427885ee81c1159d6925b32344d3bbd8e148aa18232052182e4bf28b59f8a48ed14c9b12af3c32be3912466cb7c109ea1c91bdf5c2d4ea4f3f10
8
+ metadata.gz: !binary |-
9
+ ZTUzMTM5MWQ3ZGEzYTk4ZDBmMGQ2Mzc1M2MzNGI0NjM4ODE4N2RiZjc2NGQz
10
+ M2FjZGQzM2JjMWQ0ZjM3Y2FkMzc0MGU4NzlhNDE2YzA4MDhiNmQwNmY5Y2U1
11
+ OTU4MDk2NTY0ZGEwY2IxYWI0NWVhODFlODdmNDQxNTEwZWE2ZmI=
12
+ data.tar.gz: !binary |-
13
+ OTk3ZDdkY2UwZjgxOGMxZGM1MzIwN2FjOGExZTQ4NTRkZDVmYmQ2MTM3NzBm
14
+ ZGRjMDI0NTg1MmU3MWNkNDgwMTM0N2VlMzU1NTE3ZTg1MzZlNTE4M2JjZmRh
15
+ MjdkMTY1MTZlNzhkNzZhNDgzMDZhNGZiZjgyMWY1YjFhMjk5YjA=
@@ -19,7 +19,7 @@ module Spigot
19
19
  # @param service [Symbol] Service from which the data was received
20
20
  # @param api_data [Hash] The data as received from the remote api, unformatted.
21
21
  def find_all_by_api(service, api_data)
22
- find_by_translator Translator.new(service, self, api_data)
22
+ find_by_translator Translator.new(self, service, api_data)
23
23
  end
24
24
 
25
25
  ## #create_by_api(service, api_data)
@@ -29,7 +29,7 @@ module Spigot
29
29
  # @param service [Symbol] Service from which the data was received
30
30
  # @param api_data [Hash] The data as received from the remote api, unformatted.
31
31
  def create_by_api(service, api_data)
32
- create_by_translator Translator.new(service, self, api_data)
32
+ create_by_translator Translator.new(self, service, api_data)
33
33
  end
34
34
 
35
35
  ## #update_by_api(service, api_data)
@@ -40,7 +40,7 @@ module Spigot
40
40
  # @param service [Symbol] Service from which the data was received
41
41
  # @param api_data [Hash] The data as received from the remote api, unformatted.
42
42
  def update_by_api(service, api_data)
43
- babel = Translator.new(service, self, api_data)
43
+ babel = Translator.new(self, service, api_data)
44
44
  record = find_by_translator(babel).first
45
45
  update_by_translator(babel, record) if record.present?
46
46
  end
@@ -53,7 +53,7 @@ module Spigot
53
53
  # @param service [Symbol] Service from which the data was received
54
54
  # @param api_data [Hash] The data as received from the remote api, unformatted.
55
55
  def find_or_create_by_api(service, api_data)
56
- babel = Translator.new(service, self, api_data)
56
+ babel = Translator.new(self, service, api_data)
57
57
  find_by_translator(babel).first || create_by_translator(babel)
58
58
  end
59
59
 
@@ -65,7 +65,7 @@ module Spigot
65
65
  # @param service [Symbol] Service from which the data was received
66
66
  # @param api_data [Hash] The data as received from the remote api, unformatted.
67
67
  def create_or_update_by_api(service, api_data)
68
- babel = Translator.new(service, self, api_data)
68
+ babel = Translator.new(self, service, api_data)
69
69
  record = find_by_translator(babel).first
70
70
  record.present? ? update_by_translator(babel, record) : create_by_translator(babel)
71
71
  end
data/lib/spigot/base.rb CHANGED
@@ -22,7 +22,7 @@ module Spigot
22
22
  # @param service [Symbol] Service which will be doing the translating. Must have a corresponding yaml file
23
23
  # @param api_data [Hash] The data as received from the remote api, unformatted.
24
24
  def formatted_api_data(service, api_data)
25
- Translator.new(service, self, api_data).format
25
+ Translator.new(self, service, api_data).format
26
26
  end
27
27
 
28
28
  # #self.spigot
@@ -16,6 +16,10 @@
16
16
  current_map.update(name, service)
17
17
  end
18
18
 
19
+ def self.resource(name, &block)
20
+ service(:any){ resource(name, &block) }
21
+ end
22
+
19
23
  def self.find(name)
20
24
  current_map.service(name)
21
25
  end
@@ -25,9 +25,8 @@ module Spigot
25
25
  # @param service [Symbol] Service doing the translating. Must have a corresponding yaml file.
26
26
  # @param resource [Object] This is the class using the translator.
27
27
  # @param data [Hash] Data in the format received by the api (optional).
28
- def initialize(service, resource, data={})
28
+ def initialize(resource, service=nil, data={})
29
29
  @service = service
30
- raise InvalidServiceError, 'You must provide a service name' if service.nil? || service == ''
31
30
  @resource = resource.is_a?(Class) ? resource : resource.class
32
31
  raise InvalidResourceError, 'You must provide a calling resource' if resource.nil?
33
32
  @data = data || {}
@@ -103,7 +102,18 @@ module Spigot
103
102
  end
104
103
 
105
104
  def service_map
106
- Spigot.config.map ? Spigot.config.map.service(service) : {}
105
+ return {} if Spigot.config.map.nil?
106
+
107
+ @service_map = Spigot.config.map.service(service || :any)
108
+ if @service_map.nil?
109
+ if service.nil?
110
+ raise MissingResourceError, "There is no #{resource_key} resource_map"
111
+ else
112
+ raise InvalidServiceError, "No definition found for #{service}"
113
+ end
114
+ end
115
+
116
+ @service_map
107
117
  end
108
118
 
109
119
  end
@@ -1,3 +1,3 @@
1
1
  module Spigot
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -40,6 +40,45 @@ module Spigot
40
40
  end
41
41
  end
42
42
 
43
+ def self.serviceless
44
+ Spigot.define do
45
+ resource :user do
46
+ full_name :name
47
+ login :username
48
+ end
49
+ end
50
+ end
51
+
52
+ def self.multiple_serviceless
53
+ Spigot.define do
54
+ resource :user do
55
+ full_name :name
56
+ login :username
57
+ end
58
+
59
+ resource :post do
60
+ title :headline
61
+ body :body
62
+ end
63
+ end
64
+ end
65
+
66
+ def self.service_and_serviceless
67
+ Spigot.define do
68
+ resource :user do
69
+ full_name :name
70
+ login :username
71
+ end
72
+
73
+ service :github do
74
+ resource :user do
75
+ login :name
76
+ full_name :username
77
+ end
78
+ end
79
+ end
80
+ end
81
+
43
82
  def self.nested_twice
44
83
  template do
45
84
  full_name :name
data/spec/spec_helper.rb CHANGED
@@ -14,6 +14,7 @@ end
14
14
 
15
15
  # Mocked Classes
16
16
  User = Class.new(Hashie::Mash)
17
+ Post = Class.new(Hashie::Mash)
17
18
 
18
19
  class ActiveUser < ActiveRecord::Base
19
20
  include Spigot::Base
@@ -21,6 +21,15 @@ describe Spigot::Map::Base do
21
21
  subject.define
22
22
  end
23
23
 
24
+ it 'does not require a service' do
25
+ subject.define do
26
+ resource :user
27
+ end
28
+
29
+ subject.services.length.should eq(1)
30
+ subject.services.first.name.should eq(:any)
31
+ end
32
+
24
33
  it 'works with one service' do
25
34
  subject.define do
26
35
  service :github
@@ -3,27 +3,27 @@ require 'spec_helper'
3
3
  describe Spigot::Translator do
4
4
  context '#initialize' do
5
5
  before{ Spigot::Mapping::User.basic }
6
- it 'requires a service' do
6
+ it 'does not require a service' do
7
7
  expect{
8
- Spigot::Translator.new(nil, Struct)
9
- }.to raise_error(Spigot::InvalidServiceError)
8
+ Spigot::Translator.new(Struct, nil)
9
+ }.to_not raise_error(Spigot::InvalidServiceError)
10
10
  end
11
11
 
12
12
  it 'requires a resource' do
13
13
  expect{
14
- Spigot::Translator.new(:github, nil)
14
+ Spigot::Translator.new(nil, :github)
15
15
  }.to raise_error(Spigot::InvalidResourceError)
16
16
  end
17
17
 
18
18
  it 'accepts an instance or class resource' do
19
- by_class = Spigot::Translator.new(:github, User)
20
- by_instance = Spigot::Translator.new(:github, User.new)
19
+ by_class = Spigot::Translator.new(User)
20
+ by_instance = Spigot::Translator.new(User.new)
21
21
  expect(by_class.resource).to eq(by_instance.resource)
22
22
  end
23
23
  end
24
24
 
25
25
  context '.id' do
26
- let(:subject){ Spigot::Translator.new(:github, User.new, Spigot::Data::User.basic) }
26
+ let(:subject){ Spigot::Translator.new(User.new, :github, Spigot::Data::User.basic) }
27
27
  before{ Spigot::Mapping::User.basic }
28
28
  it 'returns the value at the foreign_key' do
29
29
  subject.stubs(:foreign_key).returns('id')
@@ -33,7 +33,7 @@ describe Spigot::Translator do
33
33
 
34
34
  context '.format' do
35
35
  context 'with a missing resource map' do
36
- let(:subject){ Spigot::Translator.new(:github, User.new, Spigot::Data::User.basic) }
36
+ let(:subject){ Spigot::Translator.new(User.new, :github, Spigot::Data::User.basic) }
37
37
  it 'raises error with a missing resource map' do
38
38
  expect{
39
39
  subject.format
@@ -44,7 +44,7 @@ describe Spigot::Translator do
44
44
  context 'with a valid resource map' do
45
45
  context 'with a simple map' do
46
46
  let(:data){ Spigot::Data::User.basic }
47
- let(:subject){ Spigot::Translator.new(:github, User.new, data) }
47
+ let(:subject){ Spigot::Translator.new(User.new, :github, data) }
48
48
  before{ Spigot::Mapping::User.basic }
49
49
  it 'returns empty hash from nil data' do
50
50
  subject.data = {}
@@ -58,7 +58,7 @@ describe Spigot::Translator do
58
58
 
59
59
  context 'with a nested map' do
60
60
  let(:data){ Spigot::Data::User.nested }
61
- let(:subject){ Spigot::Translator.new(:github, User.new, data) }
61
+ let(:subject){ Spigot::Translator.new(User.new, :github, data) }
62
62
  before{ Spigot::Mapping::User.nested }
63
63
 
64
64
  it 'traverses into the nested hash' do
@@ -72,7 +72,7 @@ describe Spigot::Translator do
72
72
 
73
73
  context "nested twice" do
74
74
  let(:data){Spigot::Data::User.double_nested}
75
- let(:subject){Spigot::Translator.new(:github, User.new, data)}
75
+ let(:subject){Spigot::Translator.new(User.new, :github, data)}
76
76
  before{ Spigot::Mapping::User.nested_twice }
77
77
 
78
78
  it 'traverses multiple levels' do
@@ -87,7 +87,7 @@ describe Spigot::Translator do
87
87
 
88
88
  context 'with an array of values' do
89
89
  let(:data){Spigot::Data::User.array}
90
- let(:subject){Spigot::Translator.new(:github, User.new, data)}
90
+ let(:subject){Spigot::Translator.new(User.new, :github, data)}
91
91
  before{ Spigot::Mapping::User.basic }
92
92
 
93
93
  it 'returns an array of formatted data' do
@@ -100,7 +100,7 @@ describe Spigot::Translator do
100
100
 
101
101
  context 'with a nested array of values' do
102
102
  let(:data){ Spigot::Data::User.nested_array }
103
- let(:subject){Spigot::Translator.new(:github, User.new, data)}
103
+ let(:subject){Spigot::Translator.new(User.new, :github, data)}
104
104
  before{ Spigot::Mapping::User.nested_array }
105
105
 
106
106
  it 'handles a nested array of values' do
@@ -114,7 +114,7 @@ describe Spigot::Translator do
114
114
 
115
115
  context 'with a namedspaced resource' do
116
116
  let(:data){ Spigot::Data::Post.basic }
117
- let(:subject){Spigot::Translator.new(:github, Wrapper::Post.new, data)}
117
+ let(:subject){Spigot::Translator.new(Wrapper::Post.new, :github, data)}
118
118
  before{ Spigot::Mapping::Post.basic }
119
119
 
120
120
  it 'accesses the wrapper/post key' do
@@ -127,7 +127,7 @@ describe Spigot::Translator do
127
127
 
128
128
  context 'with an interpolated value' do
129
129
  let(:data){ Spigot::Data::User.basic }
130
- let(:subject){ Spigot::Translator.new(:github, User.new, data) }
130
+ let(:subject){ Spigot::Translator.new(User.new, :github, data) }
131
131
  before{ Spigot::Mapping::User.interpolated }
132
132
  it 'reads one layer' do
133
133
  expect(subject.format).to eq({name: 'Dean Martin', username: '@classyasfuck'})
@@ -136,17 +136,55 @@ describe Spigot::Translator do
136
136
 
137
137
  context 'with a nested interpolated value' do
138
138
  let(:data){ Spigot::Data::User.nested }
139
- let(:subject){ Spigot::Translator.new(:github, User.new, data) }
139
+ let(:subject){ Spigot::Translator.new(User.new, :github, data) }
140
140
  before{ Spigot::Mapping::User.nested_interpolation }
141
141
  it 'reads one layer' do
142
142
  expect(subject.format).to eq({name: 'Dean Martin', contact: 'dino@amore.io', username: '@classyasfuck'})
143
143
  end
144
144
  end
145
+
146
+ context 'without a service' do
147
+ let(:data){ Spigot::Data::User.basic }
148
+ let(:subject){ Spigot::Translator.new(User.new, nil, data) }
149
+ before{ Spigot::Mapping::User.serviceless }
150
+ it 'reads one layer' do
151
+ expect(subject.format).to eq({name: 'Dean Martin', username: 'classyasfuck'})
152
+ end
153
+
154
+ it 'does not use the any definition with an invalid service' do
155
+ subject = Spigot::Translator.new(User.new, :github, data)
156
+ expect {
157
+ subject.format
158
+ }.to raise_error(Spigot::InvalidServiceError)
159
+ end
160
+ end
161
+
162
+ context 'multiple resources without a service' do
163
+ before{ Spigot::Mapping::User.multiple_serviceless }
164
+ it 'reads one layer' do
165
+ user = Spigot::Translator.new(User.new, nil, Spigot::Data::User.basic)
166
+ post = Spigot::Translator.new(Post.new, nil, Spigot::Data::Post.basic)
167
+
168
+ expect(user.format).to eq({name: 'Dean Martin', username: 'classyasfuck'})
169
+ expect(post.format).to eq({headline: 'Brief Article', body: 'lorem ipsum'})
170
+ end
171
+ end
172
+
173
+ context 'with and without service' do
174
+ before{ Spigot::Mapping::User.service_and_serviceless }
175
+ it 'prefers the service definition' do
176
+ service = Spigot::Translator.new(User.new, :github, Spigot::Data::User.basic)
177
+ no_service = Spigot::Translator.new(User.new, nil, Spigot::Data::User.basic)
178
+
179
+ expect(service.format).to eq({name: 'classyasfuck', username: 'Dean Martin'})
180
+ expect(no_service.format).to eq({name: 'Dean Martin', username: 'classyasfuck'})
181
+ end
182
+ end
145
183
  end
146
184
  end
147
185
 
148
186
  context '#lookup' do
149
- let(:subject){Spigot::Translator.new(:github, User.new, {a: '1'})}
187
+ let(:subject){Spigot::Translator.new(User.new, :github, {a: '1'})}
150
188
 
151
189
  it 'returns the value at a given key' do
152
190
  subject.lookup(:a).should eq('1')
@@ -155,7 +193,7 @@ describe Spigot::Translator do
155
193
 
156
194
  context '#conditions' do
157
195
  let(:data){ Spigot::Data::User.basic }
158
- let(:subject){Spigot::Translator.new(:github, User.new, data)}
196
+ let(:subject){Spigot::Translator.new(User.new, :github, data)}
159
197
 
160
198
  context 'without conditions specified' do
161
199
  before{ Spigot::Mapping::User.basic }
@@ -177,7 +215,7 @@ describe Spigot::Translator do
177
215
  end
178
216
 
179
217
  context '#options' do
180
- let(:subject){ Spigot::Translator.new(:github, User.new, {remote_id: '987'}) }
218
+ let(:subject){ Spigot::Translator.new(User.new, :github, {remote_id: '987'}) }
181
219
 
182
220
  context 'without options provided' do
183
221
  before{ Spigot::Mapping::User.basic }
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spigot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Werner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-09 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
@@ -42,84 +42,84 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ! '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ! '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: mocha
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ! '>='
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ! '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: sqlite3
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ! '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  description: Spigot provides a clean interface translating API data into context relevant
@@ -182,17 +182,17 @@ require_paths:
182
182
  - lib
183
183
  required_ruby_version: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - '>='
185
+ - - ! '>='
186
186
  - !ruby/object:Gem::Version
187
187
  version: '0'
188
188
  required_rubygems_version: !ruby/object:Gem::Requirement
189
189
  requirements:
190
- - - '>='
190
+ - - ! '>='
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
193
  requirements: []
194
194
  rubyforge_project:
195
- rubygems_version: 2.0.6
195
+ rubygems_version: 2.1.5
196
196
  signing_key:
197
197
  specification_version: 4
198
198
  summary: Spigot provides a clean interface translating API data into context relevant