dm-is-versioned 0.9.11 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ === 0.10.0 / 2009-10-15
2
+
3
+ * Updated to work with dm-core 0.10.0
4
+
1
5
  === 0.9.11 / 2009-03-29
2
6
 
3
7
  * No changes this version
@@ -1,7 +1,7 @@
1
- History.txt
1
+ History.rdoc
2
2
  LICENSE
3
3
  Manifest.txt
4
- README.txt
4
+ README.rdoc
5
5
  Rakefile
6
6
  TODO
7
7
  lib/dm-is-versioned.rb
File without changes
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'pathname'
2
- require 'rubygems'
3
2
 
4
3
  ROOT = Pathname(__FILE__).dirname.expand_path
5
4
  JRUBY = RUBY_PLATFORM =~ /java/
@@ -14,10 +13,10 @@ GEM_NAME = 'dm-is-versioned'
14
13
  GEM_VERSION = DataMapper::Is::Versioned::VERSION
15
14
  GEM_DEPENDENCIES = [['dm-core', GEM_VERSION]]
16
15
  GEM_CLEAN = %w[ log pkg coverage ]
17
- GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.txt LICENSE TODO History.txt ] }
16
+ GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.rdoc LICENSE TODO History.rdoc ] }
18
17
 
19
18
  PROJECT_NAME = 'datamapper'
20
- PROJECT_URL = "http://github.com/sam/dm-more/tree/master/#{GEM_NAME}"
19
+ PROJECT_URL = "http://github.com/datamapper/dm-more/tree/master/#{GEM_NAME}"
21
20
  PROJECT_DESCRIPTION = PROJECT_SUMMARY = 'DataMapper plugin enabling simple versioning of models'
22
21
 
23
22
  [ ROOT, ROOT.parent ].each do |dir|
@@ -1,14 +1,9 @@
1
- require 'rubygems'
2
- require 'pathname'
3
-
4
- gem 'dm-core', '0.9.11'
5
- require 'dm-core'
6
-
7
- require Pathname(__FILE__).dirname.expand_path / 'dm-is-versioned' / 'is' / 'versioned.rb'
1
+ require 'dm-is-versioned/is/versioned'
2
+ require 'dm-is-versioned/is/version'
8
3
 
9
4
  # Include the plugin in Resource
10
5
  module DataMapper
11
6
  module Model
12
7
  include DataMapper::Is::Versioned
13
- end # module Model
14
- end # module DataMapper
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  module DataMapper
2
2
  module Is
3
3
  module Versioned
4
- VERSION = '0.9.11'
4
+ VERSION = '0.10.0'.freeze
5
5
  end
6
6
  end
7
7
  end
@@ -45,54 +45,62 @@ module DataMapper
45
45
  #
46
46
  # TODO: enable replacing a current version with an old version.
47
47
  module Versioned
48
-
49
48
  def is_versioned(options = {})
50
- on = options[:on]
51
-
52
- class << self; self end.class_eval do
53
- define_method :const_missing do |name|
54
- storage_name = Extlib::Inflection.tableize(self.name + "Version")
55
- model = DataMapper::Model.new(storage_name)
56
-
57
- if name == :Version
58
- properties.each do |property|
59
- options = property.options
60
- options[:key] = true if property.name == on || options[:serial] == true
61
- options[:serial] = false
62
- model.property property.name, property.type, options
63
- end
49
+ @on = on = options[:on]
64
50
 
65
- self.const_set("Version", model)
66
- else
67
- super(name)
68
- end
69
- end
70
- end
71
-
72
- self.after_class_method :auto_migrate! do
51
+ after_class_method :auto_migrate! do |retval|
73
52
  self::Version.auto_migrate!
74
53
  end
75
54
 
76
- self.after_class_method :auto_upgrade! do
55
+ after_class_method :auto_upgrade! do |retval|
77
56
  self::Version.auto_upgrade!
78
57
  end
79
58
 
80
- self.before :attribute_set do |property, value|
81
- pending_version_attributes[property] ||= self.attribute_get(property)
59
+ properties.each do |property|
60
+ name = property.name
61
+ before "#{name}=".to_sym do
62
+ unless (value = property.get(self)).nil? || pending_version_attributes.key?(name)
63
+ pending_version_attributes[name] = value
64
+ end
65
+ end
82
66
  end
83
67
 
84
- self.after :update do |result|
85
- if result && dirty_attributes.has_key?(properties[on])
86
- self.class::Version.create(self.attributes.merge(pending_version_attributes))
87
- self.pending_version_attributes.clear
68
+ after :update do |retval|
69
+ if retval && pending_version_attributes.key?(on)
70
+ model::Version.create(attributes.merge(pending_version_attributes))
71
+ pending_version_attributes.clear
88
72
  end
89
73
 
90
- result
74
+ retval
91
75
  end
92
76
 
93
- include DataMapper::Is::Versioned::InstanceMethods
77
+ extend ClassMethods
78
+ include InstanceMethods
94
79
  end
95
80
 
81
+ module ClassMethods
82
+ def const_missing(name)
83
+ if name == :Version
84
+ model = DataMapper::Model.new
85
+
86
+ properties.each do |property|
87
+ type = property.type
88
+ type = Class if type == DataMapper::Types::Discriminator
89
+
90
+ options = property.options.merge(
91
+ :key => property.name == @on,
92
+ :serial => false
93
+ )
94
+
95
+ model.property(property.name, type, options)
96
+ end
97
+
98
+ const_set(name, model)
99
+ else
100
+ super
101
+ end
102
+ end
103
+ end # ClassMethods
96
104
 
97
105
  module InstanceMethods
98
106
  ##
@@ -114,14 +122,12 @@ module DataMapper
114
122
  # --
115
123
  # @return <Collection>
116
124
  def versions
117
- query = {}
118
- version = self.class.const_get("Version")
119
- self.class.key.zip(self.key) { |property, value| query[property.name] = value }
120
- query.merge(:order => version.key.collect { |key| key.name.desc })
121
- version.all(query)
125
+ version_model = model.const_get(:Version)
126
+ query = model.key.zip(key).map { |p, v| [ p.name, v ] }.to_hash
127
+ query.merge(:order => version_model.key.map { |k| k.name.desc })
128
+ version_model.all(query)
122
129
  end
123
- end
124
-
130
+ end # InstanceMethods
125
131
  end # Versioned
126
132
  end # Is
127
133
  end # DataMapper
@@ -1 +1,2 @@
1
1
  --colour
2
+ --loadby random
@@ -1,10 +1,14 @@
1
- require 'pathname'
2
1
  require 'rubygems'
3
2
 
4
- gem 'rspec', '~>1.2'
5
- require 'spec'
3
+ # Use local dm-core if running from a typical dev checkout.
4
+ lib = File.join('..', '..', 'dm-core', 'lib')
5
+ $LOAD_PATH.unshift(lib) if File.directory?(lib)
6
+ require 'dm-core'
6
7
 
7
- require Pathname(__FILE__).dirname.expand_path.parent + 'lib/dm-is-versioned'
8
+ # Support running specs with 'rake spec' and 'spec'
9
+ $LOAD_PATH.unshift('lib') unless $LOAD_PATH.include?('lib')
10
+
11
+ require 'dm-is-versioned'
8
12
 
9
13
  def load_driver(name, default_uri)
10
14
  return false if ENV['ADAPTER'] != name.to_s
@@ -1,184 +1,123 @@
1
- require File.dirname(__FILE__) + "/spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  class Story
4
4
  include DataMapper::Resource
5
5
 
6
- property :id, Integer, :serial => true
7
- property :title, String
6
+ property :id, Serial
7
+ property :title, String
8
8
  property :updated_at, DateTime
9
+ property :type, Discriminator
9
10
 
10
11
  before :save do
11
12
  # For the sake of testing, make sure the updated_at is always unique
12
- time = self.updated_at ? self.updated_at + 1 : Time.now
13
- self.updated_at = time if self.dirty?
13
+ if dirty?
14
+ time = self.updated_at ? self.updated_at + 1 : Time.now
15
+ self.updated_at = time
16
+ end
14
17
  end
15
18
 
16
19
  is_versioned :on => :updated_at
17
-
18
20
  end
19
21
 
20
22
  if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
21
- describe 'DataMapper' do
22
- describe "#auto_migrate!" do
23
- before do
24
- # I *think* AutoMigrator breaks toplevel auto_migrate
25
- # into two calls to reduce redundancy, so auto_migrate!
26
- # never actually gets called on decendents after a
27
- # DataMapper.auto_migrate! call.
28
- Story::Version.should_receive(:auto_migrate_down!)
29
- Story::Version.should_receive(:auto_migrate_up!)
30
- end
31
- it "should get called on a versioned inner class" do
32
- DataMapper.auto_migrate!
33
- end
34
- end # #auto_migrate!
35
-
36
- describe "#auto_upgrade!" do
37
- before do
38
- # AutoMigrator collects all descendents, triggering once
39
- # but triggers a second time after Story gets upgraded.
40
- # Since it's non-destructive, shouldn't matter that it
41
- # gets called twice though.
42
- Story::Version.should_receive(:auto_upgrade!).twice
43
- end
44
- it "should get called on a versioned inner class" do
45
- DataMapper.auto_upgrade!
46
- end
47
- end # #auto_upgrade!
48
- end
49
-
50
23
  describe 'DataMapper::Is::Versioned' do
51
- describe "inner class" do
52
- it "should be present" do
53
- Story::Version.should be_a_kind_of(Class)
24
+ describe 'inner class' do
25
+ it 'should be present' do
26
+ Story::Version.should be_a_kind_of(DataMapper::Model)
54
27
  end
55
28
 
56
- it "should have a default storage name" do
57
- Story::Version.storage_name.should == "story_versions"
29
+ it 'should have a default storage name' do
30
+ Story::Version.storage_name.should == 'story_versions'
58
31
  end
59
32
 
60
- it "should have its parent's properties" do
61
- Story.properties.each do |property|
62
- Story::Version.properties.should have_property(property.name)
33
+ Story.properties.each do |property|
34
+ it "should have its parent's property #{property.name}" do
35
+ Story::Version.properties.should include(property)
63
36
  end
64
37
  end
65
- end # inner class
38
+ end
66
39
 
67
- describe "#auto_migrate!" do
68
- before do
69
- Story::Version.should_receive(:auto_migrate!)
70
- end
71
- it "should get called on the inner class" do
40
+ describe '#create' do
41
+ before :all do
72
42
  Story.auto_migrate!
43
+ Story.create(:title => 'A Very Interesting Article')
73
44
  end
74
- end # #auto_migrate!
75
-
76
- describe "#auto_upgrade!" do
77
- before do
78
- Story::Version.should_receive(:auto_upgrade!)
79
- end
80
- it "should get called on the inner class" do
81
- Story.auto_upgrade!
82
- end
83
- end # #auto_upgrade!
84
45
 
85
- describe "#create" do
86
- before do
87
- Story.auto_migrate!
88
- Story.create(:title => "A Very Interesting Article")
89
- end
90
- it "should not create a versioned copy" do
46
+ it 'should not create a versioned copy' do
91
47
  Story::Version.all.size.should == 0
92
48
  end
93
- end # #create
49
+ end
94
50
 
95
- describe "#save" do
96
- before do
51
+ describe '#save' do
52
+ before :all do
97
53
  Story.auto_migrate!
98
54
  end
99
55
 
100
- describe "(with new resource)" do
101
- before do
102
- @story = Story.new(:title => "A Story")
56
+ describe '(with new resource)' do
57
+ before :all do
58
+ @story = Story.new(:title => 'A Story')
103
59
  @story.save
104
60
  end
105
- it "should not create a versioned copy" do
61
+
62
+ it 'should not create a versioned copy' do
106
63
  Story::Version.all.size.should == 0
107
64
  end
108
65
  end
109
66
 
110
- describe "(with a clean existing resource)" do
111
- before do
112
- @story = Story.create(:title => "A Story")
67
+ describe '(with a clean existing resource)' do
68
+ before :all do
69
+ @story = Story.create(:title => 'A Story')
113
70
  @story.save
114
71
  end
115
72
 
116
- it "should not create a versioned copy" do
73
+ it 'should not create a versioned copy' do
117
74
  Story::Version.all.size.should == 0
118
75
  end
119
76
  end
120
77
 
121
- describe "(with a dirty existing resource)" do
122
- before do
123
- @story = Story.create(:title => "A Story")
124
- @story.title = "An Inner Update"
125
- @story.title = "An Updated Story"
78
+ describe '(with a dirty existing resource)' do
79
+ before :all do
80
+ @story = Story.create(:title => 'A Story')
81
+ @story.title = 'An Inner Update'
82
+ @story.title = 'An Updated Story'
126
83
  @story.save
127
84
  end
128
85
 
129
- it "should create a versioned copy" do
86
+ it 'should create a versioned copy' do
130
87
  Story::Version.all.size.should == 1
131
88
  end
132
89
 
133
- it "should not have the same value for the versioned field" do
90
+ it 'should not have the same value for the versioned field' do
134
91
  @story.updated_at.should_not == Story::Version.first.updated_at
135
92
  end
136
93
 
137
- it "should save the original value, not the inner update" do
94
+ it 'should save the original value, not the inner update' do
138
95
  # changes to the story between saves shouldn't be updated.
139
- @story.versions.last.title.should == "A Story"
96
+ @story.versions.last.title.should == 'A Story'
140
97
  end
141
98
  end
99
+ end
142
100
 
143
- end # #save
144
-
145
- describe "#pending_version_attributes" do
146
- before do
147
- @story = Story.create(:title => "A Story")
148
- end
149
-
150
- it "should be updated when a property changes" do
151
- @story.title = "A New Title"
152
- @story.pending_version_attributes[:title].should == "A Story"
153
- end
154
-
155
- it "should be cleared when a resource is saved" do
156
- @story.title = "A New Title"
157
- @story.save
158
- @story.pending_version_attributes.should be_empty
159
- end
160
- end # #pending_version_attributes
161
-
162
- describe "#versions" do
163
- before do
101
+ describe '#versions' do
102
+ before :all do
164
103
  Story.auto_migrate!
165
- @story = Story.create(:title => "A Story")
104
+ @story = Story.create(:title => 'A Story')
166
105
  end
167
106
 
168
- it "should return an empty array when there are no versions" do
107
+ it 'should return an empty array when there are no versions' do
169
108
  @story.versions.should == []
170
109
  end
171
110
 
172
- it "should return a collection when there are versions" do
111
+ it 'should return a collection when there are versions' do
173
112
  @story.versions.should == Story::Version.all(:id => @story.id)
174
113
  end
175
114
 
176
115
  it "should not return another object's versions" do
177
- @story2 = Story.create(:title => "A Different Story")
178
- @story2.title = "A Different Title"
116
+ @story2 = Story.create(:title => 'A Different Story')
117
+ @story2.title = 'A Different Title'
179
118
  @story2.save
180
119
  @story.versions.should == Story::Version.all(:id => @story.id)
181
120
  end
182
- end # #versions
121
+ end
183
122
  end
184
123
  end
@@ -4,7 +4,7 @@ end
4
4
 
5
5
  desc "Install #{GEM_NAME} #{GEM_VERSION}"
6
6
  task :install => [ :package ] do
7
- sudo_gem "install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
7
+ sudo_gem "install pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
8
8
  end
9
9
 
10
10
  desc "Uninstall #{GEM_NAME} #{GEM_VERSION}"
@@ -1,6 +1,4 @@
1
1
  begin
2
- gem 'rspec', '~>1.2'
3
- require 'spec'
4
2
  require 'spec/rake/spectask'
5
3
 
6
4
  task :default => [ :spec ]
@@ -8,16 +6,18 @@ begin
8
6
  desc 'Run specifications'
9
7
  Spec::Rake::SpecTask.new(:spec) do |t|
10
8
  t.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
11
- t.spec_files = Pathname.glob((ROOT + 'spec/**/*_spec.rb').to_s).map { |f| f.to_s }
9
+ t.libs << 'lib' << 'spec' # needed for CI rake spec task, duplicated in spec_helper
12
10
 
13
11
  begin
14
- gem 'rcov', '~>0.8'
12
+ require 'rcov'
15
13
  t.rcov = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)
16
14
  t.rcov_opts << '--exclude' << 'spec'
17
15
  t.rcov_opts << '--text-summary'
18
16
  t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
19
17
  rescue LoadError
20
18
  # rcov not installed
19
+ rescue SyntaxError
20
+ # rcov syntax invalid
21
21
  end
22
22
  end
23
23
  rescue LoadError
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-is-versioned
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.11
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernerd Schaefer
@@ -9,19 +9,10 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-29 00:00:00 -07:00
12
+ date: 2009-09-16 00:00:00 -07:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: dm-core
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - "="
22
- - !ruby/object:Gem::Version
23
- version: 0.9.11
24
- version:
14
+ dependencies: []
15
+
25
16
  description: DataMapper plugin enabling simple versioning of models
26
17
  email:
27
18
  - bernerd [a] wieck [d] com
@@ -30,15 +21,15 @@ executables: []
30
21
  extensions: []
31
22
 
32
23
  extra_rdoc_files:
33
- - README.txt
24
+ - README.rdoc
34
25
  - LICENSE
35
26
  - TODO
36
- - History.txt
27
+ - History.rdoc
37
28
  files:
38
- - History.txt
29
+ - History.rdoc
39
30
  - LICENSE
40
31
  - Manifest.txt
41
- - README.txt
32
+ - README.rdoc
42
33
  - Rakefile
43
34
  - TODO
44
35
  - lib/dm-is-versioned.rb
@@ -50,11 +41,13 @@ files:
50
41
  - tasks/install.rb
51
42
  - tasks/spec.rb
52
43
  has_rdoc: true
53
- homepage: http://github.com/sam/dm-more/tree/master/dm-is-versioned
44
+ homepage: http://github.com/datamapper/dm-more/tree/master/dm-is-versioned
45
+ licenses: []
46
+
54
47
  post_install_message:
55
48
  rdoc_options:
56
49
  - --main
57
- - README.txt
50
+ - README.rdoc
58
51
  require_paths:
59
52
  - lib
60
53
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -72,9 +65,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
65
  requirements: []
73
66
 
74
67
  rubyforge_project: datamapper
75
- rubygems_version: 1.3.1
68
+ rubygems_version: 1.3.5
76
69
  signing_key:
77
- specification_version: 2
70
+ specification_version: 3
78
71
  summary: DataMapper plugin enabling simple versioning of models
79
72
  test_files: []
80
73