mongoid-history 0.6.1 → 0.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d92239564a7df075b3a55eb68c9f7f22666e24ef
4
- data.tar.gz: 13f5bb15f7102d5b0957b569cb880af4249a0c75
3
+ metadata.gz: c2d2105bf114627851d9fca6f7b7117f4766b0d9
4
+ data.tar.gz: bfc95d7ddcfcdd2b977f799641d63b61d2da3b45
5
5
  SHA512:
6
- metadata.gz: e9b09271720419ebbd843f78954d182430e4a3e5f020cc6b835993154c08fa55e6c8627beaef64f8813632ce15118186057d39771ddb863cf40f28a68c6ce7d3
7
- data.tar.gz: 8d337e3008f6468a42b01c0babafa649685237f686e255bd620d380bf8d91bf77d56888445ca20b043ee6f2e7398d4821709fb877bafe11765948fc38ee6ddad
6
+ metadata.gz: b2a0ef3daab0538b8d7a853f3e1c1f40d10a244521fd9811ee6feff55529ae1d58d685126262510bc0311da2bb0184f6c5b1d883accbd02742e665346ab84b93
7
+ data.tar.gz: d2358b6e8625a06aa1a52a1de2783d15b4a86cfb3b644055912ecae13063cc951c22440f38e9837c43810e780c8f220ff10936e8558fdf57be8ca6b2d4afd38c
@@ -1,92 +1,101 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2015-09-17 17:43:47 -0400 using RuboCop version 0.34.1.
3
+ # on 2017-04-09 18:25:15 -0400 using RuboCop version 0.48.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ # Offense count: 6
10
+ # Configuration parameters: Include.
11
+ # Include: **/Gemfile, **/gems.rb
12
+ Bundler/DuplicatedGem:
13
+ Exclude:
14
+ - 'Gemfile'
15
+
9
16
  # Offense count: 3
10
17
  Lint/HandleExceptions:
11
18
  Exclude:
12
19
  - 'spec/unit/trackable_spec.rb'
13
20
 
14
- Metrics/ClassLength:
15
- Max: 103
21
+ # Offense count: 2
22
+ Lint/ParenthesesAsGroupedExpression:
23
+ Exclude:
24
+ - 'spec/integration/integration_spec.rb'
16
25
 
17
- # Offense count: 12
26
+ # Offense count: 21
18
27
  Metrics/AbcSize:
19
- Max: 60
28
+ Max: 50
29
+
30
+ # Offense count: 100
31
+ # Configuration parameters: CountComments, ExcludedMethods.
32
+ Metrics/BlockLength:
33
+ Max: 801
34
+
35
+ # Offense count: 1
36
+ # Configuration parameters: CountComments.
37
+ Metrics/ClassLength:
38
+ Max: 124
20
39
 
21
40
  # Offense count: 4
22
41
  Metrics/CyclomaticComplexity:
23
42
  Max: 10
24
43
 
25
- # Offense count: 199
26
- # Configuration parameters: AllowURI, URISchemes.
44
+ # Offense count: 435
45
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
46
+ # URISchemes: http, https
27
47
  Metrics/LineLength:
28
48
  Max: 688
29
49
 
30
- # Offense count: 7
50
+ # Offense count: 13
31
51
  # Configuration parameters: CountComments.
32
52
  Metrics/MethodLength:
33
- Max: 33
53
+ Max: 23
34
54
 
35
55
  # Offense count: 2
36
56
  # Configuration parameters: CountComments.
37
57
  Metrics/ModuleLength:
38
- Max: 223
58
+ Max: 176
39
59
 
40
60
  # Offense count: 4
41
61
  Metrics/PerceivedComplexity:
42
62
  Max: 12
43
63
 
44
- # Offense count: 44
64
+ # Offense count: 12
45
65
  Style/Documentation:
46
66
  Exclude:
67
+ - 'spec/**/*'
68
+ - 'test/**/*'
47
69
  - 'lib/mongoid/history.rb'
48
- - 'lib/mongoid/history/options.rb'
49
- - 'lib/mongoid/history/trackable.rb'
50
- - 'lib/mongoid/history/tracker.rb'
51
- - 'lib/mongoid/history/version.rb'
52
70
  - 'lib/mongoid/history/attributes/base.rb'
53
71
  - 'lib/mongoid/history/attributes/create.rb'
54
72
  - 'lib/mongoid/history/attributes/destroy.rb'
55
73
  - 'lib/mongoid/history/attributes/update.rb'
56
- - 'spec/integration/embedded_in_polymorphic_spec.rb'
57
- - 'spec/integration/integration_spec.rb'
58
- - 'spec/integration/multi_relation_spec.rb'
59
- - 'spec/integration/nested_embedded_documents_spec.rb'
60
- - 'spec/integration/nested_embedded_polymorphic_documents_spec.rb'
61
- - 'spec/integration/subclasses_spec.rb'
62
- - 'spec/support/mongoid_history.rb'
63
- - 'spec/unit/options_spec.rb'
64
- - 'spec/unit/singleton_methods_spec.rb'
65
- - 'spec/unit/trackable_spec.rb'
66
- - 'spec/unit/tracker_spec.rb'
67
- - 'spec/unit/attributes/base_spec.rb'
68
- - 'spec/unit/attributes/create_spec.rb'
69
- - 'spec/unit/attributes/destroy_spec.rb'
70
- - 'spec/unit/attributes/update_spec.rb'
74
+ - 'lib/mongoid/history/options.rb'
75
+ - 'lib/mongoid/history/trackable.rb'
76
+ - 'lib/mongoid/history/tracker.rb'
71
77
 
72
- # Offense count: 6
78
+ # Offense count: 3
79
+ # Cop supports --auto-correct.
73
80
  Style/EachWithObject:
74
81
  Exclude:
75
82
  - 'lib/mongoid/history/trackable.rb'
76
83
  - 'lib/mongoid/history/tracker.rb'
77
84
 
78
- # Offense count: 1
79
- # Configuration parameters: Exclude.
85
+ # Offense count: 2
86
+ # Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
87
+ # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
80
88
  Style/FileName:
81
89
  Exclude:
90
+ - 'Dangerfile'
82
91
  - 'lib/mongoid-history.rb'
83
92
 
84
- # Offense count: 3
85
- Style/MultilineBlockChain:
93
+ # Offense count: 1
94
+ Style/IfInsideElse:
86
95
  Exclude:
87
96
  - 'lib/mongoid/history/trackable.rb'
88
- - 'lib/mongoid/history/tracker.rb'
89
97
 
90
- Style/ClassLength:
98
+ # Offense count: 1
99
+ Style/MultilineBlockChain:
91
100
  Exclude:
92
- - 'lib/mongoid/history/options.rb'
101
+ - 'lib/mongoid/history/tracker.rb'
@@ -1,3 +1,8 @@
1
+ ### 0.7.0 (2017/11/14)
2
+
3
+ * [#202](https://github.com/mongoid/mongoid-history/pull/202): Do not create tracker on persistence error - [@mikwat](https://github.com/mikwat).
4
+ * [#196](https://github.com/mongoid/mongoid-history/pull/196): Fix bug causing history tracks to get mixed up between multiple trackers when using multiple trackers - [@ojbucao](https://github.com/ojbucao).
5
+
1
6
  ### 0.6.1 (2017/01/04)
2
7
 
3
8
  * [#182](https://github.com/mongoid/mongoid-history/pull/182): No-op on repeated calls to destroy - [@msaffitz](https://github.com/msaffitz).
data/Gemfile CHANGED
@@ -20,16 +20,17 @@ else
20
20
  end
21
21
 
22
22
  group :development, :test do
23
- gem 'rake', '< 11.0'
24
23
  gem 'bundler'
24
+ gem 'pry'
25
+ gem 'rake', '< 11.0'
25
26
  end
26
27
 
27
28
  group :test do
29
+ gem 'coveralls'
30
+ gem 'gem-release'
28
31
  gem 'mongoid-danger', '~> 0.1.0', require: false
32
+ gem 'request_store'
29
33
  gem 'rspec', '~> 3.1'
30
- gem 'rubocop', '0.34.1'
34
+ gem 'rubocop', '0.48.1'
31
35
  gem 'yard'
32
- gem 'gem-release'
33
- gem 'coveralls'
34
- gem 'request_store'
35
36
  end
data/README.md CHANGED
@@ -37,8 +37,8 @@ end
37
37
  **Set default tracker class name (Optional)**
38
38
 
39
39
  Mongoid::History will use the first loaded class to include Mongoid::History::Tracker as the
40
- default history tracker. If you are using multiple Tracker classes and would like to set
41
- a global default you may do so in a Rails initializer:
40
+ default history tracker. If you are using multiple Tracker classes, you should set a global
41
+ default in a Rails initializer:
42
42
 
43
43
  ```ruby
44
44
  # config/initializers/mongoid_history.rb
@@ -509,6 +509,57 @@ end
509
509
 
510
510
  For more examples, check out [spec/integration/integration_spec.rb](spec/integration/integration_spec.rb).
511
511
 
512
+ **Multiple Trackers**
513
+
514
+ You can have different trackers for different classes like so.
515
+
516
+ ```
517
+ class First
518
+ include Mongoid::Document
519
+ include Mongoid::History::Trackable
520
+
521
+ field :text, type: String
522
+ track_history on: [:text],
523
+ tracker_class_name: :first_history_tracker
524
+ end
525
+
526
+ class Second
527
+ include Mongoid::Document
528
+ include Mongoid::History::Trackable
529
+
530
+ field :text, type: String
531
+ track_history on: [:text],
532
+ tracker_class_name: :second_history_tracker
533
+ end
534
+
535
+ class FirstHistoryTracker
536
+ include Mongoid::History::Tracker
537
+ end
538
+
539
+ class SecondHistoryTracker
540
+ include Mongoid::History::Tracker
541
+ end
542
+ ```
543
+
544
+ Note that if you are using a tracker for an embedded object that is different
545
+ from the parent's tracker, redos and undos will not work. You have to use the
546
+ same tracker for these to work across embedded relationships.
547
+
548
+ If you are using multiple trackers and the `tracker_class_name` parameter is
549
+ not specified, Mongoid::History will use the default tracker configured in the
550
+ initializer file or whatever the first tracker was loaded.
551
+
552
+
553
+ **Dependent Restrict Associations**
554
+
555
+ When `dependent: :restrict` is used on an association, a call to `destroy` on
556
+ the model will raise `Mongoid::Errors::DeleteRestriction` when the dependency
557
+ is violated. Just be aware that this gem will create a history track document
558
+ before the `destroy` call and then remove if an error is raised. This applies
559
+ to all persistence calls: create, update and destroy.
560
+
561
+ See [spec/integration/validation_failure_spec.rb](spec/integration/validation_failure_spec.rb)
562
+ for examples.
512
563
 
513
564
  **Thread Safety**
514
565
 
@@ -0,0 +1,68 @@
1
+ Releasing Mongoid::History
2
+ ========================
3
+
4
+ There're no particular rules about when to release mongoid-history. Release bug fixes frequently, features not so frequently and breaking API changes rarely.
5
+
6
+ ### Release
7
+
8
+ Run tests, check that all tests succeed locally.
9
+
10
+ ```
11
+ bundle install
12
+ bundle exec rake
13
+ ```
14
+
15
+ Check that the last build succeeded in [Travis CI](https://travis-ci.org/mongoid/mongoid-history) for all supported platforms.
16
+
17
+ Increment the version, modify [lib/mongoid/history/version.rb](lib/mongoid/history/version.rb).
18
+
19
+ * Increment the third number if the release has bug fixes and/or very minor features, only (eg. change `0.5.1` to `0.5.2`).
20
+ * Increment the second number if the release contains major features or breaking API changes (eg. change `0.5.1` to `0.4.0`).
21
+
22
+ Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version.
23
+
24
+ ```
25
+ ### 0.4.0 (2014-01-27)
26
+ ```
27
+
28
+ Remove the line with "Your contribution here.", since there will be no more contributions to this release.
29
+
30
+ Commit your changes.
31
+
32
+ ```
33
+ git add CHANGELOG.md lib/mongoid/history/version.rb
34
+ git commit -m "Preparing for release, 0.4.0."
35
+ git push origin master
36
+ ```
37
+
38
+ Release.
39
+
40
+ ```
41
+ $ rake release
42
+
43
+ mongoid-history 0.4.0 built to pkg/mongoid-history-0.4.0.gem.
44
+ Tagged v0.4.0.
45
+ Pushed git commits and tags.
46
+ Pushed mongoid-history 0.4.0 to rubygems.org.
47
+ ```
48
+
49
+ ### Prepare for the Next Version
50
+
51
+ Add the next release to [CHANGELOG.md](CHANGELOG.md).
52
+
53
+ ```
54
+ Next Release
55
+ ============
56
+
57
+ * Your contribution here.
58
+ ```
59
+
60
+ Increment the minor version, modify [lib/mongoid/history/version.rb](lib/mongoid/history/version.rb).
61
+
62
+ Commit your changes.
63
+
64
+ ```
65
+ git add CHANGELOG.md lib/mongoid/history/version.rb
66
+ git commit -m "Preparing for next release, 0.4.1."
67
+ git push origin master
68
+ ```
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ end
18
18
  require 'rubocop/rake_task'
19
19
  RuboCop::RakeTask.new(:rubocop)
20
20
 
21
- task default: [:rubocop, :spec]
21
+ task default: %i[rubocop spec]
22
22
 
23
23
  require 'yard'
24
24
  YARD::Rake::YardocTask.new
@@ -0,0 +1,9 @@
1
+ ### Upgrading to 0.7.0
2
+
3
+ #### Remove history track when create, update or destroy raises an error
4
+
5
+ When an error is raised in a call to create, update or destroy a tracked model, any history track
6
+ created before the call will now be deleted. In the past this was a problem for associations marked
7
+ `dependent: :restrict`.
8
+
9
+ See [#202](https://github.com/mongoid/mongoid-history/pull/202) for more information.
@@ -11,7 +11,7 @@ require 'mongoid/history/trackable'
11
11
 
12
12
  module Mongoid
13
13
  module History
14
- GLOBAL_TRACK_HISTORY_FLAG = 'mongoid_history_trackable_enabled'
14
+ GLOBAL_TRACK_HISTORY_FLAG = 'mongoid_history_trackable_enabled'.freeze
15
15
 
16
16
  class << self
17
17
  attr_accessor :tracker_class_name
@@ -40,8 +40,8 @@ module Mongoid
40
40
  rel = aliased_fields.key(rel) || rel
41
41
  @attributes[rel] = [nil,
42
42
  trackable.send(rel)
43
- .reject { |obj| obj.respond_to?(paranoia_field) && obj.public_send(paranoia_field).present? }
44
- .map { |obj| format_embeds_many_relation(rel, obj.attributes) }]
43
+ .reject { |obj| obj.respond_to?(paranoia_field) && obj.public_send(paranoia_field).present? }
44
+ .map { |obj| format_embeds_many_relation(rel, obj.attributes) }]
45
45
  end
46
46
  end
47
47
  end
@@ -14,19 +14,19 @@ module Mongoid
14
14
 
15
15
  def insert_embeds_one_changes
16
16
  trackable_class.tracked_embeds_one
17
- .map { |rel| aliased_fields.key(rel) || rel }
18
- .each do |rel|
19
- obj = trackable.send(rel)
20
- @attributes[rel] = [format_embeds_one_relation(rel, obj.attributes), nil] if obj
21
- end
17
+ .map { |rel| aliased_fields.key(rel) || rel }
18
+ .each do |rel|
19
+ obj = trackable.send(rel)
20
+ @attributes[rel] = [format_embeds_one_relation(rel, obj.attributes), nil] if obj
21
+ end
22
22
  end
23
23
 
24
24
  def insert_embeds_many_changes
25
25
  trackable_class.tracked_embeds_many
26
- .map { |rel| aliased_fields.key(rel) || rel }
27
- .each do |rel|
28
- @attributes[rel] = [trackable.send(rel).map { |obj| format_embeds_many_relation(rel, obj.attributes) }, nil]
29
- end
26
+ .map { |rel| aliased_fields.key(rel) || rel }
27
+ .each do |rel|
28
+ @attributes[rel] = [trackable.send(rel).map { |obj| format_embeds_many_relation(rel, obj.attributes) }, nil]
29
+ end
30
30
  end
31
31
  end
32
32
  end
@@ -33,9 +33,9 @@ module Mongoid
33
33
  paranoia_field = Mongoid::History.trackable_class_settings(relation_class)[:paranoia_field]
34
34
  @attributes[relation] = []
35
35
  @attributes[relation][0] = value[0].reject { |rel| rel[paranoia_field].present? }
36
- .map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
36
+ .map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
37
37
  @attributes[relation][1] = value[1].reject { |rel| rel[paranoia_field].present? }
38
- .map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
38
+ .map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
39
39
  end
40
40
  end
41
41
  end
@@ -24,7 +24,7 @@ module Mongoid
24
24
  def default_options
25
25
  @default_options ||=
26
26
  { on: :all,
27
- except: [:created_at, :updated_at],
27
+ except: %i[created_at updated_at],
28
28
  tracker_class_name: nil,
29
29
  modifier_field: :modifier,
30
30
  version_field: :version,
@@ -83,7 +83,7 @@ module Mongoid
83
83
  Going forward, :all will track all the fields and relations for the class"
84
84
  end
85
85
 
86
- @options[:on] = options[:on].map { |opt| (opt == :all) ? :fields : opt }
86
+ @options[:on] = options[:on].map { |opt| opt == :all ? :fields : opt }
87
87
 
88
88
  if options[:on].include?(:fields)
89
89
  @options[:on] = options[:on].reject { |opt| opt == :fields }
@@ -163,7 +163,7 @@ module Mongoid
163
163
  @options[:relations][:embeds_one][field] = if field_options.blank?
164
164
  relation_class.fields.keys
165
165
  else
166
- %w(_id) | field_options.map { |opt| relation_class.database_field_name(opt) }
166
+ %w[_id] | field_options.map { |opt| relation_class.database_field_name(opt) }
167
167
  end
168
168
  end
169
169
 
@@ -172,7 +172,7 @@ module Mongoid
172
172
  @options[:relations][:embeds_many][field] = if field_options.blank?
173
173
  relation_class.fields.keys
174
174
  else
175
- %w(_id) | field_options.map { |opt| relation_class.database_field_name(opt) }
175
+ %w[_id] | field_options.map { |opt| relation_class.database_field_name(opt) }
176
176
  end
177
177
  end
178
178
 
@@ -22,9 +22,9 @@ module Mongoid
22
22
  delegate :history_trackable_options, to: 'self.class'
23
23
  delegate :track_history?, to: 'self.class'
24
24
 
25
- before_update :track_update if options[:track_update]
26
- before_create :track_create if options[:track_create]
27
- before_destroy :track_destroy if options[:track_destroy]
25
+ around_update :track_update if options[:track_update]
26
+ around_create :track_create if options[:track_create]
27
+ around_destroy :track_destroy if options[:track_destroy]
28
28
 
29
29
  Mongoid::History.trackable_class_options ||= {}
30
30
  Mongoid::History.trackable_class_options[options_parser.scope] = options
@@ -131,7 +131,7 @@ module Mongoid
131
131
  elsif options[:last]
132
132
  versions = history_tracks.limit(options[:last])
133
133
  else
134
- fail 'Invalid options, please specify (:from / :to) keys or :last key.'
134
+ raise 'Invalid options, please specify (:from / :to) keys or :last key.'
135
135
  end
136
136
  else
137
137
  options_or_version = options_or_version.to_a if options_or_version.is_a?(Range)
@@ -178,7 +178,7 @@ module Mongoid
178
178
  relation.class_name == node.metadata.class_name.to_s && relation.name == node.metadata.name
179
179
  else
180
180
  relation.class_name == node.relation_metadata.class_name.to_s &&
181
- relation.name == node.relation_metadata.name
181
+ relation.name == node.relation_metadata.name
182
182
  end
183
183
  end
184
184
  end
@@ -232,16 +232,16 @@ module Mongoid
232
232
  @history_tracker_attributes
233
233
  end
234
234
 
235
- def track_create
236
- track_history_for_action(:create)
235
+ def track_create(&block)
236
+ track_history_for_action(:create, &block)
237
237
  end
238
238
 
239
- def track_update
240
- track_history_for_action(:update)
239
+ def track_update(&block)
240
+ track_history_for_action(:update, &block)
241
241
  end
242
242
 
243
- def track_destroy
244
- track_history_for_action(:destroy) unless destroyed?
243
+ def track_destroy(&block)
244
+ track_history_for_action(:destroy, &block) unless destroyed?
245
245
  end
246
246
 
247
247
  def clear_trackable_memoization
@@ -273,9 +273,20 @@ module Mongoid
273
273
  if track_history_for_action?(action)
274
274
  current_version = (send(history_trackable_options[:version_field]) || 0) + 1
275
275
  send("#{history_trackable_options[:version_field]}=", current_version)
276
- self.class.tracker_class.create!(history_tracker_attributes(action.to_sym).merge(version: current_version, action: action.to_s, trackable: self))
276
+ last_track = self.class.tracker_class.create!(history_tracker_attributes(action.to_sym).merge(version: current_version, action: action.to_s, trackable: self))
277
277
  end
278
+
278
279
  clear_trackable_memoization
280
+
281
+ begin
282
+ yield
283
+ rescue => e
284
+ if track_history_for_action?(action)
285
+ send("#{history_trackable_options[:version_field]}=", current_version - 1)
286
+ last_track.destroy
287
+ end
288
+ raise e
289
+ end
279
290
  end
280
291
  end
281
292
 
@@ -445,8 +456,8 @@ module Mongoid
445
456
  def tracked_embeds_one
446
457
  @tracked_embeds_one ||= begin
447
458
  reflect_on_all_associations(:embeds_one)
448
- .map(&:key)
449
- .select { |rel| history_trackable_options[:relations][:embeds_one].include? rel }
459
+ .map(&:key)
460
+ .select { |rel| history_trackable_options[:relations][:embeds_one].include? rel }
450
461
  end
451
462
  end
452
463
 
@@ -469,8 +480,8 @@ module Mongoid
469
480
  def tracked_embeds_many
470
481
  @tracked_embeds_many ||= begin
471
482
  reflect_on_all_associations(:embeds_many)
472
- .map(&:key)
473
- .select { |rel| history_trackable_options[:relations][:embeds_many].include? rel }
483
+ .map(&:key)
484
+ .select { |rel| history_trackable_options[:relations][:embeds_many].include? rel }
474
485
  end
475
486
  end
476
487