acts_as_archival 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +10 -0
  2. data/.rvmrc +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +44 -0
  6. data/LICENSE +22 -0
  7. data/README.md +112 -0
  8. data/Rakefile +13 -0
  9. data/acts_as_archival.gemspec +47 -0
  10. data/init.rb +3 -0
  11. data/lib/acts_as_archival.rb +7 -0
  12. data/lib/acts_as_archival/version.rb +3 -0
  13. data/lib/expected_behavior/acts_as_archival.rb +141 -0
  14. data/lib/expected_behavior/acts_as_archival_active_record_methods.rb +20 -0
  15. data/test/ambiguous_table_test.rb +12 -0
  16. data/test/associations_test.rb +102 -0
  17. data/test/basic_test.rb +64 -0
  18. data/test/column_test.rb +15 -0
  19. data/test/database.yml +8 -0
  20. data/test/deep_nesting_test.rb +29 -0
  21. data/test/fixtures/archival.rb +15 -0
  22. data/test/fixtures/archival_grandkid.rb +4 -0
  23. data/test/fixtures/archival_kid.rb +5 -0
  24. data/test/fixtures/exploder.rb +5 -0
  25. data/test/fixtures/independent_archival.rb +9 -0
  26. data/test/fixtures/mass_attribute_protected.rb +4 -0
  27. data/test/fixtures/missing_archive_number.rb +3 -0
  28. data/test/fixtures/missing_archived_at.rb +3 -0
  29. data/test/fixtures/plain.rb +5 -0
  30. data/test/fixtures/poly.rb +9 -0
  31. data/test/fixtures/readonly_when_archived.rb +3 -0
  32. data/test/mass_attribute_test.rb +18 -0
  33. data/test/polymorphic_test.rb +25 -0
  34. data/test/readonly_when_archived_test.rb +22 -0
  35. data/test/responds_test.rb +13 -0
  36. data/test/schema.rb +67 -0
  37. data/test/scope_test.rb +50 -0
  38. data/test/script/db_setup +57 -0
  39. data/test/test_helper.rb +60 -0
  40. data/test/through_association_test.rb +25 -0
  41. data/test/transaction_test.rb +32 -0
  42. metadata +235 -0
@@ -0,0 +1,50 @@
1
+ require_relative "test_helper"
2
+
3
+ class ActsAsArchivalTest < ActiveSupport::TestCase
4
+ test "simple unarchived scope" do
5
+ Archival.create!
6
+ Archival.create!
7
+
8
+ assert_equal 2, Archival.unarchived.count
9
+ end
10
+
11
+ test "simple archived scope" do
12
+ Archival.create!.archive
13
+ Archival.create!.archive
14
+
15
+ assert_equal 2, Archival.archived.count
16
+ end
17
+
18
+ test "mixed scopes" do
19
+ Archival.create!
20
+ Archival.create!.archive
21
+
22
+ assert_equal 1, Archival.archived.count
23
+ assert_equal 1, Archival.unarchived.count
24
+ end
25
+
26
+ test "simple archived_from_archive_number" do
27
+ archive_number = "TEST-IT"
28
+ Archival.create!.archive(archive_number)
29
+ Archival.create!.archive(archive_number)
30
+
31
+ assert_equal 2, Archival.archived_from_archive_number(archive_number).count
32
+ end
33
+
34
+ test "negative archived_from_archive_number" do
35
+ archive_number = "TEST-IT"
36
+ bogus_number = "BROKE-IT"
37
+ Archival.create!.archive(archive_number)
38
+ Archival.create!.archive(archive_number)
39
+
40
+ assert_equal 0, Archival.archived_from_archive_number(bogus_number).count
41
+ end
42
+
43
+ test "mixed archived_from_archive_number" do
44
+ archive_number = "TEST-IT"
45
+ Archival.create!.archive(archive_number)
46
+ Archival.create!.archive
47
+
48
+ assert_equal 1, Archival.archived_from_archive_number(archive_number).count
49
+ end
50
+ end
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ require "bundler/setup"
3
+ require "yaml"
4
+ require 'highline/import'
5
+
6
+ def read_database_config
7
+ database_file = File.join(File.dirname(__FILE__), "/../", "database.yml")
8
+ $DB_CONFIG = YAML.load(File.read(database_file))
9
+ end
10
+
11
+ def get_root_password
12
+ $ROOT_PW = ask("Provide root mySQL password to setup '#{$DB_CONFIG["database"]}': ") { |q| q.echo = false}
13
+ if !$ROOT_PW || $ROOT_PW.empty?
14
+ puts "error reading password"
15
+ exit 4
16
+ end
17
+ end
18
+
19
+ def check_root_password
20
+ password_check = "echo 'show databases;' | mysql -u root -p'#{$ROOT_PW}' > /dev/null"
21
+ unless system password_check
22
+ puts "incorrect password"
23
+ exit 7
24
+ end
25
+ end
26
+
27
+ def execute_mysql(message, statement, user = nil, password = nil)
28
+ puts message
29
+ `echo '#{statement}' | mysql -u #{user} -p'#{password}'`
30
+ end
31
+
32
+ def drop_existing(db, user, pass)
33
+ drop_statement = "drop database if exists #{db};"
34
+ execute_mysql("dropping #{db}", drop_statement, user, pass)
35
+ end
36
+
37
+ def create_db(db, user, pass)
38
+ create_statement = "create database #{db};"
39
+ execute_mysql("creating #{db}", create_statement, user, pass)
40
+ end
41
+
42
+ def grant_permission_on_db(db, user, pass)
43
+ grant_statement = "grant all on `#{db}`.* to `#{$DB_CONFIG["username"]}`@`localhost` identified by \"#{$DB_CONFIG["password"]}\";"
44
+ execute_mysql("granting on #{db}", grant_statement, user, pass)
45
+ end
46
+
47
+ read_database_config
48
+ get_root_password
49
+ check_root_password
50
+
51
+ db = $DB_CONFIG["database"]
52
+ user = "root"
53
+ pass = $ROOT_PW
54
+
55
+ drop_existing(db, user, pass)
56
+ create_db(db, user, pass)
57
+ grant_permission_on_db(db, user, pass)
@@ -0,0 +1,60 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ require "bundler/setup"
3
+ require "test/unit"
4
+ require "active_record"
5
+ require "assertions"
6
+ require "database_cleaner"
7
+ require "acts_as_archival"
8
+
9
+ def prepare_for_tests
10
+ setup_logging if ENV["LOGGING_ENABLED"]
11
+ setup_active_record
12
+ setup_database_cleaner
13
+ create_test_tables
14
+ require_test_classes
15
+ end
16
+
17
+ def setup_logging
18
+ require "logger"
19
+ logfile = File.dirname(__FILE__) + "/debug.log"
20
+ ActiveRecord::Base.logger = Logger.new(logfile)
21
+ end
22
+
23
+ def setup_active_record
24
+ dbconfig_file = File.dirname(__FILE__) + "/database.yml"
25
+ dbconfig = YAML.load File.read(dbconfig_file)
26
+ ActiveRecord::Base.establish_connection(dbconfig)
27
+ end
28
+
29
+ def setup_database_cleaner
30
+ DatabaseCleaner.strategy = :truncation
31
+ ActiveSupport::TestCase.send(:setup) do
32
+ DatabaseCleaner.clean
33
+ end
34
+ end
35
+
36
+ def create_test_tables
37
+ schema_file = File.dirname(__FILE__) + "/schema.rb"
38
+ load(schema_file) if File.exist?(schema_file)
39
+ end
40
+
41
+ def require_test_classes
42
+ ActiveSupport::Inflector.inflections do |inflect|
43
+ inflect.irregular "poly", "polys"
44
+ end
45
+
46
+ [:archival,
47
+ :archival_kid,
48
+ :archival_grandkid,
49
+ :independent_archival,
50
+ :exploder,
51
+ :plain,
52
+ :mass_attribute_protected,
53
+ :readonly_when_archived,
54
+ :missing_archived_at,
55
+ :missing_archive_number,
56
+ :poly
57
+ ].each {|test_class_file| require_relative "fixtures/#{test_class_file}"}
58
+ end
59
+
60
+ prepare_for_tests
@@ -0,0 +1,25 @@
1
+ require_relative "test_helper"
2
+
3
+ class ThroughAssociationTest < ActiveSupport::TestCase
4
+ test "archive a through associated object whose 'bridge' is archival" do
5
+ archival = Archival.create!
6
+ bridge = archival.archival_kids.create!
7
+ through = bridge.archival_grandkids.create!
8
+ archival.archive
9
+
10
+ assert archival.reload.archived?
11
+ assert bridge.reload.archived?
12
+ assert through.reload.archived?
13
+ end
14
+
15
+ # TODO Make something like this pass
16
+ # test "archive a through associated object whose 'bridge' is not archival" do
17
+ # archival = Archival.create!
18
+ # bridge = archival.independent_archival_kids.create!
19
+ # through = bridge.archival_grandkids.create!
20
+ # archival.archive
21
+
22
+ # assert archival.reload.archived?
23
+ # assert through.reload.archived?
24
+ # end
25
+ end
@@ -0,0 +1,32 @@
1
+ require_relative "test_helper"
2
+ require "rr"
3
+
4
+ class TransactionTest < ActiveSupport::TestCase
5
+ include RR::Adapters::TestUnit
6
+
7
+ test "archiving is transactional" do
8
+ archival = Archival.create!
9
+ exploder = archival.exploders.create!
10
+ any_instance_of(Exploder) do |exploder|
11
+ stub(exploder).archive { raise "Rollback Imminent" }
12
+ end
13
+ archival.archive
14
+
15
+ assert_not archival.archived?, "If this failed, you might be trying to test on a system that doesn't support nested transactions"
16
+ assert_not exploder.reload.archived?
17
+ end
18
+
19
+ test "unarchiving is transactional" do
20
+ archival = Archival.create!
21
+ exploder = archival.exploders.create!
22
+ any_instance_of(Exploder) do |exploder|
23
+ stub(exploder).unarchive { raise "Rollback Imminent" }
24
+ end
25
+ archival.archive
26
+ archival.unarchive
27
+
28
+ assert archival.reload.archived?
29
+ assert exploder.reload.archived?
30
+ end
31
+
32
+ end
metadata ADDED
@@ -0,0 +1,235 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_archival
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joel Meador
9
+ - Michael Kuehl
10
+ - Matthew Gordon
11
+ - Vojtech Salbaba
12
+ - David Jones
13
+ - Dave Woodward
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+ date: 2012-03-04 00:00:00.000000000 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: activerecord
21
+ requirement: &70256103651080 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ type: :runtime
28
+ prerelease: false
29
+ version_requirements: *70256103651080
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: &70256103650640 !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: *70256103650640
41
+ - !ruby/object:Gem::Dependency
42
+ name: assertions-eb
43
+ requirement: &70256103650140 !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: *70256103650140
52
+ - !ruby/object:Gem::Dependency
53
+ name: rake
54
+ requirement: &70256103649660 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: *70256103649660
63
+ - !ruby/object:Gem::Dependency
64
+ name: mysql2
65
+ requirement: &70256103648960 !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: *70256103648960
74
+ - !ruby/object:Gem::Dependency
75
+ name: highline
76
+ requirement: &70256103648360 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: *70256103648360
85
+ - !ruby/object:Gem::Dependency
86
+ name: rr
87
+ requirement: &70256103647620 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: *70256103647620
96
+ - !ruby/object:Gem::Dependency
97
+ name: database_cleaner
98
+ requirement: &70256103646620 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: *70256103646620
107
+ description: ! 'We had the problem that acts_as_paranoid and similar plugins/gems
108
+ always work on
109
+
110
+ a record by record basis and made it very difficult to restore records
111
+
112
+ atomically (or archive them, for that matter).
113
+
114
+
115
+ Because the archive and unarchive methods are in transactions, and every
116
+
117
+ archival record involved gets the same archive number upon archiving, you can
118
+
119
+ easily restore or remove an entire set of records without having to worry about
120
+
121
+ partial deletion or restoration.
122
+
123
+
124
+ Additionally, other plugins generally screw with how destroy/delete work. We
125
+
126
+ don''t because we actually want to be able to destroy records.
127
+
128
+ '
129
+ email:
130
+ - joel@expectedbehavior.com
131
+ - michael@expectedbehavior.com
132
+ - matt@expectedbehavior.com
133
+ executables: []
134
+ extensions: []
135
+ extra_rdoc_files: []
136
+ files:
137
+ - .gitignore
138
+ - .rvmrc
139
+ - CHANGELOG.md
140
+ - Gemfile
141
+ - Gemfile.lock
142
+ - LICENSE
143
+ - README.md
144
+ - Rakefile
145
+ - acts_as_archival.gemspec
146
+ - init.rb
147
+ - lib/acts_as_archival.rb
148
+ - lib/acts_as_archival/version.rb
149
+ - lib/expected_behavior/acts_as_archival.rb
150
+ - lib/expected_behavior/acts_as_archival_active_record_methods.rb
151
+ - test/ambiguous_table_test.rb
152
+ - test/associations_test.rb
153
+ - test/basic_test.rb
154
+ - test/column_test.rb
155
+ - test/database.yml
156
+ - test/deep_nesting_test.rb
157
+ - test/fixtures/archival.rb
158
+ - test/fixtures/archival_grandkid.rb
159
+ - test/fixtures/archival_kid.rb
160
+ - test/fixtures/exploder.rb
161
+ - test/fixtures/independent_archival.rb
162
+ - test/fixtures/mass_attribute_protected.rb
163
+ - test/fixtures/missing_archive_number.rb
164
+ - test/fixtures/missing_archived_at.rb
165
+ - test/fixtures/plain.rb
166
+ - test/fixtures/poly.rb
167
+ - test/fixtures/readonly_when_archived.rb
168
+ - test/mass_attribute_test.rb
169
+ - test/polymorphic_test.rb
170
+ - test/readonly_when_archived_test.rb
171
+ - test/responds_test.rb
172
+ - test/schema.rb
173
+ - test/scope_test.rb
174
+ - test/script/db_setup
175
+ - test/test_helper.rb
176
+ - test/through_association_test.rb
177
+ - test/transaction_test.rb
178
+ homepage: http://expectedbehavior.com
179
+ licenses: []
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ segments:
191
+ - 0
192
+ hash: -1239227818634757629
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ segments:
200
+ - 0
201
+ hash: -1239227818634757629
202
+ requirements: []
203
+ rubyforge_project:
204
+ rubygems_version: 1.8.16
205
+ signing_key:
206
+ specification_version: 3
207
+ summary: Atomic archiving/unarchiving for ActiveRecord-based apps
208
+ test_files:
209
+ - test/ambiguous_table_test.rb
210
+ - test/associations_test.rb
211
+ - test/basic_test.rb
212
+ - test/column_test.rb
213
+ - test/database.yml
214
+ - test/deep_nesting_test.rb
215
+ - test/fixtures/archival.rb
216
+ - test/fixtures/archival_grandkid.rb
217
+ - test/fixtures/archival_kid.rb
218
+ - test/fixtures/exploder.rb
219
+ - test/fixtures/independent_archival.rb
220
+ - test/fixtures/mass_attribute_protected.rb
221
+ - test/fixtures/missing_archive_number.rb
222
+ - test/fixtures/missing_archived_at.rb
223
+ - test/fixtures/plain.rb
224
+ - test/fixtures/poly.rb
225
+ - test/fixtures/readonly_when_archived.rb
226
+ - test/mass_attribute_test.rb
227
+ - test/polymorphic_test.rb
228
+ - test/readonly_when_archived_test.rb
229
+ - test/responds_test.rb
230
+ - test/schema.rb
231
+ - test/scope_test.rb
232
+ - test/script/db_setup
233
+ - test/test_helper.rb
234
+ - test/through_association_test.rb
235
+ - test/transaction_test.rb