ohm 1.0.0.rc1 → 1.0.0.rc2

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.
@@ -1,5 +1,3 @@
1
- require "set"
2
-
3
1
  module Ohm
4
2
 
5
3
  # Transactions in Ohm are designed to be composable and atomic. They use
@@ -42,27 +40,27 @@ module Ohm
42
40
  #
43
41
  # @see http://redis.io/topic/transactions Transactions in Redis.
44
42
  class Transaction
45
- class Store < BasicObject
46
- class EntryAlreadyExistsError < ::RuntimeError
43
+ class Store
44
+ class EntryAlreadyExistsError < RuntimeError
47
45
  end
48
46
 
49
- def method_missing(writer, value = nil)
50
- super unless writer[-1] == "="
47
+ class NoEntryError < RuntimeError
48
+ end
51
49
 
52
- reader = writer[0..-2].to_sym
50
+ def initialize
51
+ @dict = Hash.new
52
+ end
53
53
 
54
- __metaclass__.send(:define_method, reader) do
55
- value
56
- end
54
+ def [](key)
55
+ raise NoEntryError unless @dict.member?(key)
57
56
 
58
- __metaclass__.send(:define_method, writer) do |*_|
59
- ::Kernel.raise EntryAlreadyExistsError
60
- end
57
+ @dict[key]
61
58
  end
62
59
 
63
- private
64
- def __metaclass__
65
- class << self; self end
60
+ def []=(key, value)
61
+ raise EntryAlreadyExistsError if @dict.member?(key)
62
+
63
+ @dict[key] = value
66
64
  end
67
65
  end
68
66
 
@@ -83,7 +81,7 @@ module Ohm
83
81
  end
84
82
 
85
83
  def watch(*keys)
86
- phase[:watch] += keys
84
+ phase[:watch].concat(keys - phase[:watch])
87
85
  end
88
86
 
89
87
  def read(&block)
@@ -117,6 +115,8 @@ module Ohm
117
115
  break if db.multi do
118
116
  run(phase[:write], store)
119
117
  end
118
+
119
+ store = nil
120
120
  end
121
121
 
122
122
  phase[:after].each(&:call)
@@ -126,4 +126,8 @@ module Ohm
126
126
  procs.each { |p| p.call(store) }
127
127
  end
128
128
  end
129
+
130
+ def self.transaction(&block)
131
+ Transaction.new(&block)
132
+ end
129
133
  end
data/test/association.rb CHANGED
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  setup do
12
12
  u = User.create
13
- p = Post.create(user: u)
13
+ p = Post.create(:user => u)
14
14
 
15
15
  [u, p]
16
16
  end
data/test/connection.rb CHANGED
@@ -5,7 +5,7 @@ require File.expand_path("./helper", File.dirname(__FILE__))
5
5
  prepare.clear
6
6
 
7
7
  test "no rewriting of settings hash when using Ohm.connect" do
8
- settings = { url: "redis://127.0.0.1:6379/15" }.freeze
8
+ settings = { :url => "redis://127.0.0.1:6379/15" }.freeze
9
9
 
10
10
  ex = nil
11
11
 
data/test/counters.rb CHANGED
@@ -43,7 +43,7 @@ test "an attribute gets saved properly" do
43
43
  Ad.attribute :name
44
44
  Ad.counter :hits
45
45
 
46
- ad = Ad.create(name: "foo")
46
+ ad = Ad.create(:name => "foo")
47
47
  ad.incr :hits, 10
48
48
  assert_equal 10, ad.hits
49
49
 
@@ -38,7 +38,7 @@ if defined?(Ohm::Model::PureRuby)
38
38
  end
39
39
 
40
40
  test do
41
- u = User.create(email: "FOO@BAR.COM", foo: "bar")
41
+ u = User.create(:email => "FOO@BAR.COM", :foo => "bar")
42
42
  assert_equal "foo@bar.com", u.email
43
43
  assert_equal ["bar"], u.key[:foos].smembers
44
44
 
data/test/filtering.rb CHANGED
@@ -10,51 +10,51 @@ class User < Ohm::Model
10
10
  end
11
11
 
12
12
  setup do
13
- u1 = User.create(fname: "John", lname: "Doe", status: "active")
14
- u2 = User.create(fname: "Jane", lname: "Doe", status: "active")
13
+ u1 = User.create(:fname => "John", :lname => "Doe", :status => "active")
14
+ u2 = User.create(:fname => "Jane", :lname => "Doe", :status => "active")
15
15
 
16
16
  [u1, u2]
17
17
  end
18
18
 
19
19
  test "findability" do |john, jane|
20
- assert_equal 1, User.find(lname: "Doe", fname: "John").size
21
- assert User.find(lname: "Doe", fname: "John").include?(john)
20
+ assert_equal 1, User.find(:lname => "Doe", :fname => "John").size
21
+ assert User.find(:lname => "Doe", :fname => "John").include?(john)
22
22
 
23
- assert_equal 1, User.find(lname: "Doe", fname: "Jane").size
24
- assert User.find(lname: "Doe", fname: "Jane").include?(jane)
23
+ assert_equal 1, User.find(:lname => "Doe", :fname => "Jane").size
24
+ assert User.find(:lname => "Doe", :fname => "Jane").include?(jane)
25
25
  end
26
26
 
27
27
  test "sets aren't mutable" do |john, jane|
28
28
  assert_raise NoMethodError do
29
- User.find(lname: "Doe").add(john)
29
+ User.find(:lname => "Doe").add(john)
30
30
  end
31
31
 
32
32
  assert_raise NoMethodError do
33
- User.find(lname: "Doe", fname: "John").add(john)
33
+ User.find(:lname => "Doe", :fname => "John").add(john)
34
34
  end
35
35
  end
36
36
 
37
37
  test "#first" do |john, jane|
38
- set = User.find(lname: "Doe", status: "active")
38
+ set = User.find(:lname => "Doe", :status => "active")
39
39
 
40
- assert_equal jane, set.first(by: "fname", order: "ALPHA")
41
- assert_equal john, set.first(by: "fname", order: "ALPHA DESC")
40
+ assert_equal jane, set.first(:by => "fname", :order => "ALPHA")
41
+ assert_equal john, set.first(:by => "fname", :order => "ALPHA DESC")
42
42
 
43
- assert_equal "Jane", set.first(by: "fname", order: "ALPHA", get: "fname")
44
- assert_equal "John", set.first(by: "fname", order: "ALPHA DESC", get: "fname")
43
+ assert_equal "Jane", set.first(:by => "fname", :order => "ALPHA", :get => "fname")
44
+ assert_equal "John", set.first(:by => "fname", :order => "ALPHA DESC", :get => "fname")
45
45
  end
46
46
 
47
47
  test "#[]" do |john, jane|
48
- set = User.find(lname: "Doe", status: "active")
48
+ set = User.find(:lname => "Doe", :status => "active")
49
49
 
50
50
  assert_equal john, set[john.id]
51
51
  assert_equal jane, set[jane.id]
52
52
  end
53
53
 
54
54
  test "#except" do |john, jane|
55
- out = User.create(status: "inactive", lname: "Doe")
55
+ out = User.create(:status => "inactive", :lname => "Doe")
56
56
 
57
- res = User.find(lname: "Doe").except(status: "inactive")
57
+ res = User.find(:lname => "Doe").except(:status => "inactive")
58
58
 
59
59
  assert_equal 2, res.size
60
60
  assert res.include?(john)
@@ -62,10 +62,10 @@ test "#except" do |john, jane|
62
62
  end
63
63
 
64
64
  test "#union" do |john, jane|
65
- included = User.create(status: "inactive", lname: "Doe")
66
- excluded = User.create(status: "super", lname: "Doe")
65
+ included = User.create(:status => "inactive", :lname => "Doe")
66
+ excluded = User.create(:status => "super", :lname => "Doe")
67
67
 
68
- res = User.find(status: "active").union(status: "inactive")
68
+ res = User.find(:status => "active").union(:status => "inactive")
69
69
 
70
70
  assert_equal 3, res.size
71
71
  assert res.include?(john)
data/test/helper.rb CHANGED
@@ -7,6 +7,7 @@ begin
7
7
  rescue LoadError
8
8
  end
9
9
 
10
+ require "rubygems"
10
11
  require "cutest"
11
12
 
12
13
  def silence_warnings
data/test/indices.rb CHANGED
@@ -27,13 +27,13 @@ class User < Ohm::Model
27
27
  end
28
28
 
29
29
  setup do
30
- @user1 = User.create(email: "foo", activation_code: "bar", update: "baz")
31
- @user2 = User.create(email: "bar")
32
- @user3 = User.create(email: "baz qux")
30
+ @user1 = User.create(:email => "foo", :activation_code => "bar", :update => "baz")
31
+ @user2 = User.create(:email => "bar")
32
+ @user3 = User.create(:email => "baz qux")
33
33
  end
34
34
 
35
35
  test "be able to find by the given attribute" do
36
- assert @user1 == User.find(email: "foo").first
36
+ assert @user1 == User.find(:email => "foo").first
37
37
  end
38
38
 
39
39
  test "raise an error if the parameter supplied is not a hash" do
@@ -47,7 +47,7 @@ test "raise an error if the parameter supplied is not a hash" do
47
47
  end
48
48
 
49
49
  test "avoid intersections with the all collection" do
50
- assert_equal "User:indices:email:foo", User.find(email: "foo").key
50
+ assert_equal "User:indices:email:foo", User.find(:email => "foo").key
51
51
  end
52
52
 
53
53
  test "cleanup the temporary key after use" do
data/test/json.rb CHANGED
@@ -35,7 +35,7 @@ test "export a hash with the errors" do
35
35
  person = Venue.new
36
36
  person.valid?
37
37
 
38
- assert_equal({ errors: { name: [:not_present] }}, person.to_hash)
38
+ assert_equal({ :errors => { :name => [:not_present] }}, person.to_hash)
39
39
  end
40
40
 
41
41
  test "export a hash with the its id" do
@@ -48,7 +48,7 @@ test "export a hash with its id and the errors" do
48
48
  person.name = nil
49
49
  person.valid?
50
50
 
51
- expected_hash = { id: '1', errors: { name: [:not_present] }}
51
+ expected_hash = { :id => '1', :errors => { :name => [:not_present] }}
52
52
  assert expected_hash == person.to_hash
53
53
  end
54
54
 
@@ -68,19 +68,19 @@ test "just be the to_hash of a model" do
68
68
  end
69
69
 
70
70
  test "export an array of records to json" do
71
- Programmer.create(language: "Ruby")
72
- Programmer.create(language: "Python")
71
+ Programmer.create(:language => "Ruby")
72
+ Programmer.create(:language => "Python")
73
73
 
74
- expected = [{ id: "1", language: "Ruby" }, { id: "2", language: "Python"}].to_json
74
+ expected = [{ :id => "1", :language => "Ruby" }, { :id => "2", :language => "Python"}].to_json
75
75
  assert_equal expected, Programmer.all.to_json
76
76
  end
77
77
 
78
78
  test "export an array of lists to json" do
79
- venue = Venue.create(name: "Foo")
79
+ venue = Venue.create(:name => "Foo")
80
80
 
81
- venue.programmers.push(Programmer.create(language: "Ruby"))
82
- venue.programmers.push(Programmer.create(language: "Python"))
81
+ venue.programmers.push(Programmer.create(:language => "Ruby"))
82
+ venue.programmers.push(Programmer.create(:language => "Python"))
83
83
 
84
- expected = [{ id: "1", language: "Ruby" }, { id: "2", language: "Python"}].to_json
84
+ expected = [{ :id => "1", :language => "Ruby" }, { :id => "2", :language => "Python"}].to_json
85
85
  assert_equal expected, venue.programmers.to_json
86
86
  end
data/test/lua-save.rb CHANGED
@@ -23,8 +23,8 @@ else
23
23
 
24
24
  test "empty email doesn't choke" do |lua|
25
25
  res = lua.run_file("save",
26
- keys: ["User"],
27
- argv: ["email", nil])
26
+ :keys => ["User"],
27
+ :argv => ["email", nil])
28
28
 
29
29
  assert_equal [200, ["id", "1"]], res
30
30
  assert_equal "1", redis.hget("User:uniques:email", nil)
@@ -32,8 +32,8 @@ else
32
32
 
33
33
  test "empty fname / lname doesn't choke" do |lua|
34
34
  res = lua.run_file("save",
35
- keys: ["User"],
36
- argv: ["email", nil, "fname", nil, "lname", nil])
35
+ :keys => ["User"],
36
+ :argv => ["email", nil, "fname", nil, "lname", nil])
37
37
 
38
38
  assert_equal [200, ["id", "1"]], res
39
39
  assert redis.sismember("User:indices:fname:", 1)
@@ -42,24 +42,24 @@ else
42
42
 
43
43
  test "returns the unique constraint error" do |lua|
44
44
  res = lua.run_file("save",
45
- keys: ["User"],
46
- argv: ["email", "foo@bar.com"])
45
+ :keys => ["User"],
46
+ :argv => ["email", "foo@bar.com"])
47
47
 
48
48
  assert_equal [500, ["email", "not_unique"]], res
49
49
  end
50
50
 
51
51
  test "persists the unique entry properly" do |lua|
52
52
  lua.run_file("save",
53
- keys: ["User"],
54
- argv: ["email", "bar@baz.com"])
53
+ :keys => ["User"],
54
+ :argv => ["email", "bar@baz.com"])
55
55
 
56
56
  assert_equal "1", redis.hget("User:uniques:email", "bar@baz.com")
57
57
  end
58
58
 
59
59
  test "adds the entry to User:all" do |lua|
60
60
  lua.run_file("save",
61
- keys: ["User"],
62
- argv: ["email", "bar@baz.com"])
61
+ :keys => ["User"],
62
+ :argv => ["email", "bar@baz.com"])
63
63
 
64
64
  assert_equal 1, redis.scard("User:all")
65
65
  end
@@ -67,8 +67,8 @@ else
67
67
 
68
68
  test "saves the attributes" do |lua|
69
69
  lua.run_file("save",
70
- keys: ["User"],
71
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
70
+ :keys => ["User"],
71
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
72
72
 
73
73
  assert_equal "bar@baz.com", redis.hget("User:1", "email")
74
74
  assert_equal "John", redis.hget("User:1", "fname")
@@ -77,8 +77,8 @@ else
77
77
 
78
78
  test "indexes fname / lname" do |lua|
79
79
  lua.run_file("save",
80
- keys: ["User"],
81
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
80
+ :keys => ["User"],
81
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
82
82
 
83
83
  assert redis.sismember("User:indices:fname:John", 1)
84
84
  assert redis.sismember("User:indices:lname:Doe", 1)
@@ -86,30 +86,30 @@ else
86
86
 
87
87
  test "unique constraint during update" do |lua|
88
88
  lua.run_file("save",
89
- keys: ["User"],
90
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
89
+ :keys => ["User"],
90
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
91
91
 
92
92
  res = lua.run_file("save",
93
- keys: ["User", "User:1"],
94
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
93
+ :keys => ["User", "User:1"],
94
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
95
95
 
96
96
  assert_equal [200, ["id", "1"]], res
97
97
 
98
98
  res = lua.run_file("save",
99
- keys: ["User", "User:1"],
100
- argv: ["email", "foo@bar.com", "fname", "Jane", "lname", "Doe"])
99
+ :keys => ["User", "User:1"],
100
+ :argv => ["email", "foo@bar.com", "fname", "Jane", "lname", "Doe"])
101
101
 
102
102
  assert_equal [200, ["id", "1"]], res
103
103
  end
104
104
 
105
105
  test "cleanup of existing indices during update" do |lua|
106
106
  lua.run_file("save",
107
- keys: ["User"],
108
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
107
+ :keys => ["User"],
108
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
109
109
 
110
110
  res = lua.run_file("save",
111
- keys: ["User", "User:1"],
112
- argv: ["email", "foo@bar.com", "fname", "Jane", "lname", "Smith"])
111
+ :keys => ["User", "User:1"],
112
+ :argv => ["email", "foo@bar.com", "fname", "Jane", "lname", "Smith"])
113
113
 
114
114
  assert ! redis.sismember("User:indices:fname:John", 1)
115
115
  assert ! redis.sismember("User:indices:fname:Doe", 1)
@@ -117,12 +117,12 @@ else
117
117
 
118
118
  test "cleanup of existing uniques during update" do |lua|
119
119
  lua.run_file("save",
120
- keys: ["User"],
121
- argv: ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
120
+ :keys => ["User"],
121
+ :argv => ["email", "bar@baz.com", "fname", "John", "lname", "Doe"])
122
122
 
123
123
  res = lua.run_file("save",
124
- keys: ["User", "User:1"],
125
- argv: ["email", "foo@bar.com", "fname", "Jane", "lname", "Smith"])
124
+ :keys => ["User", "User:1"],
125
+ :argv => ["email", "foo@bar.com", "fname", "Jane", "lname", "Smith"])
126
126
 
127
127
  assert_equal nil, redis.hget("User:uniques:email", "bar@baz.com")
128
128
  end
@@ -147,9 +147,9 @@ test "stress test for lua scripting" do |lua|
147
147
  t = Benchmark.measure do
148
148
  threads = 100.times.map do |i|
149
149
  Thread.new do
150
- User.create(email: "foo#{i}@bar.com",
151
- fname: "Jane#{i}",
152
- lname: "Smith#{i}")
150
+ User.create(:email => "foo#{i}@bar.com",
151
+ :fname => "Jane#{i}",
152
+ :lname => "Smith#{i}")
153
153
  end
154
154
  end
155
155
 
@@ -167,9 +167,9 @@ test "stress test for postgres + sequel (as a comparison)" do
167
167
  t = Benchmark.measure do
168
168
  threads = 100.times.map do |i|
169
169
  Thread.new do
170
- DB[:users].insert(email: "foo#{i}@bar.com",
171
- fname: "John#{i}",
172
- lname: "Doe#{i}")
170
+ DB[:users].insert(:email => "foo#{i}@bar.com",
171
+ :fname => "John#{i}",
172
+ :lname => "Doe#{i}")
173
173
  end
174
174
  end
175
175
 
data/test/lua.rb CHANGED
@@ -15,14 +15,14 @@ else
15
15
  test do |lua|
16
16
  lua.redis.set("foo", "baz")
17
17
 
18
- res = lua.run_file("getset", keys: ["foo"], argv: ["bar"])
18
+ res = lua.run_file("getset", :keys => ["foo"], :argv => ["bar"])
19
19
  assert_equal ["baz", "bar"], res
20
20
  end
21
21
 
22
22
  test do |lua|
23
23
  res = lua.run_file("ohm-save",
24
- keys: ["User"],
25
- argv: ["fname", "John", "lname", "Doe"])
24
+ :keys => ["User"],
25
+ :argv => ["fname", "John", "lname", "Doe"])
26
26
 
27
27
  assert lua.redis.sismember("User:all", 1)
28
28
  assert_equal({ "fname" => "John", "lname" => "Doe" },
@@ -34,8 +34,8 @@ else
34
34
  lua.redis.sadd("User:indices", "lname")
35
35
 
36
36
  res = lua.run_file("save-with-indices",
37
- keys: ["User:1", "User:all", "User:indices"],
38
- argv: ["fname", "John", "lname", "Doe"])
37
+ :keys => ["User:1", "User:all", "User:indices"],
38
+ :argv => ["fname", "John", "lname", "Doe"])
39
39
 
40
40
  assert lua.redis.sismember("User:all", 1)
41
41