amfetamine 0.2.12 → 0.3.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.
- data/CHANGELOG +5 -1
- data/README.md +25 -2
- data/amfetamine.gemspec +5 -4
- data/lib/amfetamine.rb +5 -1
- data/lib/amfetamine/relationship.rb +26 -16
- data/lib/amfetamine/relationships.rb +36 -25
- data/lib/amfetamine/version.rb +1 -1
- data/spec/amfetamine/dynamic_attributes_spec.rb +0 -9
- data/spec/amfetamine/relationships_spec.rb +85 -10
- data/spec/dummy/child.rb +0 -11
- data/spec/dummy/dummy.rb +1 -14
- data/spec/dummy/infant.rb +5 -0
- data/spec/dummy/student.rb +6 -0
- data/spec/dummy/teacher.rb +6 -0
- data/spec/helpers/id_pool.rb +12 -0
- data/spec/spec_helper.rb +17 -11
- metadata +146 -36
- data/spec/dummy/configure.rb +0 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
0.3.0
|
2
|
+
- Caching is now turned off by default in Rails development/test modes
|
3
|
+
- Add `class_name` and `foreign_key` options to relationships, which allows mapping resources to local Amfetamine classes with different names
|
4
|
+
|
1
5
|
0.2.12
|
2
6
|
- Add abillity to deactivate caching, using disable_caching= on either the config or an object.
|
3
7
|
- Starting builds against other ruby versions
|
@@ -7,7 +11,7 @@
|
|
7
11
|
- Fixed a lot of specs for travis in general
|
8
12
|
|
9
13
|
0.2.10
|
10
|
-
- Removed verbosity from tests
|
14
|
+
- Removed verbosity from tests
|
11
15
|
- Dropped support for Ruby 1.8.7
|
12
16
|
- Sourcecode is now available on github
|
13
17
|
|
data/README.md
CHANGED
@@ -86,8 +86,8 @@ Usage
|
|
86
86
|
### Relationships
|
87
87
|
|
88
88
|
```ruby
|
89
|
-
has_many_resources
|
90
|
-
belongs_to_resource
|
89
|
+
has_many_resources :children # plural object name (Symbol)
|
90
|
+
belongs_to_resource :parent # singular object name (Symbol)
|
91
91
|
|
92
92
|
parent.children.all # => Returns all nested resources, you can enumarate it with each, include? and several other helpers are available
|
93
93
|
parent.children.all(:conditions => SOMETHING) # Works as expected
|
@@ -96,6 +96,29 @@ parent.children.find(ID) # => Returns the nested child with ID
|
|
96
96
|
children.parent # => returns a Amfetamine::Relationship with only the parent
|
97
97
|
```
|
98
98
|
|
99
|
+
You can also override class name and foreign key in a relationship declaration:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
class User < Amfetamine::Base
|
103
|
+
has_many_resources :owned_companies, class_name: 'Company', foreign_key: 'owner_id'
|
104
|
+
...
|
105
|
+
```
|
106
|
+
|
107
|
+
which will result in the following query:
|
108
|
+
|
109
|
+
```
|
110
|
+
/users/:id/owned_companies.json
|
111
|
+
```
|
112
|
+
|
113
|
+
And the resulting json will be mapped to a local 'Company' class (which is
|
114
|
+
also an Amfetamine based class).
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
This also works similarly for a `belongs_to_resource` relationship.
|
119
|
+
|
120
|
+
|
121
|
+
|
99
122
|
### Querying
|
100
123
|
|
101
124
|
```ruby
|
data/amfetamine.gemspec
CHANGED
@@ -5,8 +5,8 @@ require "amfetamine/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "amfetamine"
|
7
7
|
s.version = Amfetamine::VERSION
|
8
|
-
s.authors = ["Timon Vonk"]
|
9
|
-
s.email = ["timon@exvo.com"]
|
8
|
+
s.authors = ["Timon Vonk", "Paweł Gościcki"]
|
9
|
+
s.email = ["timon@exvo.com", "pawel.goscicki@gmail.com"]
|
10
10
|
s.homepage = "http://www.github.com/exvo/amfetamine"
|
11
11
|
s.summary = %q{REST object abstraction on steroids the makes shit go boom!}
|
12
12
|
s.description = %q{Provides an interface to REST apis with objects and a cache. Zero effort!}
|
@@ -21,15 +21,16 @@ Gem::Specification.new do |s|
|
|
21
21
|
# Development dependencies
|
22
22
|
s.add_development_dependency "rspec"
|
23
23
|
s.add_development_dependency "guard"
|
24
|
+
s.add_development_dependency "guard-bundler"
|
24
25
|
s.add_development_dependency "guard-rspec"
|
25
|
-
s.add_development_dependency "
|
26
|
+
s.add_development_dependency "rb-fsevent"
|
27
|
+
s.add_development_dependency "rb-inotify"
|
26
28
|
s.add_development_dependency "httparty"
|
27
29
|
s.add_development_dependency "fakeweb"
|
28
30
|
s.add_development_dependency "simplecov"
|
29
31
|
s.add_development_dependency "simplecov-rcov"
|
30
32
|
s.add_development_dependency "pry"
|
31
33
|
|
32
|
-
|
33
34
|
# Runtime dependencies
|
34
35
|
s.add_runtime_dependency "dalli"
|
35
36
|
s.add_runtime_dependency "activesupport" # For helper methods
|
data/lib/amfetamine.rb
CHANGED
@@ -12,8 +12,12 @@ require "amfetamine/base" # Basics
|
|
12
12
|
require "amfetamine/config" # Configuration class
|
13
13
|
|
14
14
|
module Amfetamine
|
15
|
-
|
16
15
|
def self.logger
|
17
16
|
Amfetamine::Logger.instance
|
18
17
|
end
|
18
|
+
|
19
|
+
# If included in Rails, disable caching in dev/test modes
|
20
|
+
if defined?(Rails) && (Rails.env.development? || Rails.env.test?)
|
21
|
+
Amfetamine::Config.disable_caching = true
|
22
|
+
end
|
19
23
|
end
|
@@ -2,35 +2,37 @@ module Amfetamine
|
|
2
2
|
class Relationship
|
3
3
|
include Enumerable
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :on_resource_name, :on_class_name, :type, :from
|
6
6
|
|
7
7
|
def initialize(opts)
|
8
|
-
@type
|
9
|
-
@
|
10
|
-
@
|
8
|
+
@type = opts[:type]
|
9
|
+
@on_resource_name = opts[:on_resource_name] # Target resource name
|
10
|
+
@on_class_name = opts.fetch(:on_class_name) { @on_resource_name } # Target class name
|
11
|
+
@from = opts[:from] # Receiving object
|
12
|
+
@foreign_key = opts.fetch(:foreign_key) { build_foreign_key } # Foreign key
|
11
13
|
end
|
12
14
|
|
13
15
|
def << (other)
|
14
|
-
other.send("#{
|
15
|
-
other.instance_variable_set("@#{from_singular_name}", Amfetamine::Relationship.new(:
|
16
|
+
other.send("#{@foreign_key}=", @from.id)
|
17
|
+
other.instance_variable_set("@#{from_singular_name}", Amfetamine::Relationship.new(on_resource_name: @from, on_class_name: @from, foreign_key: @foreign_key, from: other, type: :belongs_to))
|
16
18
|
@children ||= [] # No need to do a request here, but it needs to be an array if it isn't yet.
|
17
19
|
@children << other
|
18
20
|
end
|
19
21
|
|
20
22
|
def on_class
|
21
|
-
if @
|
22
|
-
Amfetamine.parent.const_get(@
|
23
|
+
if @on_class_name.is_a?(Symbol) or @on_class_name.is_a?(String)
|
24
|
+
Amfetamine.parent.const_get(@on_class_name.to_s.singularize.split('/').map { |s| s.split('_').map(&:capitalize).join }.join('::'))
|
23
25
|
else
|
24
|
-
@
|
26
|
+
@on_class_name.class
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
# Id of object this relationship references
|
29
31
|
def parent_id
|
30
|
-
if @
|
31
|
-
@from.send(@
|
32
|
+
if @on_class_name.is_a?(Symbol) or @on_class_name.is_a?(String)
|
33
|
+
@from.send(@foreign_key) if @type == :belongs_to
|
32
34
|
else
|
33
|
-
@
|
35
|
+
@on_class_name.id
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -48,10 +50,10 @@ module Amfetamine
|
|
48
50
|
end
|
49
51
|
|
50
52
|
def on_plural_name
|
51
|
-
if @
|
52
|
-
@
|
53
|
+
if @on_resource_name.is_a?(Symbol) or @on_resource_name.is_a?(String)
|
54
|
+
@on_resource_name.to_s.pluralize
|
53
55
|
else
|
54
|
-
@
|
56
|
+
@on_resource_name.class.name.to_s.pluralize.downcase
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
@@ -91,11 +93,19 @@ module Amfetamine
|
|
91
93
|
on_class.find(id, {:nested_path => find_path(id)}.merge(opts))
|
92
94
|
end
|
93
95
|
|
94
|
-
|
95
96
|
def include?(other)
|
96
97
|
self.all
|
97
98
|
@children.include?(other)
|
98
99
|
end
|
99
100
|
|
101
|
+
private
|
102
|
+
|
103
|
+
def build_foreign_key
|
104
|
+
if @type == :has_many
|
105
|
+
"#{from_singular_name}_id"
|
106
|
+
elsif @type == :belongs_to
|
107
|
+
@on_class_name.to_s.downcase.gsub('/', '_') + "_id"
|
108
|
+
end
|
109
|
+
end
|
100
110
|
end
|
101
111
|
end
|
@@ -7,14 +7,20 @@ module Amfetamine
|
|
7
7
|
def initialize(args={})
|
8
8
|
#super(args)
|
9
9
|
if self.class._relationship_children
|
10
|
-
self.class._relationship_children.each do |
|
11
|
-
|
10
|
+
self.class._relationship_children.each do |rel|
|
11
|
+
resource_name = rel[:resource_name]
|
12
|
+
class_name = rel[:class_name]
|
13
|
+
foreign_key = rel[:foreign_key]
|
14
|
+
instance_variable_set("@#{resource_name}", Amfetamine::Relationship.new(on_resource_name: resource_name, on_class_name: class_name, foreign_key: foreign_key, from: self, type: :has_many))
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
15
18
|
if self.class._relationship_parents
|
16
|
-
self.class._relationship_parents.each do |
|
17
|
-
|
19
|
+
self.class._relationship_parents.each do |rel|
|
20
|
+
resource_name = rel[:resource_name]
|
21
|
+
class_name = rel[:class_name]
|
22
|
+
foreign_key = rel[:foreign_key]
|
23
|
+
instance_variable_set("@#{resource_name}", Amfetamine::Relationship.new(on_resource_name: resource_name, on_class_name: class_name, foreign_key: foreign_key, from: self, type: :belongs_to))
|
18
24
|
end
|
19
25
|
end
|
20
26
|
end
|
@@ -25,31 +31,34 @@ module Amfetamine
|
|
25
31
|
|
26
32
|
def belongs_to_relationships
|
27
33
|
if self.class._relationship_parents
|
28
|
-
self.class._relationship_parents.collect { |
|
34
|
+
self.class._relationship_parents.collect { |rel| self.send(rel[:class_name]) }
|
29
35
|
else
|
30
36
|
[]
|
31
37
|
end
|
32
38
|
end
|
33
39
|
|
34
40
|
module ClassMethods
|
35
|
-
|
41
|
+
# has_many_resources :pupils, class_name: 'Child', foreign_key: 'dummy_id'
|
42
|
+
def has_many_resources(resource_name, opts = {})
|
36
43
|
self.class_eval do
|
37
|
-
|
38
|
-
|
39
|
-
attr_reader klass
|
40
|
-
@_relationship_children << klass
|
44
|
+
class_name = opts.delete(:class_name) { resource_name }
|
45
|
+
foreign_key = opts.delete(:foreign_key) { self.name.to_s.downcase.gsub('/', '_').singularize + "_id" }
|
41
46
|
|
42
|
-
|
47
|
+
attr_reader resource_name
|
48
|
+
attr_reader class_name
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
Amfetamine.parent.const_get(klass.to_s.gsub('/', '::').singularize.gsub('_','').capitalize).new(args.merge(parent_id_field => self.id))
|
47
|
-
end
|
50
|
+
@_relationship_children ||= []
|
51
|
+
@_relationship_children << { resource_name: resource_name, class_name: class_name, foreign_key: foreign_key }
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
define_method("build_#{resource_name.to_s.downcase.gsub('/', '_').singularize}") do |*args|
|
54
|
+
args = args.shift || {}
|
55
|
+
# "my_module/my_companies" => "MyModule::MyCompany"
|
56
|
+
Amfetamine.parent.const_get(class_name.to_s.singularize.split('/').map { |s| s.split('_').map(&:capitalize).join }.join('::')).new(args.merge(foreign_key => self.id))
|
57
|
+
end
|
58
|
+
|
59
|
+
define_method("create_#{resource_name.to_s.downcase.gsub('/', '_').singularize}") do |*args|
|
60
|
+
args = args.shift || {}
|
61
|
+
Amfetamine.parent.const_get(class_name.to_s.singularize.split('/').map { |s| s.split('_').map(&:capitalize).join }.join('::')).create(args.merge(foreign_key => self.id))
|
53
62
|
end
|
54
63
|
end
|
55
64
|
end
|
@@ -58,14 +67,16 @@ module Amfetamine
|
|
58
67
|
@_relationship_children
|
59
68
|
end
|
60
69
|
|
61
|
-
def belongs_to_resource(
|
70
|
+
def belongs_to_resource(resource_name, opts = {})
|
62
71
|
self.class_eval do
|
63
|
-
|
64
|
-
|
65
|
-
attr_reader klass
|
72
|
+
class_name = opts.delete(:class_name) { resource_name }
|
73
|
+
foreign_key = opts.delete(:foreign_key) { resource_name.to_s.downcase.gsub('/', '_') + "_id" }
|
66
74
|
|
67
|
-
|
68
|
-
|
75
|
+
attr_reader resource_name
|
76
|
+
attr_reader class_name
|
77
|
+
|
78
|
+
@_relationship_parents ||= []
|
79
|
+
@_relationship_parents << { resource_name: resource_name, class_name: class_name, foreign_key: foreign_key }
|
69
80
|
end
|
70
81
|
end
|
71
82
|
|
data/lib/amfetamine/version.rb
CHANGED
@@ -2,14 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
# Let's create a new class for our experiments
|
4
4
|
class Dummy2 < Amfetamine::Base
|
5
|
-
def initialize(args={})
|
6
|
-
@@children << self
|
7
|
-
super(args)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.children
|
11
|
-
@@children ||= []
|
12
|
-
end
|
13
5
|
end
|
14
6
|
|
15
7
|
describe "Dynamic Attributes" do
|
@@ -25,4 +17,3 @@ describe "Dynamic Attributes" do
|
|
25
17
|
end
|
26
18
|
end
|
27
19
|
end
|
28
|
-
|
@@ -1,9 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Amfetamine::Relationships do
|
4
|
-
|
5
|
-
let(:child)
|
6
|
-
|
4
|
+
|
5
|
+
let(:child) { build :child }
|
6
|
+
let(:dummy) { build :dummy }
|
7
|
+
let(:infant) { build :infant }
|
8
|
+
let(:student) { build :student }
|
9
|
+
let(:teacher) { build :teacher }
|
10
|
+
|
7
11
|
context "Routing" do
|
8
12
|
it "should generate correct paths" do
|
9
13
|
dummy.children << child
|
@@ -25,13 +29,12 @@ describe Amfetamine::Relationships do
|
|
25
29
|
|
26
30
|
it "should raise error if nested path lacks parent id" do
|
27
31
|
child = Child.new({:title => 'test', :dummy_id => nil})
|
28
|
-
|
29
32
|
lambda { child.belongs_to_relationships.first.rest_path }.should raise_exception(Amfetamine::InvalidPath)
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
36
|
context "Adding and modifying children" do
|
34
|
-
before
|
37
|
+
before do
|
35
38
|
dummy.children << child
|
36
39
|
child.instance_variable_set(:@notsaved, false)
|
37
40
|
|
@@ -62,7 +65,7 @@ describe Amfetamine::Relationships do
|
|
62
65
|
r.get { dummy }
|
63
66
|
new_dummy = Dummy.find(dummy.id)
|
64
67
|
end
|
65
|
-
|
68
|
+
|
66
69
|
children = nil
|
67
70
|
Dummy.prevent_external_connections! do |r|
|
68
71
|
r.get { [child] }
|
@@ -74,16 +77,13 @@ describe Amfetamine::Relationships do
|
|
74
77
|
it "should be possible to get a single child if not in memory" do
|
75
78
|
new_dummy = Dummy.find(dummy.id)
|
76
79
|
new_child = new_dummy.children.find(child.id)
|
77
|
-
|
78
80
|
new_child.should == child
|
79
81
|
end
|
80
82
|
|
81
|
-
|
82
83
|
it "should build new child if asked" do
|
83
84
|
new_child = dummy.build_child
|
84
85
|
new_child.should be_new
|
85
86
|
new_child.should be_a(Child)
|
86
|
-
dummy.children
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should create a new child if asked" do
|
@@ -101,6 +101,81 @@ describe Amfetamine::Relationships do
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
104
|
-
end
|
105
104
|
|
105
|
+
context "has_many_resources relationship using `class_name` option" do
|
106
|
+
|
107
|
+
specify { teacher.pupils.should be_a(Amfetamine::Relationship) }
|
108
|
+
|
109
|
+
context "generates correct paths for fetching pupils" do
|
110
|
+
specify { teacher.pupils.full_path.should eql("teachers/#{ teacher.id }/pupils") }
|
111
|
+
specify { teacher.pupils.rest_path.should eql("/teachers/#{ teacher.id }/pupils") }
|
112
|
+
specify { teacher.pupils.find_path(1).should eql("/teachers/#{ teacher.id }/pupils/1") }
|
113
|
+
end
|
114
|
+
|
115
|
+
it "builds new pupils" do
|
116
|
+
new_pupil = teacher.build_pupil
|
117
|
+
new_pupil.should be_new
|
118
|
+
new_pupil.should be_a(Child)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "creates new pupils" do
|
122
|
+
attrs = { id: 1, title: 'Pupil' }
|
123
|
+
pupil = teacher.build_pupil(attrs)
|
124
|
+
|
125
|
+
Child.prevent_external_connections! do |allow|
|
126
|
+
allow.post(:code => 201) { pupil }
|
127
|
+
allow.get { [pupil] }
|
128
|
+
|
129
|
+
new_pupil = teacher.create_pupil(attrs)
|
130
|
+
new_pupil.should_not be_new
|
131
|
+
new_pupil.should be_cached
|
132
|
+
new_pupil.should be_a(Child)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
context "belongs_to_resource relationship using `class_name` option" do
|
106
139
|
|
140
|
+
specify { infant.parent.should be_a(Amfetamine::Relationship) }
|
141
|
+
|
142
|
+
context "generates correct paths for fetching parent" do
|
143
|
+
before do
|
144
|
+
dummy.children << infant
|
145
|
+
end
|
146
|
+
|
147
|
+
specify { infant.parent.full_path.should eql("parents/#{ dummy.id }/infants") }
|
148
|
+
specify { infant.parent.rest_path.should eql("/parents/#{ dummy.id }/infants") }
|
149
|
+
specify { infant.parent.find_path(1).should eql("/parents/#{ dummy.id }/infants/1") }
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
context "multiple has_many_resources relationships" do
|
155
|
+
|
156
|
+
let(:pupil) { teacher.build_pupil }
|
157
|
+
|
158
|
+
specify { pupil.should be_a(Child) }
|
159
|
+
specify { student.should be_a(Student) }
|
160
|
+
|
161
|
+
specify { teacher.pupils.rest_path.should eql("/teachers/#{ teacher.id }/pupils") }
|
162
|
+
specify { teacher.students.rest_path.should eql("/teachers/#{ teacher.id }/students") }
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
context "multiple belongs_to_resource relationships" do
|
167
|
+
|
168
|
+
before do
|
169
|
+
teacher.students << student
|
170
|
+
dummy.students << student
|
171
|
+
end
|
172
|
+
|
173
|
+
specify { teacher.students.should be_a(Amfetamine::Relationship) }
|
174
|
+
specify { dummy.students.should be_a(Amfetamine::Relationship) }
|
175
|
+
|
176
|
+
specify { teacher.students.rest_path.should eql("/teachers/#{ teacher.id }/students") }
|
177
|
+
specify { dummy.students.rest_path.should eql("/dummies/#{ dummy.id }/students") }
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
data/spec/dummy/child.rb
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
class Child < Amfetamine::Base
|
2
|
-
@@children = [] # unrelated to relationships!
|
3
2
|
attr_accessor :title, :description, :dummy_id
|
4
3
|
|
5
4
|
belongs_to_resource :dummy
|
6
|
-
|
7
|
-
def initialize(args={})
|
8
|
-
@@children << self
|
9
|
-
super(args)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.children
|
13
|
-
@@children ||= []
|
14
|
-
end
|
15
|
-
|
16
5
|
end
|
data/spec/dummy/dummy.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
class Dummy < Amfetamine::Base
|
2
|
-
@@children = [] # unrelated to relationships!
|
3
|
-
|
4
2
|
amfetamine_attributes :title, :description
|
5
3
|
validates_presence_of :title, :description
|
6
4
|
|
7
5
|
has_many_resources :children
|
6
|
+
has_many_resources :students, foreign_key: 'parent_id'
|
8
7
|
|
9
8
|
before_create :action_before_create
|
10
9
|
after_create :action_after_create
|
@@ -14,17 +13,6 @@ class Dummy < Amfetamine::Base
|
|
14
13
|
|
15
14
|
before_validation :action_before_validate
|
16
15
|
|
17
|
-
|
18
|
-
# Needed for proper ID tracking
|
19
|
-
def initialize(args={})
|
20
|
-
@@children << self
|
21
|
-
super(args)
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.children
|
25
|
-
@@children ||= []
|
26
|
-
end
|
27
|
-
|
28
16
|
def action_before_create
|
29
17
|
Amfetamine.logger.warn "Yo, BEFORE CREATE called"
|
30
18
|
end
|
@@ -41,5 +29,4 @@ class Dummy < Amfetamine::Base
|
|
41
29
|
|
42
30
|
def action_before_validate
|
43
31
|
end
|
44
|
-
|
45
32
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,24 +8,31 @@ if ENV['COVERAGE'] && (RUBY_ENGINE == "ruby")
|
|
8
8
|
end
|
9
9
|
|
10
10
|
require File.expand_path("../../lib/amfetamine.rb", __FILE__)
|
11
|
-
require 'helpers/active_model_lint'
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
# spec helpers
|
13
|
+
Dir[File.dirname(__FILE__) + '/helpers/*.rb'].each { |file| require file }
|
14
|
+
|
15
|
+
# Dummies (factories)
|
16
|
+
Dir[File.dirname(__FILE__) + '/dummy/*.rb'].each { |file| require file }
|
17
|
+
|
18
|
+
Amfetamine::Config.configure do |config|
|
19
|
+
config.memcached_instance = 'localhost:11211'
|
20
|
+
config.rest_client = DummyRestClient
|
21
|
+
end
|
17
22
|
|
18
23
|
require 'fakeweb'
|
19
24
|
require 'json'
|
20
25
|
|
21
|
-
#Fakeweb to stub server responses, still want to
|
26
|
+
# Fakeweb to stub server responses, still want to do integration tests on the rest client
|
22
27
|
FakeWeb.allow_net_connect = false
|
23
28
|
def build(object)
|
24
29
|
{
|
25
|
-
:dummy
|
26
|
-
:child
|
27
|
-
:dummy2
|
28
|
-
|
30
|
+
:dummy => lambda { Dummy.new({ :title => 'Dummy', :description => 'Crash me!', :id => IdPool.next }) },
|
31
|
+
:child => lambda { Child.new({ :title => 'Child', :description => 'Daddy!', :id => IdPool.next }) },
|
32
|
+
:dummy2 => lambda { Dummy2.new({ :title => 'Dummy2', :description => 'Daddy!', :id => IdPool.next }) },
|
33
|
+
:teacher => lambda { Teacher.new({ :name => 'Teacher', :id => IdPool.next }) },
|
34
|
+
:infant => lambda { Infant.new({ :name => 'Infant', :id => IdPool.next }) },
|
35
|
+
:student => lambda { Student.new({ :name => 'Student', :id => IdPool.next }) }
|
29
36
|
}[object].call
|
30
37
|
end
|
31
38
|
|
@@ -37,4 +44,3 @@ RSpec.configure do |config|
|
|
37
44
|
config.before(:each) { Dummy.resource_suffix = '' }
|
38
45
|
config.order = "random"
|
39
46
|
end
|
40
|
-
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amfetamine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Timon Vonk
|
9
|
+
- Paweł Gościcki
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-09-12 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rspec
|
16
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,10 +22,31 @@ dependencies:
|
|
21
22
|
version: '0'
|
22
23
|
type: :development
|
23
24
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
25
31
|
- !ruby/object:Gem::Dependency
|
26
32
|
name: guard
|
27
|
-
requirement:
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: guard-bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
28
50
|
none: false
|
29
51
|
requirements:
|
30
52
|
- - ! '>='
|
@@ -32,10 +54,31 @@ dependencies:
|
|
32
54
|
version: '0'
|
33
55
|
type: :development
|
34
56
|
prerelease: false
|
35
|
-
version_requirements:
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
36
63
|
- !ruby/object:Gem::Dependency
|
37
64
|
name: guard-rspec
|
38
|
-
requirement:
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rb-fsevent
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
39
82
|
none: false
|
40
83
|
requirements:
|
41
84
|
- - ! '>='
|
@@ -43,10 +86,15 @@ dependencies:
|
|
43
86
|
version: '0'
|
44
87
|
type: :development
|
45
88
|
prerelease: false
|
46
|
-
version_requirements:
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
47
95
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement:
|
96
|
+
name: rb-inotify
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
50
98
|
none: false
|
51
99
|
requirements:
|
52
100
|
- - ! '>='
|
@@ -54,10 +102,15 @@ dependencies:
|
|
54
102
|
version: '0'
|
55
103
|
type: :development
|
56
104
|
prerelease: false
|
57
|
-
version_requirements:
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
58
111
|
- !ruby/object:Gem::Dependency
|
59
112
|
name: httparty
|
60
|
-
requirement:
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
61
114
|
none: false
|
62
115
|
requirements:
|
63
116
|
- - ! '>='
|
@@ -65,10 +118,15 @@ dependencies:
|
|
65
118
|
version: '0'
|
66
119
|
type: :development
|
67
120
|
prerelease: false
|
68
|
-
version_requirements:
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
69
127
|
- !ruby/object:Gem::Dependency
|
70
128
|
name: fakeweb
|
71
|
-
requirement:
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
72
130
|
none: false
|
73
131
|
requirements:
|
74
132
|
- - ! '>='
|
@@ -76,10 +134,15 @@ dependencies:
|
|
76
134
|
version: '0'
|
77
135
|
type: :development
|
78
136
|
prerelease: false
|
79
|
-
version_requirements:
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
80
143
|
- !ruby/object:Gem::Dependency
|
81
144
|
name: simplecov
|
82
|
-
requirement:
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
83
146
|
none: false
|
84
147
|
requirements:
|
85
148
|
- - ! '>='
|
@@ -87,10 +150,15 @@ dependencies:
|
|
87
150
|
version: '0'
|
88
151
|
type: :development
|
89
152
|
prerelease: false
|
90
|
-
version_requirements:
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
91
159
|
- !ruby/object:Gem::Dependency
|
92
160
|
name: simplecov-rcov
|
93
|
-
requirement:
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
94
162
|
none: false
|
95
163
|
requirements:
|
96
164
|
- - ! '>='
|
@@ -98,10 +166,15 @@ dependencies:
|
|
98
166
|
version: '0'
|
99
167
|
type: :development
|
100
168
|
prerelease: false
|
101
|
-
version_requirements:
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
102
175
|
- !ruby/object:Gem::Dependency
|
103
176
|
name: pry
|
104
|
-
requirement:
|
177
|
+
requirement: !ruby/object:Gem::Requirement
|
105
178
|
none: false
|
106
179
|
requirements:
|
107
180
|
- - ! '>='
|
@@ -109,10 +182,15 @@ dependencies:
|
|
109
182
|
version: '0'
|
110
183
|
type: :development
|
111
184
|
prerelease: false
|
112
|
-
version_requirements:
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
none: false
|
187
|
+
requirements:
|
188
|
+
- - ! '>='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
113
191
|
- !ruby/object:Gem::Dependency
|
114
192
|
name: dalli
|
115
|
-
requirement:
|
193
|
+
requirement: !ruby/object:Gem::Requirement
|
116
194
|
none: false
|
117
195
|
requirements:
|
118
196
|
- - ! '>='
|
@@ -120,10 +198,15 @@ dependencies:
|
|
120
198
|
version: '0'
|
121
199
|
type: :runtime
|
122
200
|
prerelease: false
|
123
|
-
version_requirements:
|
201
|
+
version_requirements: !ruby/object:Gem::Requirement
|
202
|
+
none: false
|
203
|
+
requirements:
|
204
|
+
- - ! '>='
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
version: '0'
|
124
207
|
- !ruby/object:Gem::Dependency
|
125
208
|
name: activesupport
|
126
|
-
requirement:
|
209
|
+
requirement: !ruby/object:Gem::Requirement
|
127
210
|
none: false
|
128
211
|
requirements:
|
129
212
|
- - ! '>='
|
@@ -131,10 +214,15 @@ dependencies:
|
|
131
214
|
version: '0'
|
132
215
|
type: :runtime
|
133
216
|
prerelease: false
|
134
|
-
version_requirements:
|
217
|
+
version_requirements: !ruby/object:Gem::Requirement
|
218
|
+
none: false
|
219
|
+
requirements:
|
220
|
+
- - ! '>='
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
135
223
|
- !ruby/object:Gem::Dependency
|
136
224
|
name: activemodel
|
137
|
-
requirement:
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
138
226
|
none: false
|
139
227
|
requirements:
|
140
228
|
- - ! '>='
|
@@ -142,10 +230,15 @@ dependencies:
|
|
142
230
|
version: '0'
|
143
231
|
type: :runtime
|
144
232
|
prerelease: false
|
145
|
-
version_requirements:
|
233
|
+
version_requirements: !ruby/object:Gem::Requirement
|
234
|
+
none: false
|
235
|
+
requirements:
|
236
|
+
- - ! '>='
|
237
|
+
- !ruby/object:Gem::Version
|
238
|
+
version: '0'
|
146
239
|
- !ruby/object:Gem::Dependency
|
147
240
|
name: json
|
148
|
-
requirement:
|
241
|
+
requirement: !ruby/object:Gem::Requirement
|
149
242
|
none: false
|
150
243
|
requirements:
|
151
244
|
- - ! '>='
|
@@ -153,10 +246,15 @@ dependencies:
|
|
153
246
|
version: '0'
|
154
247
|
type: :runtime
|
155
248
|
prerelease: false
|
156
|
-
version_requirements:
|
249
|
+
version_requirements: !ruby/object:Gem::Requirement
|
250
|
+
none: false
|
251
|
+
requirements:
|
252
|
+
- - ! '>='
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: '0'
|
157
255
|
- !ruby/object:Gem::Dependency
|
158
256
|
name: rake
|
159
|
-
requirement:
|
257
|
+
requirement: !ruby/object:Gem::Requirement
|
160
258
|
none: false
|
161
259
|
requirements:
|
162
260
|
- - ! '>='
|
@@ -164,10 +262,16 @@ dependencies:
|
|
164
262
|
version: '0'
|
165
263
|
type: :runtime
|
166
264
|
prerelease: false
|
167
|
-
version_requirements:
|
265
|
+
version_requirements: !ruby/object:Gem::Requirement
|
266
|
+
none: false
|
267
|
+
requirements:
|
268
|
+
- - ! '>='
|
269
|
+
- !ruby/object:Gem::Version
|
270
|
+
version: '0'
|
168
271
|
description: Provides an interface to REST apis with objects and a cache. Zero effort!
|
169
272
|
email:
|
170
273
|
- timon@exvo.com
|
274
|
+
- pawel.goscicki@gmail.com
|
171
275
|
executables: []
|
172
276
|
extensions: []
|
173
277
|
extra_rdoc_files: []
|
@@ -207,10 +311,13 @@ files:
|
|
207
311
|
- spec/amfetamine/rspec_matchers_spec.rb
|
208
312
|
- spec/amfetamine/testing_helpers_spec.rb
|
209
313
|
- spec/dummy/child.rb
|
210
|
-
- spec/dummy/configure.rb
|
211
314
|
- spec/dummy/dummy.rb
|
212
315
|
- spec/dummy/dummy_rest_client.rb
|
316
|
+
- spec/dummy/infant.rb
|
317
|
+
- spec/dummy/student.rb
|
318
|
+
- spec/dummy/teacher.rb
|
213
319
|
- spec/helpers/active_model_lint.rb
|
320
|
+
- spec/helpers/id_pool.rb
|
214
321
|
- spec/spec_helper.rb
|
215
322
|
homepage: http://www.github.com/exvo/amfetamine
|
216
323
|
licenses: []
|
@@ -226,7 +333,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
226
333
|
version: '0'
|
227
334
|
segments:
|
228
335
|
- 0
|
229
|
-
hash:
|
336
|
+
hash: 4163932578961634705
|
230
337
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
338
|
none: false
|
232
339
|
requirements:
|
@@ -235,10 +342,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
342
|
version: '0'
|
236
343
|
segments:
|
237
344
|
- 0
|
238
|
-
hash:
|
345
|
+
hash: 4163932578961634705
|
239
346
|
requirements: []
|
240
347
|
rubyforge_project: amfetamine
|
241
|
-
rubygems_version: 1.8.
|
348
|
+
rubygems_version: 1.8.24
|
242
349
|
signing_key:
|
243
350
|
specification_version: 3
|
244
351
|
summary: REST object abstraction on steroids the makes shit go boom!
|
@@ -254,8 +361,11 @@ test_files:
|
|
254
361
|
- spec/amfetamine/rspec_matchers_spec.rb
|
255
362
|
- spec/amfetamine/testing_helpers_spec.rb
|
256
363
|
- spec/dummy/child.rb
|
257
|
-
- spec/dummy/configure.rb
|
258
364
|
- spec/dummy/dummy.rb
|
259
365
|
- spec/dummy/dummy_rest_client.rb
|
366
|
+
- spec/dummy/infant.rb
|
367
|
+
- spec/dummy/student.rb
|
368
|
+
- spec/dummy/teacher.rb
|
260
369
|
- spec/helpers/active_model_lint.rb
|
370
|
+
- spec/helpers/id_pool.rb
|
261
371
|
- spec/spec_helper.rb
|
data/spec/dummy/configure.rb
DELETED