tractor 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.4
1
+ 0.4.5
@@ -3,6 +3,10 @@ require 'yajl'
3
3
 
4
4
  module Tractor
5
5
 
6
+ class MissingIdError < StandardError; end
7
+ class DuplicateKeyError < StandardError; end
8
+ class MissingIndexError < StandardError; end
9
+
6
10
  class << self
7
11
  attr_reader :redis
8
12
 
@@ -37,7 +41,7 @@ module Tractor
37
41
  end
38
42
 
39
43
  def all
40
- ids.inject([]){ |o, id| o << klass.find_by_id(id); o }
44
+ ids.inject([]){|o, id| o << klass.find_by_id(id); o }
41
45
  end
42
46
  end
43
47
 
@@ -81,7 +85,7 @@ module Tractor
81
85
  end
82
86
 
83
87
  def save
84
- raise "Probably wanna set an id" if self.id.nil? || self.id.to_s.empty?
88
+ raise MissingIdError, "Probably wanna set an id" if self.id.nil? || self.id.to_s.empty?
85
89
  Tractor.redis["#{self.class}:#{self.id}"] = @encoder.encode(self.send(:attribute_store))
86
90
  Tractor.redis.sadd "#{self.class}:all", self.id
87
91
  add_to_indices
@@ -100,7 +104,7 @@ module Tractor
100
104
  def update(attributes = {})
101
105
  attributes.delete(:id)
102
106
  delete_from_indices(attributes)
103
- attributes.each{ |k,v| self.send("#{k}=", v) }
107
+ attributes.each{|k,v| self.send("#{k}=", v) }
104
108
  save
105
109
  end
106
110
 
@@ -143,7 +147,7 @@ module Tractor
143
147
  attr_reader :attributes, :associations, :indices
144
148
 
145
149
  def create(attributes={})
146
- raise "Duplicate value for #{self} 'id'" if Tractor.redis.sismember("#{self}:all", attributes[:id])
150
+ raise DuplicateKeyError, "Duplicate value for #{self} 'id'" if Tractor.redis.sismember("#{self}:all", attributes[:id])
147
151
  m = new(attributes)
148
152
  m.save
149
153
  m
@@ -162,7 +166,7 @@ module Tractor
162
166
 
163
167
  # use method missing to do craziness, or define a find_by on each index (BETTER)
164
168
  def find_by_attribute(name, value)
165
- raise "No index on '#{name}'" unless indices.include?(name)
169
+ raise MissingIndexError, "No index on '#{name}'" unless indices.include?(name)
166
170
  find({name => value})
167
171
  end
168
172
 
@@ -213,7 +217,7 @@ module Tractor
213
217
  end
214
218
 
215
219
  def all
216
- ids.inject([]){ |a, id| a << find_by_id(id); a }
220
+ ids.inject([]){|a, id| a << find_by_id(id); a }
217
221
  end
218
222
 
219
223
  ###
@@ -25,7 +25,11 @@ module Tractor
25
25
 
26
26
  def create_from_instance(server_instance)
27
27
  hydrate_attributes(server_instance) do |attributes|
28
- return self.create(attributes)
28
+ begin
29
+ return self.create(attributes)
30
+ rescue DuplicateKeyError
31
+ return find_from_instance(server_instance)
32
+ end
29
33
  end
30
34
  end
31
35
 
@@ -153,9 +153,9 @@ describe Tractor::Model::Base do
153
153
  it "raises if id is nil or empty" do
154
154
  game = Tractor::Model::Game.new
155
155
  game.id = nil
156
- lambda { game.save }.should raise_error("Probably wanna set an id")
156
+ lambda { game.save }.should raise_error(Tractor::MissingIdError, "Probably wanna set an id")
157
157
  game.id = ''
158
- lambda { game.save }.should raise_error("Probably wanna set an id")
158
+ lambda { game.save }.should raise_error(Tractor::MissingIdError, "Probably wanna set an id")
159
159
  end
160
160
 
161
161
  it "should write attributes to redis" do
@@ -233,7 +233,7 @@ describe Tractor::Model::Base do
233
233
  MonkeyClient.create({ :id => 'a1a', :evil => true, :birthday => "Dec 3" })
234
234
  lambda do
235
235
  MonkeyClient.create({ :id => 'a1a', :evil => false, :birthday => "Jan 4" })
236
- end.should raise_error("Duplicate value for MonkeyClient 'id'")
236
+ end.should raise_error(Tractor::DuplicateKeyError, "Duplicate value for MonkeyClient 'id'")
237
237
  end
238
238
 
239
239
  it "should write attributes to redis" do
@@ -399,7 +399,7 @@ describe Tractor::Model::Base do
399
399
  it "raises if index does not exist for given key" do
400
400
  lambda do
401
401
  Sammich.find_by_attribute(:expensive, true)
402
- end.should raise_error("No index on 'expensive'")
402
+ end.should raise_error(Tractor::MissingIndexError, "No index on 'expensive'")
403
403
  end
404
404
 
405
405
  it "takes an index name and value and finds all matching objects" do
@@ -89,8 +89,24 @@ describe Tractor::Model::Mapper do
89
89
  redis_monkey.evil.should == true
90
90
  redis_monkey.id.should == "a1a"
91
91
  end
92
+
93
+ context "when the instance already exists in it's tractor representation" do
94
+ attr_reader :monkey, :tractor_monkey
95
+ before do
96
+ @monkey = Monkey.new("Dec. 3, 1981", true, 'a1a')
97
+ @tractor_monkey = MonkeyClient.create_from_instance(monkey)
98
+ end
99
+
100
+ it "returns the instance from the tractor representation" do
101
+ result = MonkeyClient.create_from_instance(monkey)
102
+ result.id.should == tractor_monkey.id
103
+ result.birthday.should == tractor_monkey.birthday
104
+ result.evil.should == tractor_monkey.evil
105
+ end
106
+ end
92
107
  end
93
108
 
109
+
94
110
  describe "update_from_instance" do
95
111
  it "ensures dependencies are met"
96
112
  it "finds an existing record based on id and updates the attributes accordingly" do
data/tractor.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tractor}
8
- s.version = "0.4.4"
8
+ s.version = "0.4.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Shane Wolf"]
12
- s.date = %q{2010-06-23}
12
+ s.date = %q{2010-08-16}
13
13
  s.description = %q{Very simple object mappings for ruby objects}
14
14
  s.email = %q{shanewolf@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
36
36
  s.homepage = %q{http://github.com/gizm0duck/tractor}
37
37
  s.rdoc_options = ["--charset=UTF-8"]
38
38
  s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.5}
39
+ s.rubygems_version = %q{1.3.7}
40
40
  s.summary = %q{Very simple object mapping for ruby objects}
41
41
  s.test_files = [
42
42
  "spec/model/base_spec.rb",
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
49
49
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
50
  s.specification_version = 3
51
51
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
53
  s.add_runtime_dependency(%q<redis>, [">= 2.0.0"])
54
54
  s.add_runtime_dependency(%q<yajl-ruby>, [">= 0.7.6"])
55
55
  else
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ hash: 5
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 5
10
+ version: 0.4.5
5
11
  platform: ruby
6
12
  authors:
7
13
  - Shane Wolf
@@ -9,29 +15,41 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-06-23 00:00:00 -07:00
18
+ date: 2010-08-16 00:00:00 -07:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: redis
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 15
30
+ segments:
31
+ - 2
32
+ - 0
33
+ - 0
23
34
  version: 2.0.0
24
- version:
35
+ type: :runtime
36
+ version_requirements: *id001
25
37
  - !ruby/object:Gem::Dependency
26
38
  name: yajl-ruby
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
30
42
  requirements:
31
43
  - - ">="
32
44
  - !ruby/object:Gem::Version
45
+ hash: 15
46
+ segments:
47
+ - 0
48
+ - 7
49
+ - 6
33
50
  version: 0.7.6
34
- version:
51
+ type: :runtime
52
+ version_requirements: *id002
35
53
  description: Very simple object mappings for ruby objects
36
54
  email: shanewolf@gmail.com
37
55
  executables: []
@@ -67,21 +85,27 @@ rdoc_options:
67
85
  require_paths:
68
86
  - lib
69
87
  required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
70
89
  requirements:
71
90
  - - ">="
72
91
  - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
73
95
  version: "0"
74
- version:
75
96
  required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
76
98
  requirements:
77
99
  - - ">="
78
100
  - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
79
104
  version: "0"
80
- version:
81
105
  requirements: []
82
106
 
83
107
  rubyforge_project:
84
- rubygems_version: 1.3.5
108
+ rubygems_version: 1.3.7
85
109
  signing_key:
86
110
  specification_version: 3
87
111
  summary: Very simple object mapping for ruby objects