spigot 0.1.0 → 0.2.0
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +25 -32
- data/Rakefile +6 -0
- data/examples/active_record.rb +18 -15
- data/examples/model.rb +38 -7
- data/lib/spigot.rb +18 -6
- data/lib/spigot/configuration.rb +4 -5
- data/lib/spigot/map/base.rb +44 -0
- data/lib/spigot/map/definition.rb +69 -0
- data/lib/spigot/map/option.rb +27 -0
- data/lib/spigot/map/resource.rb +37 -0
- data/lib/spigot/map/service.rb +43 -0
- data/lib/spigot/patch.rb +1 -1
- data/lib/spigot/proxy.rb +3 -2
- data/lib/spigot/translator.rb +22 -71
- data/lib/spigot/version.rb +1 -1
- data/script/console.rb +26 -20
- data/spec/fixtures/data/active_user.rb +17 -0
- data/spec/fixtures/data/post.rb +15 -0
- data/spec/fixtures/data/user.rb +41 -0
- data/spec/fixtures/mappings/active_user_map.rb +58 -22
- data/spec/fixtures/mappings/post_map.rb +10 -10
- data/spec/fixtures/mappings/user_map.rb +73 -29
- data/spec/spec_helper.rb +3 -12
- data/spec/spigot/active_record_spec.rb +34 -26
- data/spec/spigot/base_spec.rb +32 -1
- data/spec/spigot/configuration_spec.rb +0 -27
- data/spec/spigot/map/base_spec.rb +70 -0
- data/spec/spigot/map/definition_spec.rb +45 -0
- data/spec/spigot/map/resource_spec.rb +57 -0
- data/spec/spigot/map/service_spec.rb +88 -0
- data/spec/spigot/translator_spec.rb +110 -113
- data/spigot.gemspec +3 -2
- metadata +43 -20
- data/examples/.DS_Store +0 -0
- data/lib/.DS_Store +0 -0
- data/lib/spigot/config/.DS_Store +0 -0
- data/spec/.DS_Store +0 -0
- data/spec/fixtures/.DS_Store +0 -0
- data/spec/fixtures/api_data.rb +0 -46
- data/spec/spigot/factory_spec.rb +0 -5
@@ -1,22 +1,22 @@
|
|
1
1
|
module Spigot
|
2
2
|
module Mapping
|
3
|
-
|
4
3
|
class Post
|
5
4
|
|
5
|
+
|
6
6
|
def self.basic
|
7
|
-
{'post' => base}
|
8
|
-
end
|
9
7
|
|
10
|
-
|
11
|
-
|
8
|
+
Spigot.define do
|
9
|
+
service :github do
|
10
|
+
resource 'wrapper/post' do
|
11
|
+
title :title
|
12
|
+
body :description
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
12
17
|
end
|
13
18
|
|
14
|
-
private
|
15
19
|
|
16
|
-
def self.base
|
17
|
-
{'title' => 'title', 'body' => 'description'}
|
18
|
-
end
|
19
20
|
end
|
20
|
-
|
21
21
|
end
|
22
22
|
end
|
@@ -1,59 +1,103 @@
|
|
1
1
|
module Spigot
|
2
2
|
module Mapping
|
3
|
-
|
4
3
|
class User
|
4
|
+
|
5
5
|
def self.basic
|
6
|
-
|
6
|
+
template do
|
7
|
+
full_name :name
|
8
|
+
login :username
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
|
-
def self.
|
10
|
-
|
12
|
+
def self.interpolated
|
13
|
+
template do
|
14
|
+
full_name :name
|
15
|
+
login :username do |value|
|
16
|
+
"@#{value}"
|
17
|
+
end
|
18
|
+
end
|
11
19
|
end
|
12
20
|
|
13
|
-
def self.
|
14
|
-
|
21
|
+
def self.nested_interpolation
|
22
|
+
template do
|
23
|
+
full_name :name
|
24
|
+
login do
|
25
|
+
email :contact
|
26
|
+
user_name :username do |value|
|
27
|
+
"@#{value}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
15
31
|
end
|
16
32
|
|
17
|
-
def self.
|
18
|
-
|
19
|
-
|
20
|
-
|
33
|
+
def self.nested
|
34
|
+
template do
|
35
|
+
full_name :name
|
36
|
+
login do
|
37
|
+
email :contact
|
38
|
+
user_name :username
|
39
|
+
end
|
40
|
+
end
|
21
41
|
end
|
22
42
|
|
23
|
-
def self.
|
24
|
-
|
43
|
+
def self.nested_twice
|
44
|
+
template do
|
45
|
+
full_name :name
|
46
|
+
login do
|
47
|
+
last_seen_ip :ip
|
48
|
+
contact do
|
49
|
+
email :contact
|
50
|
+
user_name :username
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
25
54
|
end
|
26
55
|
|
27
56
|
def self.nested_array
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
57
|
+
template do
|
58
|
+
account :name
|
59
|
+
count :user_count
|
60
|
+
users do
|
61
|
+
full_name :name
|
62
|
+
login :username
|
63
|
+
end
|
64
|
+
end
|
33
65
|
end
|
34
66
|
|
35
67
|
def self.with_options
|
36
|
-
|
68
|
+
template do
|
69
|
+
full_name :name
|
70
|
+
login :username
|
71
|
+
options do
|
72
|
+
primary_key :username
|
73
|
+
foreign_key :login
|
74
|
+
end
|
75
|
+
end
|
37
76
|
end
|
38
77
|
|
39
78
|
def self.with_conditions
|
40
|
-
|
79
|
+
template do
|
80
|
+
full_name :name
|
81
|
+
login :username
|
82
|
+
options do
|
83
|
+
primary_key :username
|
84
|
+
foreign_key :login
|
85
|
+
end
|
86
|
+
end
|
41
87
|
end
|
42
88
|
|
43
89
|
private
|
44
90
|
|
45
|
-
def self.
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
91
|
+
def self.template(&block)
|
92
|
+
Spigot.define do
|
93
|
+
service :github do
|
94
|
+
resource :user do
|
95
|
+
self.instance_eval(&block)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
51
99
|
end
|
52
100
|
|
53
|
-
def self.conditions
|
54
|
-
{'conditions' => 'username, name'}
|
55
|
-
end
|
56
101
|
end
|
57
|
-
|
58
102
|
end
|
59
103
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
1
4
|
require 'rspec'
|
2
5
|
require 'spigot'
|
3
6
|
require 'hashie'
|
@@ -20,18 +23,6 @@ module Wrapper
|
|
20
23
|
Post = Class.new(Hashie::Mash)
|
21
24
|
end
|
22
25
|
|
23
|
-
def with_mapping(name, map)
|
24
|
-
before do
|
25
|
-
instance_variable_set("@prior_#{name}".to_sym, Spigot.config.translations)
|
26
|
-
Spigot.configure{|c| c.translations = map }
|
27
|
-
end
|
28
|
-
|
29
|
-
after do
|
30
|
-
map_cache = instance_variable_get("@prior_#{name}".to_sym)
|
31
|
-
Spigot.configure{|c| c.translations = map_cache }
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
26
|
RSpec.configure do |config|
|
36
27
|
config.after(:each) do
|
37
28
|
ActiveUser.delete_all
|
@@ -2,48 +2,46 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Spigot::ActiveRecord do
|
4
4
|
let(:subject){ActiveUser}
|
5
|
-
let(:
|
6
|
-
let(:
|
5
|
+
let(:data){ Spigot::Data::ActiveUser.basic.merge(id: '987') }
|
6
|
+
let(:user){ subject.create(name: 'Dean Martin', username: 'classyasfuck') }
|
7
7
|
|
8
8
|
context 'with invalid mapping' do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
expect {
|
14
|
-
subject.find_by_api(service, {full_name: 'Dean Martin'}).should_not be_nil
|
15
|
-
}.to raise_error(Spigot::InvalidSchemaError)
|
16
|
-
end
|
9
|
+
it 'requires the primary key to be accurate' do
|
10
|
+
expect {
|
11
|
+
subject.find_by_api(:github, {full_name: 'Dean Martin'})
|
12
|
+
}.to raise_error(Spigot::MissingResourceError)
|
17
13
|
end
|
18
14
|
end
|
19
15
|
|
20
16
|
context 'with valid mapping' do
|
21
|
-
with_mapping(:active_user_with_options, Spigot::Mapping::ActiveUser.with_options)
|
22
|
-
let(:user){ subject.create(name: 'Dean Martin', username: 'classyasfuck') }
|
23
|
-
|
24
17
|
context '#find_by_api' do
|
25
|
-
before
|
18
|
+
before do
|
19
|
+
user
|
20
|
+
Spigot::Mapping::ActiveUser.with_options
|
21
|
+
end
|
26
22
|
|
27
23
|
it 'queries by the specified primary_key' do
|
28
|
-
subject.find_by_api(
|
24
|
+
subject.find_by_api(:github, data).should eq(user)
|
29
25
|
end
|
30
26
|
end
|
31
27
|
|
32
28
|
context '#find_all_by_api' do
|
33
|
-
with_mapping(:non_unique_key, Spigot::Mapping::ActiveUser.non_unique_key)
|
34
29
|
before do
|
30
|
+
Spigot::Mapping::ActiveUser.non_unique_keys
|
35
31
|
user.update_attribute(:token, '123abc')
|
36
32
|
subject.create(name: 'Frank Sinatra', username: 'livetilidie', token: '123abc')
|
37
33
|
end
|
38
34
|
|
39
35
|
it 'returns all records matching primary key' do
|
40
|
-
subject.find_all_by_api(
|
36
|
+
subject.find_all_by_api(:github, data).length.should eq(2)
|
41
37
|
end
|
42
38
|
end
|
43
39
|
|
44
40
|
context '#create_by_api' do
|
41
|
+
before{ Spigot::Mapping::ActiveUser.with_options }
|
45
42
|
it 'creates a record' do
|
46
|
-
record = subject.create_by_api(
|
43
|
+
record = subject.create_by_api(:github, data)
|
44
|
+
record.id.should_not be_nil
|
47
45
|
record.name.should eq('Dean Martin')
|
48
46
|
record.username.should eq('classyasfuck')
|
49
47
|
record.token.should be_nil
|
@@ -51,22 +49,29 @@ describe Spigot::ActiveRecord do
|
|
51
49
|
end
|
52
50
|
|
53
51
|
context '#update_by_api' do
|
54
|
-
before
|
52
|
+
before do
|
53
|
+
user
|
54
|
+
Spigot::Mapping::ActiveUser.with_options
|
55
|
+
end
|
56
|
+
|
55
57
|
it 'updates a record' do
|
56
|
-
record = subject.update_by_api(
|
58
|
+
record = subject.update_by_api(:github, data.merge(full_name: 'Dino Baby'))
|
57
59
|
record.name.should eq('Dino Baby')
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
61
63
|
context '#find_or_create_by_api' do
|
62
|
-
before
|
64
|
+
before do
|
65
|
+
user
|
66
|
+
Spigot::Mapping::ActiveUser.with_options
|
67
|
+
end
|
63
68
|
it 'returns an existing record' do
|
64
|
-
record = subject.find_or_create_by_api(
|
69
|
+
record = subject.find_or_create_by_api(:github, data)
|
65
70
|
record.id.should eq(user.id)
|
66
71
|
end
|
67
72
|
|
68
73
|
it 'creates a record when none exists' do
|
69
|
-
record = subject.find_or_create_by_api(
|
74
|
+
record = subject.find_or_create_by_api(:github, Spigot::Data::ActiveUser.alt)
|
70
75
|
record.id.should_not eq(user.id)
|
71
76
|
record.name.should eq('Frank Sinatra')
|
72
77
|
record.username.should eq('livetilidie')
|
@@ -74,17 +79,20 @@ describe Spigot::ActiveRecord do
|
|
74
79
|
end
|
75
80
|
|
76
81
|
context '#create_or_update_by_api' do
|
77
|
-
before
|
82
|
+
before do
|
83
|
+
user
|
84
|
+
Spigot::Mapping::ActiveUser.with_options
|
85
|
+
end
|
78
86
|
|
79
87
|
it 'updates an existing record' do
|
80
|
-
record = subject.create_or_update_by_api(
|
88
|
+
record = subject.create_or_update_by_api(:github, data.merge(full_name: 'Dino Baby'))
|
81
89
|
record.id.should eq(user.id)
|
82
90
|
record.name.should eq('Dino Baby')
|
83
91
|
record.username.should eq('classyasfuck')
|
84
92
|
end
|
85
93
|
|
86
94
|
it 'creates a record when none exists' do
|
87
|
-
record = subject.create_or_update_by_api(
|
95
|
+
record = subject.create_or_update_by_api(:github, Spigot::Data::ActiveUser.alt)
|
88
96
|
record.id.should_not eq(user.id)
|
89
97
|
record.name.should eq('Frank Sinatra')
|
90
98
|
record.username.should eq('livetilidie')
|
data/spec/spigot/base_spec.rb
CHANGED
@@ -1,7 +1,38 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Spigot::Base do
|
4
|
+
let(:data){Spigot::Data::User.basic}
|
5
|
+
before{ Spigot::Mapping::ActiveUser.stub }
|
4
6
|
|
5
|
-
|
7
|
+
context '#new_by_api' do
|
8
|
+
it 'instantiates a record' do
|
9
|
+
Spigot::Record.should_receive(:instantiate)
|
10
|
+
ActiveUser.new_by_api(:github, data)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#formatted_api_data' do
|
15
|
+
it 'calls format on the translator' do
|
16
|
+
Spigot::Translator.any_instance.should_receive(:format)
|
17
|
+
ActiveUser.formatted_api_data(:github, data)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns formatted data' do
|
21
|
+
Spigot::Translator.any_instance.should_receive(:format)
|
22
|
+
formatted = ActiveUser.formatted_api_data(:github, data)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context '#spigot' do
|
27
|
+
it 'returns a spigot proxy' do
|
28
|
+
ActiveUser.spigot(:github).should be_a_kind_of(Spigot::Proxy)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'requires a valid service' do
|
32
|
+
expect{
|
33
|
+
ActiveUser.spigot(:invalid)
|
34
|
+
}.to raise_error(Spigot::MissingServiceError)
|
35
|
+
end
|
36
|
+
end
|
6
37
|
|
7
38
|
end
|
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Spigot::Configuration do
|
4
|
-
before do
|
5
|
-
@prior_translations = Spigot.config.translations
|
6
|
-
end
|
7
|
-
|
8
|
-
after do
|
9
|
-
Spigot.configure{|c| c.translations = @prior_translations }
|
10
|
-
end
|
11
|
-
|
12
4
|
context 'defaults' do
|
13
5
|
it 'is a hash of default configuration' do
|
14
6
|
expect(Spigot::Configuration.defaults).to be_kind_of(Hash)
|
@@ -16,14 +8,6 @@ describe Spigot::Configuration do
|
|
16
8
|
end
|
17
9
|
|
18
10
|
context 'access' do
|
19
|
-
before do
|
20
|
-
@previous_path = Spigot.config.path
|
21
|
-
end
|
22
|
-
|
23
|
-
after do
|
24
|
-
Spigot.configure{|config| config.path = @previous_path }
|
25
|
-
end
|
26
|
-
|
27
11
|
it "is callable from .configure" do
|
28
12
|
Spigot.configure do |c|
|
29
13
|
expect(c).to be_kind_of(Spigot::Configuration)
|
@@ -31,20 +15,9 @@ describe Spigot::Configuration do
|
|
31
15
|
end
|
32
16
|
|
33
17
|
context 'options' do
|
34
|
-
let(:path){'/baller'}
|
35
18
|
let(:map){{'user' => {a: 1}}}
|
36
19
|
let(:options_key){'my_special_key'}
|
37
20
|
|
38
|
-
it "is able to set the path" do
|
39
|
-
Spigot.configure{|config| config.path = path }
|
40
|
-
expect(Spigot.config.path).to eq(path)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "is able to set translations" do
|
44
|
-
Spigot.configure{|config| config.translations = map }
|
45
|
-
expect(Spigot.config.translations).to eq(map)
|
46
|
-
end
|
47
|
-
|
48
21
|
it "is able to set the options_key" do
|
49
22
|
Spigot.configure{|config| config.options_key = options_key }
|
50
23
|
expect(Spigot.config.options_key).to eq(options_key)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spigot::Map::Base do
|
4
|
+
let(:subject){Spigot::Map::Base.new}
|
5
|
+
let(:service){Spigot::Map::Service.new(:github)}
|
6
|
+
|
7
|
+
context '#initialize' do
|
8
|
+
it 'initializes a services array' do
|
9
|
+
subject.services.should eq([])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context '.define' do
|
14
|
+
it 'accepts a block' do
|
15
|
+
Spigot::Map::Service.should_receive(:class_eval)
|
16
|
+
subject.define{'foo'}
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'does not require a block' do
|
20
|
+
Spigot::Map::Service.should_not_receive(:class_eval)
|
21
|
+
subject.define
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'works with one service' do
|
25
|
+
subject.define do
|
26
|
+
service :github
|
27
|
+
end
|
28
|
+
|
29
|
+
subject.services.length.should eq(1)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'allows multiple services' do
|
33
|
+
subject.define do
|
34
|
+
service :github
|
35
|
+
service :twitter
|
36
|
+
end
|
37
|
+
|
38
|
+
subject.services.length.should eq(2)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'allows multiple updates' do
|
42
|
+
subject.define{ service(:github) }
|
43
|
+
subject.define{ service(:twitter) }
|
44
|
+
|
45
|
+
subject.services.length.should eq(2)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context '.reset' do
|
50
|
+
it 'resets services' do
|
51
|
+
subject.reset
|
52
|
+
subject.services.should eq([])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context '.service' do
|
57
|
+
it 'finds an existing service' do
|
58
|
+
subject.update(:github, service)
|
59
|
+
subject.service(:github).should eq(service)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context '.to_hash' do
|
64
|
+
it 'returns a hash of current services' do
|
65
|
+
subject.update(:github, service)
|
66
|
+
subject.to_hash.should eq({github: {}})
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|