spigot 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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