once-ler 2.2.0 → 2.3.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
  SHA256:
3
- metadata.gz: 464a3716947fee3bdad906f36afa6d8734f01fb6b54700a976137d3abd4d9dbe
4
- data.tar.gz: 0ee50e4bab98a18869676dc557622f2bb8f82ea623b3c485ab30fea6eb7bf099
3
+ metadata.gz: b0b20c91e0119b7c52664f20bf7845edc455c6a8104014cbf533ce3bbc73783c
4
+ data.tar.gz: ce0eeec381933d756630b23c9c90c2b9e8d2c921c1fe20c3fea455fcc36b263e
5
5
  SHA512:
6
- metadata.gz: e48afad18c5e1a70a04d0eb30b5b19246ad8f0cc529a0eb719635162443d400c69fafa3529605dfcc4defb2a6053af01dfdc039c4543d62f57b042fba1420ee6
7
- data.tar.gz: af4cbef0238cea9cab123b3a609c3159d4df52fdf99c0a25dfcd8b7eaaadf723dc9d7a1f5e0dfa3149f289fce5fd0bafffda368d8a1898d21176adade475fb29
6
+ metadata.gz: 844575394b40e652f8dfe8e927269930d595611c9cbb27acfb12afcdf59a68d01df31017e84e52897b8294f32f891f0df831041f25d7faddf7fe8e55a0a58355
7
+ data.tar.gz: a170009e5db17f3b9ba0d367695e0c5ed4bee6f1b0c03675951e0466946ecef984737fc57c2ee04025346ff5841566e424200b85a37bc7fd3caf109a02eca0c6
data/lib/once-ler.rb CHANGED
@@ -1 +1,3 @@
1
- require 'onceler'
1
+ # frozen_string_literal: true
2
+
3
+ require "onceler"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Onceler
2
4
  module AmbitiousHelpers
3
5
  # make :once the default behavior for before/let/etc.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "onceler/ambitious_helpers"
2
4
  require "onceler/recorder"
3
5
 
@@ -15,26 +17,27 @@ module Onceler
15
17
  def let_once(name, &block)
16
18
  raise ArgumentError, "wrong number of arguments (0 for 1)" if name.nil?
17
19
  raise "#let or #subject called without a block" if block.nil?
18
- onceler(:create)[name] = block
20
+
21
+ onceler(create_own: true)[name] = block
19
22
  add_onceler_hooks!
20
23
  @current_let_once = name
21
24
  define_method(name) { onceler[name] }
22
25
  end
23
26
 
24
- # TODO NamedSubjectPreventSuper
25
- def subject_once(name = nil, &block)
27
+ # TODO: NamedSubjectPreventSuper
28
+ def subject_once(name = nil, &)
26
29
  name ||= :subject
27
- let_once(name, &block)
30
+ let_once(name, &)
28
31
  alias_method :subject, name if name != :subject
29
32
  end
30
33
 
31
34
  def around_once(&block)
32
- onceler(:create).add_around(block)
35
+ onceler(create_own: true).add_around(block)
33
36
  add_onceler_hooks!
34
37
  end
35
38
 
36
39
  def before_once(&block)
37
- onceler(:create) << block
40
+ onceler(create_own: true) << block
38
41
  add_onceler_hooks!
39
42
  end
40
43
 
@@ -44,22 +47,20 @@ module Onceler
44
47
 
45
48
  # add second scope argument to explicitly differentiate between
46
49
  # :each / :once
47
- [:let, :let!, :subject, :subject!].each do |method|
48
- once_method = (method.to_s.sub(/!\z/, '') + "_once").to_sym
50
+ %i[let let! subject subject!].each do |method|
51
+ once_method = :"#{method.to_s.delete_suffix("!")}_once"
49
52
  define_method(method) do |name = nil, scope = nil, &block|
50
53
  if once_scopes.include?(scope)
51
54
  send once_method, name, &block
52
55
  else
53
- super name, &block
56
+ super(name, &block)
54
57
  end
55
58
  end
56
- end
57
59
 
58
- # set up let_each, etc.
59
- [:let, :let!, :subject, :subject!].each do |method|
60
+ # set up let_each, etc.
60
61
  each_method = method.to_s
61
- bang = each_method.sub!(/!\z/, '')
62
- each_method = (each_method + "_each" + (bang ? "!" : "")).to_sym
62
+ bang = each_method.delete_suffix!("!")
63
+ each_method = :"#{each_method}_each#{"!" if bang}"
63
64
  define_method(each_method) do |name = nil, &block|
64
65
  send method, name, :each, &block
65
66
  end
@@ -69,11 +70,11 @@ module Onceler
69
70
  scope = args.first
70
71
  case scope
71
72
  when :record, :reset
72
- onceler(:create).hooks[:before][scope] << block
73
+ onceler(create_own: true).hooks[:before][scope] << block
73
74
  when *once_scopes
74
75
  before_once(&block)
75
76
  else
76
- super(*args, &block)
77
+ super
77
78
  end
78
79
  end
79
80
 
@@ -81,26 +82,26 @@ module Onceler
81
82
  scope = args.first
82
83
  case scope
83
84
  when :record, :reset
84
- onceler(:create).hooks[:after][scope] << block
85
+ onceler(create_own: true).hooks[:after][scope] << block
85
86
  else
86
87
  super
87
88
  end
88
89
  end
89
90
 
90
- def around(*args, &block)
91
+ def around(*args, &)
91
92
  scope = args.first
92
93
  case scope
93
94
  when *once_scopes
94
- around_once(&block)
95
+ around_once(&)
95
96
  when :once_and_each
96
- around_once(&block)
97
- around(:each, &block)
97
+ around_once(&)
98
+ around(:each, &)
98
99
  else
99
- super(*args, &block)
100
+ super
100
101
  end
101
102
  end
102
103
 
103
- def onceler(create_own = false)
104
+ def onceler(create_own: false)
104
105
  if create_own
105
106
  @onceler ||= Recorder.new(self)
106
107
  else
@@ -110,6 +111,7 @@ module Onceler
110
111
 
111
112
  def parent_onceler
112
113
  return unless superclass.respond_to?(:onceler)
114
+
113
115
  superclass.onceler
114
116
  end
115
117
 
@@ -117,6 +119,7 @@ module Onceler
117
119
 
118
120
  def add_onceler_hooks!
119
121
  return if @onceler_hooks_added
122
+
120
123
  @onceler_hooks_added = true
121
124
 
122
125
  before(:all) do |group|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Onceler
2
4
  def self.configuration
3
5
  @configuration ||= Configuration.new
@@ -18,8 +20,8 @@ module Onceler
18
20
 
19
21
  def hooks
20
22
  @hooks ||= {
21
- before: {record: [], reset: []},
22
- after: {record: [], reset: []}
23
+ before: { record: [], reset: [] },
24
+ after: { record: [], reset: [] }
23
25
  }
24
26
  end
25
27
 
@@ -1,25 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_record"
2
4
  require "rails/version"
3
5
 
4
6
  # monkey-patch this to not clear connections so that we don't lose our
5
7
  # transactions
6
8
 
7
- module ActiveRecord::TestFixtures
8
- def teardown_fixtures
9
- if ::Rails.version < "7.2"
10
- if run_in_transaction?
11
- ActiveSupport::Notifications.unsubscribe(@connection_subscriber) if @connection_subscriber
12
- @fixture_connections.each do |connection|
13
- connection.rollback_transaction if connection.transaction_open?
14
- connection.pool.lock_thread = false
9
+ module ActiveRecord
10
+ module TestFixtures
11
+ def teardown_fixtures
12
+ if ::Rails.version < "7.2"
13
+ if run_in_transaction?
14
+ ActiveSupport::Notifications.unsubscribe(@connection_subscriber) if @connection_subscriber
15
+ @fixture_connections.each do |connection|
16
+ connection.rollback_transaction if connection.transaction_open?
17
+ connection.pool.lock_thread = false
18
+ end
19
+ @fixture_connections.clear
20
+ teardown_shared_connection_pool
21
+ else
22
+ ActiveRecord::FixtureSet.reset_cache
15
23
  end
16
- @fixture_connections.clear
17
- teardown_shared_connection_pool
18
- else
19
- ActiveRecord::FixtureSet.reset_cache
20
- end
21
- else
22
- if run_in_transaction?
24
+ elsif run_in_transaction?
23
25
  teardown_transactional_fixtures
24
26
  else
25
27
  ActiveRecord::FixtureSet.reset_cache
@@ -1,4 +1,4 @@
1
- require "set"
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Onceler
4
4
  module Recordable
@@ -25,22 +25,20 @@ module Onceler
25
25
  instance_eval(&recording.block)
26
26
  end
27
27
 
28
- def __retvals(inherit = false)
28
+ def __retvals(inherit: false)
29
29
  retvals = @__inherited_retvals.merge(@__retvals)
30
- retvals.inject({}) do |hash, (key, val)|
30
+ retvals.each_with_object({}) do |(key, val), hash|
31
31
  hash[key] = val if __mutated?(key, val) || inherit
32
- hash
33
32
  end
34
33
  end
35
34
 
36
- def __ivars(inherit = false)
35
+ def __ivars(inherit: false)
37
36
  ivars = instance_variables - @__ignore_ivars
38
- ivars.inject({}) do |hash, key|
39
- if key.to_s !~ /\A@__/
37
+ ivars.each_with_object({}) do |key, hash|
38
+ unless /\A@__/.match?(key.to_s)
40
39
  val = instance_variable_get(key)
41
40
  hash[key] = val if __mutated?(key, val) || inherit
42
41
  end
43
- hash
44
42
  end
45
43
  end
46
44
 
@@ -53,13 +51,15 @@ module Onceler
53
51
  # memory (not reassigned), and nothing about it has been changed
54
52
  return true unless @__inherited_values[key].equal?(val)
55
53
  return true unless __values_equal?(@__inherited_cache[key], val)
54
+
56
55
  false
57
56
  end
58
57
 
59
58
  def __values_equal?(obj1, obj2)
60
- if ActiveRecord::Base === obj1 && ActiveRecord::Base === obj2
59
+ if obj1.is_a?(ActiveRecord::Base) && obj2.is_a?(ActiveRecord::Base)
61
60
  cache_key = [obj1, obj2]
62
61
  return @__comparison_cache[cache_key] if @__comparison_cache.key?(cache_key)
62
+
63
63
  # so as to avoid cycles while traversing AR associations
64
64
  @__comparison_cache[cache_key] = true
65
65
  @__comparison_cache[cache_key] = obj1.attributes == obj2.attributes &&
@@ -75,14 +75,14 @@ module Onceler
75
75
  cache1 = obj1.instance_variable_get(:@association_cache)
76
76
  cache2 = obj2.instance_variable_get(:@association_cache)
77
77
  cache1.size == cache2.size &&
78
- cache1.all? { |k, v| cache2.key?(k) && __values_equal?(v.target, cache2[k].target) }
78
+ cache1.all? { |k, v| cache2.key?(k) && __values_equal?(v.target, cache2[k].target) }
79
79
  end
80
80
 
81
- def __data(inherit = false)
81
+ def __data(inherit: false)
82
82
  @__data ||= {}
83
83
  @__data[inherit] ||= begin
84
84
  @__comparison_cache = {}
85
- data = [__ivars(inherit), __retvals(inherit)]
85
+ data = [__ivars(inherit:), __retvals(inherit:)]
86
86
  begin
87
87
  data = Marshal.dump(data)
88
88
  rescue TypeError
@@ -106,11 +106,11 @@ module Onceler
106
106
 
107
107
  def find_dump_error(key, val, prefix = "")
108
108
  return if __visited_dump_vars.include?(val)
109
+
109
110
  __visited_dump_vars << val
110
111
 
111
112
  Marshal.dump(val)
112
113
  rescue TypeError
113
-
114
114
  # see if anything inside val can't be dumped...
115
115
  sub_prefix = "#{prefix}#{key} (#<#{val.class}>) => "
116
116
 
@@ -124,25 +124,29 @@ module Onceler
124
124
  end
125
125
 
126
126
  # hash key/value?
127
- val.each_pair do |k, v|
128
- find_dump_error("hash key #{k}", k, sub_prefix)
129
- find_dump_error("[#{k.inspect}]", v, sub_prefix)
130
- end if val.respond_to?(:each_pair)
127
+ if val.respond_to?(:each_pair)
128
+ val.each_pair do |k, v|
129
+ find_dump_error("hash key #{k}", k, sub_prefix)
130
+ find_dump_error("[#{k.inspect}]", v, sub_prefix)
131
+ end
132
+ end
131
133
 
132
134
  # array element?
133
- val.each_with_index do |v, i|
134
- find_dump_error("[#{i}]", v, sub_prefix)
135
- end if val.respond_to?(:each_with_index)
135
+ if val.respond_to?(:each_with_index)
136
+ val.each_with_index do |v, i|
137
+ find_dump_error("[#{i}]", v, sub_prefix)
138
+ end
139
+ end
136
140
  end
137
141
 
138
142
  # guess it's val proper
139
- raise TypeError.new("Unable to dump #{prefix}#{key} (#<#{val.class}>) in #{self.class.metadata[:location]}: #{$!}")
143
+ raise TypeError, "Unable to dump #{prefix}#{key} (#<#{val.class}>) in #{self.class.metadata[:location]}: #{$!}"
140
144
  end
141
145
 
142
146
  def copy_from(other)
143
147
  # need two copies of things for __mutated? checks (see above)
144
- @__inherited_cache = Marshal.load(other.__data(:inherit)).inject(&:merge)
145
- ivars, retvals = Marshal.load(other.__data(:inherit))
148
+ @__inherited_cache = Marshal.load(other.__data(inherit: true)).inject(&:merge)
149
+ ivars, retvals = Marshal.load(other.__data(inherit: true))
146
150
  @__inherited_retvals = retvals
147
151
  @__inherited_values = ivars.merge(retvals)
148
152
  ivars.each do |key, value|
@@ -154,4 +158,3 @@ module Onceler
154
158
  end
155
159
  end
156
160
  end
157
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "onceler/recordable"
2
4
 
3
5
  module Onceler
@@ -33,7 +35,7 @@ module Onceler
33
35
  end
34
36
 
35
37
  def [](name)
36
- if @retvals && @retvals.key?(name)
38
+ if @retvals&.key?(name)
37
39
  @retvals[name]
38
40
  elsif parent
39
41
  parent[name]
@@ -63,7 +65,7 @@ module Onceler
63
65
  end
64
66
 
65
67
  # wrap the before in a lambda
66
- stack = -> do
68
+ stack = lambda do
67
69
  @recordings.each do |recording|
68
70
  recording.record_onto!(@tape)
69
71
  end
@@ -91,8 +93,8 @@ module Onceler
91
93
 
92
94
  def hooks
93
95
  @hooks ||= {
94
- before: {record: [], reset: []},
95
- after: {record: [], reset: []}
96
+ before: { record: [], reset: [] },
97
+ after: { record: [], reset: [] }
96
98
  }
97
99
  end
98
100
 
data/lib/onceler.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rspec"
2
4
  require "rubygems"
3
5
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: once-ler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Jensen
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-08-26 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
@@ -16,20 +15,20 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '7.0'
18
+ version: '7.1'
20
19
  - - "<"
21
20
  - !ruby/object:Gem::Version
22
- version: '8.1'
21
+ version: '8.2'
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- version: '7.0'
28
+ version: '7.1'
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
- version: '8.1'
31
+ version: '8.2'
33
32
  - !ruby/object:Gem::Dependency
34
33
  name: rspec
35
34
  requirement: !ruby/object:Gem::Requirement
@@ -58,90 +57,6 @@ dependencies:
58
57
  - - ">="
59
58
  - !ruby/object:Gem::Version
60
59
  version: '4.0'
61
- - !ruby/object:Gem::Dependency
62
- name: appraisal
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: 2.3.0
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: 2.3.0
75
- - !ruby/object:Gem::Dependency
76
- name: debug
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- - !ruby/object:Gem::Dependency
90
- name: database_cleaner
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '2.0'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '2.0'
103
- - !ruby/object:Gem::Dependency
104
- name: database_cleaner-active_record
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '2.0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '2.0'
117
- - !ruby/object:Gem::Dependency
118
- name: rake
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- - !ruby/object:Gem::Dependency
132
- name: sqlite3
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
60
  description: once-ler supercharges your let's and before's with the performance of
146
61
  before(:all)
147
62
  email: jon@instructure.com
@@ -161,8 +76,8 @@ files:
161
76
  homepage: http://github.com/instructure/once-ler
162
77
  licenses:
163
78
  - MIT
164
- metadata: {}
165
- post_install_message:
79
+ metadata:
80
+ rubygems_mfa_required: 'true'
166
81
  rdoc_options: []
167
82
  require_paths:
168
83
  - lib
@@ -170,15 +85,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
85
  requirements:
171
86
  - - ">="
172
87
  - !ruby/object:Gem::Version
173
- version: '3.1'
88
+ version: '3.3'
174
89
  required_rubygems_version: !ruby/object:Gem::Requirement
175
90
  requirements:
176
91
  - - ">="
177
92
  - !ruby/object:Gem::Version
178
93
  version: 2.6.0
179
94
  requirements: []
180
- rubygems_version: 3.4.19
181
- signing_key:
95
+ rubygems_version: 4.0.10
182
96
  specification_version: 4
183
97
  summary: rspec supercharger
184
98
  test_files: []