ampere 0.1.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/.document +5 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +51 -0
- data/LICENSE.txt +70 -0
- data/README.md +89 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/features/ampere.feature +9 -0
- data/features/step_definitions/ampere_steps.rb +0 -0
- data/features/support/env.rb +15 -0
- data/lib/ampere.rb +26 -0
- data/lib/ampere/collection.rb +71 -0
- data/lib/ampere/model.rb +315 -0
- data/spec/models/indices_spec.rb +141 -0
- data/spec/models/model_spec.rb +208 -0
- data/spec/models/queries_spec.rb +97 -0
- data/spec/models/relationships/belongs_to_spec.rb +100 -0
- data/spec/models/relationships/has_many_spec.rb +71 -0
- data/spec/models/relationships/has_one_spec.rb +75 -0
- data/spec/models/updates_spec.rb +62 -0
- data/spec/module/ampere_spec.rb +26 -0
- data/spec/module/collections_spec.rb +71 -0
- data/spec/spec_helper.rb +20 -0
- data/test/helper.rb +18 -0
- data/test/test_ampere.rb +7 -0
- metadata +166 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
|
2
|
+
|
3
|
+
describe 'has_many relationships', :has_many => true do
|
4
|
+
before :each do
|
5
|
+
Redis.new.flushall
|
6
|
+
Ampere.connect
|
7
|
+
|
8
|
+
# These are used by the has_one/belongs_to example below
|
9
|
+
class Car < Ampere::Model
|
10
|
+
field :make
|
11
|
+
field :model
|
12
|
+
field :year
|
13
|
+
|
14
|
+
has_many :passengers
|
15
|
+
end
|
16
|
+
|
17
|
+
class Passenger < Ampere::Model
|
18
|
+
field :name
|
19
|
+
field :seat
|
20
|
+
|
21
|
+
belongs_to :car
|
22
|
+
end
|
23
|
+
|
24
|
+
@car = Car.create :make => "Lamborghini",
|
25
|
+
:model => "Countach",
|
26
|
+
:year => "1974"
|
27
|
+
@driver = Passenger.create :name => "Max",
|
28
|
+
:seat => "driver"
|
29
|
+
@passenger = Passenger.create :name => "Leila",
|
30
|
+
:seat => "passenger"
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
###
|
35
|
+
|
36
|
+
it 'should define the necessary methods for has_many relationships' do
|
37
|
+
# Attr accessors
|
38
|
+
@car.should respond_to(:passengers)
|
39
|
+
@car.should respond_to(:"passengers=")
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should be able to add items to has_many relationships' do
|
43
|
+
@car.passengers = @car.passengers + [@driver]
|
44
|
+
@car.passengers = @car.passengers + [@passenger]
|
45
|
+
|
46
|
+
@car.save
|
47
|
+
@car.reload
|
48
|
+
|
49
|
+
@driver.reload
|
50
|
+
@passenger.reload
|
51
|
+
|
52
|
+
@car.passengers.should include(@driver)
|
53
|
+
@car.passengers.should include(@passenger)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should be able to remove items from has_many relationships' do
|
57
|
+
pending
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should be able to query has_many relationships' do
|
61
|
+
pending
|
62
|
+
end
|
63
|
+
|
64
|
+
###
|
65
|
+
|
66
|
+
after :all do
|
67
|
+
Ampere.disconnect
|
68
|
+
Redis.new.flushall
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
|
2
|
+
|
3
|
+
describe 'has_one relationships' do
|
4
|
+
before :all do
|
5
|
+
Redis.new.flushall
|
6
|
+
Ampere.connect
|
7
|
+
|
8
|
+
# These are used by the has_one/belongs_to example below
|
9
|
+
class Car < Ampere::Model
|
10
|
+
field :make
|
11
|
+
field :model
|
12
|
+
field :year
|
13
|
+
|
14
|
+
has_one :engine
|
15
|
+
end
|
16
|
+
|
17
|
+
class Engine < Ampere::Model
|
18
|
+
field :displacement
|
19
|
+
field :cylinders
|
20
|
+
field :configuration
|
21
|
+
|
22
|
+
belongs_to :car
|
23
|
+
end
|
24
|
+
|
25
|
+
@car = Car.create :make => "Lamborghini",
|
26
|
+
:model => "Countach",
|
27
|
+
:year => "1974"
|
28
|
+
@engine = Engine.create :displacement => "5167",
|
29
|
+
:cylinders => "12",
|
30
|
+
:configuration => "V"
|
31
|
+
end
|
32
|
+
|
33
|
+
###
|
34
|
+
|
35
|
+
it 'can store a relationship to one model instance from another using an attr_accessor' do
|
36
|
+
@car.engine_id = @engine.id
|
37
|
+
@car.save
|
38
|
+
@car.reload
|
39
|
+
@engine.reload
|
40
|
+
@car.engine_id.should == @engine.id
|
41
|
+
@car.engine.should == @engine
|
42
|
+
|
43
|
+
@car.engine_id = nil
|
44
|
+
@car.save
|
45
|
+
@car.engine.should be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'can store a relationship to one model instance from another using custom accessor methods' do
|
49
|
+
@car.engine = @engine
|
50
|
+
@car.save
|
51
|
+
@car.reload
|
52
|
+
@engine.reload
|
53
|
+
@car.engine_id.should == @engine.id
|
54
|
+
@car.engine.should == @engine
|
55
|
+
|
56
|
+
@car.engine_id = nil
|
57
|
+
@car.save
|
58
|
+
@car.engine.should be_nil
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'can delete the object related to it in a has_one relationship' do
|
62
|
+
@car.engine = @engine
|
63
|
+
@car.engine.destroy
|
64
|
+
@car.reload
|
65
|
+
@car.engine.should be_nil
|
66
|
+
Engine.find(@engine.id).should be_nil
|
67
|
+
end
|
68
|
+
|
69
|
+
###
|
70
|
+
|
71
|
+
after :all do
|
72
|
+
Ampere.disconnect
|
73
|
+
Redis.new.flushall
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
|
2
|
+
|
3
|
+
describe 'queries', :queries => true do
|
4
|
+
before :each do
|
5
|
+
Redis.new.flushall
|
6
|
+
Ampere.connect
|
7
|
+
|
8
|
+
class Motorcycle < Ampere::Model
|
9
|
+
field :make
|
10
|
+
field :model
|
11
|
+
field :year
|
12
|
+
end
|
13
|
+
|
14
|
+
@bike = Motorcycle.create make: "Honda", model: "CB400", year: "1990"
|
15
|
+
end
|
16
|
+
|
17
|
+
###
|
18
|
+
|
19
|
+
it 'should be able to update one field atomically' do
|
20
|
+
@bike.model.should == "CB400"
|
21
|
+
@bike.update_attribute :model, "CB450SC"
|
22
|
+
@bike.model.should == "CB450SC"
|
23
|
+
@bike.reload.model.should == "CB450SC"
|
24
|
+
|
25
|
+
@bike.year.should == "1990"
|
26
|
+
@bike.update_attribute :year, "1986"
|
27
|
+
@bike.year.should == "1986"
|
28
|
+
@bike.reload
|
29
|
+
@bike.year.should == "1986"
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should be able to update multiple fields atomically' do
|
33
|
+
@bike.update_attributes model: "CB750",
|
34
|
+
year: "1996"
|
35
|
+
@bike.model.should == "CB750"
|
36
|
+
@bike.year.should == "1996"
|
37
|
+
@bike.reload.model.should == "CB750"
|
38
|
+
@bike.reload.year.should == "1996"
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should openly refuse to set fields that do not exist' do
|
42
|
+
(->{
|
43
|
+
@bike.update_attribute :this_field_does_not_exist, "Lorem ipsum dolor sit amet."
|
44
|
+
}).should raise_error
|
45
|
+
(->{
|
46
|
+
# TODO Once this operation is made atomic, this test needs to be updated to also
|
47
|
+
# include keys that do exist, in various orders. Even if real fields are included,
|
48
|
+
# no fields should be updated if any part of this query would fail. To emulate this
|
49
|
+
# behaviour in the meantime, possibly check all keys of attributes hash to see if
|
50
|
+
# they exist before performing the queries or synchronize during.
|
51
|
+
@bike.update_attributes this_field_does_not_exist: "Ut enim ad minim veniam.",
|
52
|
+
neither_does_this_one: "Duis aute irure dolor in."
|
53
|
+
}).should raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
###
|
57
|
+
|
58
|
+
after :all do
|
59
|
+
Redis.new.flushall
|
60
|
+
Ampere.connect
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
|
2
|
+
|
3
|
+
describe 'Ampere', :ampere => true do
|
4
|
+
before :all do
|
5
|
+
Ampere.connect
|
6
|
+
Redis.new.flushall
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should be able to connect' do
|
10
|
+
Ampere.connected?.should be_true
|
11
|
+
Ampere.disconnect
|
12
|
+
Ampere.connected?.should be_false
|
13
|
+
end
|
14
|
+
|
15
|
+
# context 'Redis data store', :redis => true do
|
16
|
+
# it 'should come with a __guid set' do
|
17
|
+
# Redis.new['guid'].should == 0
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
after :all do
|
22
|
+
Redis.new.flushall
|
23
|
+
Ampere.disconnect
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
|
2
|
+
|
3
|
+
describe 'Collections', :collections => true do
|
4
|
+
before :all do
|
5
|
+
Redis.new.flushall
|
6
|
+
Ampere.connect
|
7
|
+
|
8
|
+
class President < Ampere::Model
|
9
|
+
field :name
|
10
|
+
field :party
|
11
|
+
|
12
|
+
index :party
|
13
|
+
end
|
14
|
+
|
15
|
+
President.create :name => "Millard Fillmore" , :party => "Whig"
|
16
|
+
President.create :name => "Ulysses S. Grant" , :party => "Republican"
|
17
|
+
President.create :name => "Abraham Lincoln" , :party => "Republican"
|
18
|
+
President.create :name => "Franklin D. Roosevelt" , :party => "Democratic"
|
19
|
+
President.create :name => "John F. Kennedy" , :party => "Democratic"
|
20
|
+
President.create :name => "Jimmy Carter" , :party => "Democratic"
|
21
|
+
end
|
22
|
+
|
23
|
+
###
|
24
|
+
|
25
|
+
it 'should be returned by where() queries' do
|
26
|
+
democrats = President.where(:party => "Democratic")
|
27
|
+
democrats.class.should == Ampere::Collection
|
28
|
+
democrats.model.should == President
|
29
|
+
democrats.raw_array.length.should == 3
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should be accessible via [] like an Array' do
|
33
|
+
whigs = President.where(:party => "Whig")
|
34
|
+
whigs[0].name.should == "Millard Fillmore"
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should lazily load model instances searched for with indexed fields' do
|
38
|
+
whigs = President.where(:party => "Whig")
|
39
|
+
whigs.raw_array.first.class.should == String
|
40
|
+
whigs[0].name.should == "Millard Fillmore"
|
41
|
+
whigs.raw_array.first.class.should == President
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should return its first() item' do
|
45
|
+
republicans = President.where(:party => "Republican")
|
46
|
+
republicans.first.name.should == "Ulysses S. Grant"
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should return its first(n) items' do
|
50
|
+
republicans = President.where(:party => "Republican")
|
51
|
+
republicans.first(2).map(&:name).should == ["Ulysses S. Grant", "Abraham Lincoln"]
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return its last() item' do
|
55
|
+
democrats = President.where(:party => "Democratic")
|
56
|
+
democrats.last.name.should == "Jimmy Carter"
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should be convertible to an array' do
|
60
|
+
republicans = President.where(:party => "Republican")
|
61
|
+
republicans.to_a.map(&:name).should == ["Ulysses S. Grant", "Abraham Lincoln"]
|
62
|
+
end
|
63
|
+
|
64
|
+
###
|
65
|
+
|
66
|
+
after :all do
|
67
|
+
Ampere.disconnect
|
68
|
+
Redis.new.flushall
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter '/spec/'
|
4
|
+
add_filter '/features/'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rspec'
|
8
|
+
require 'rspec/autorun'
|
9
|
+
require 'shoulda'
|
10
|
+
|
11
|
+
require 'ampere'
|
12
|
+
|
13
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
14
|
+
# in spec/support/ and its subdirectories.
|
15
|
+
Dir[File.join(File.dirname(__FILE__), "spec", "support", "**", "*.rb")].each {|f| puts "REQUIRING: #{f}"; require f}
|
16
|
+
|
17
|
+
# Not used yet
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.mock_with :rspec
|
20
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'ampere'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
data/test/test_ampere.rb
ADDED
metadata
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ampere
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Max Thom Stahl
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-06 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: &70174558736960 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70174558736960
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: shoulda
|
27
|
+
requirement: &70174558736420 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70174558736420
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: cucumber
|
38
|
+
requirement: &70174558735860 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70174558735860
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: &70174558735300 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70174558735300
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: jeweler
|
60
|
+
requirement: &70174558734720 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.6.4
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70174558734720
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: &70174558734140 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70174558734140
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rspec
|
82
|
+
requirement: &70174558733620 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70174558733620
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rdoc
|
93
|
+
requirement: &70174558733120 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70174558733120
|
102
|
+
description: An ActiveRecord/Mongoid-esque object model for the Redis key/value data
|
103
|
+
store.
|
104
|
+
email: max@villainousindustri.es
|
105
|
+
executables: []
|
106
|
+
extensions: []
|
107
|
+
extra_rdoc_files:
|
108
|
+
- LICENSE.txt
|
109
|
+
- README.md
|
110
|
+
files:
|
111
|
+
- .document
|
112
|
+
- .rspec
|
113
|
+
- .rvmrc
|
114
|
+
- Gemfile
|
115
|
+
- Gemfile.lock
|
116
|
+
- LICENSE.txt
|
117
|
+
- README.md
|
118
|
+
- Rakefile
|
119
|
+
- VERSION
|
120
|
+
- features/ampere.feature
|
121
|
+
- features/step_definitions/ampere_steps.rb
|
122
|
+
- features/support/env.rb
|
123
|
+
- lib/ampere.rb
|
124
|
+
- lib/ampere/collection.rb
|
125
|
+
- lib/ampere/model.rb
|
126
|
+
- spec/models/indices_spec.rb
|
127
|
+
- spec/models/model_spec.rb
|
128
|
+
- spec/models/queries_spec.rb
|
129
|
+
- spec/models/relationships/belongs_to_spec.rb
|
130
|
+
- spec/models/relationships/has_many_spec.rb
|
131
|
+
- spec/models/relationships/has_one_spec.rb
|
132
|
+
- spec/models/updates_spec.rb
|
133
|
+
- spec/module/ampere_spec.rb
|
134
|
+
- spec/module/collections_spec.rb
|
135
|
+
- spec/spec_helper.rb
|
136
|
+
- test/helper.rb
|
137
|
+
- test/test_ampere.rb
|
138
|
+
homepage: http://github.com/mstahl/ampere
|
139
|
+
licenses:
|
140
|
+
- EPL
|
141
|
+
post_install_message:
|
142
|
+
rdoc_options: []
|
143
|
+
require_paths:
|
144
|
+
- lib
|
145
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ! '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
segments:
|
152
|
+
- 0
|
153
|
+
hash: -4494108612008764104
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 1.8.10
|
163
|
+
signing_key:
|
164
|
+
specification_version: 3
|
165
|
+
summary: A pure Ruby ORM for Redis.
|
166
|
+
test_files: []
|