factory_bot 6.0.2 → 6.1.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: 53cbce42f9c9fcf243a4081288b73cfce66a6b75a323f6882d6be4b4f60fcd18
4
- data.tar.gz: 68df68b5a4501caa97f8e2538e3d1afb6e8ae619add80a52fff7bef2f8bda24b
3
+ metadata.gz: fe33ad3bb5d907e38ceac543f969484fb0ec67a4708a701cdfea0696d4a292c4
4
+ data.tar.gz: 54cdb44f4ac7782360c8e9efd02ac46f40336d00c34a5767d5d7fc0f86f8d7a5
5
5
  SHA512:
6
- metadata.gz: '049104e865666570343adea5fd54e3025d5c4b550c7a364b22e4f9af8f24c8055e2fc21a168e752976569617bd0e4d02504904eb7274d7c7819d32936c164610'
7
- data.tar.gz: 2bf0447a30a2e536f9eeaaccc724528c839a576ce0df7490f68ec86e683273a50e58ae5f7171c4e001c323adb8fe793427106dbcdc68987dc6ff28d3a4608d6f
6
+ metadata.gz: cdc3ec9def71e797058fb13cff95b911eceb61d1488f193ef1bfb6bdf12c6c7835d1f67dc1885d5539e6da7135f04e4a417a16fbc60cbc0c4d60056a1948c89d
7
+ data.tar.gz: 2f04ab1a184266a86cf8510be688b8a01b0dd570615d25e314176b4492f9635053596636aa4ec9ab8133e86e4c9f630acdb52468c01ea1bfd2fb8777fc27b2ab
@@ -52,6 +52,7 @@ Getting Started
52
52
  + [Without a block](#without-a-block)
53
53
  + [Aliases](#aliases-1)
54
54
  + [Rewinding](#rewinding)
55
+ + [Uniqueness](#uniqueness)
55
56
  * [Traits](#traits)
56
57
  + [Defining traits](#defining-traits)
57
58
  + [As implicit attributes](#as-implicit-attributes-1)
@@ -878,6 +879,22 @@ generate(:email) # "person1@example.com"
878
879
 
879
880
  This rewinds all registered sequences.
880
881
 
882
+ ### Uniqueness
883
+
884
+ When working with uniqueness constraints, be careful not to pass in override values that will conflict with the generated sequence values.
885
+
886
+ In this example the email will be the same for both users. If email must be unique, this code will error:
887
+
888
+ ```rb
889
+ factory :user do
890
+ sequence(:email) { |n| "person#{n}@example.com" }
891
+ end
892
+
893
+ FactoryBot.create(:user, email: "person1@example.com")
894
+ FactoryBot.create(:user)
895
+ ```
896
+
897
+
881
898
  Traits
882
899
  ------
883
900
 
data/NEWS.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # News
2
2
 
3
+ ## 6.1.0 (July 8, 2020)
4
+ * Added: public reader for the evaluation instance, helpful for building interrelated associations
5
+ * Changed: raise a more helpful error when passing an invalid argument to an association
6
+ * Fixed: Ruby 2.7 kwarg deprecation warnings
7
+
3
8
  ## 6.0.2 (June 19, 2020)
4
9
  * Fixed: bug causing traits to consume more memory each time they were used
5
10
 
@@ -8,6 +13,9 @@
8
13
 
9
14
  ## 6.0.0 (June 18, 2020)
10
15
  * Added: automatic definition of traits for Active Record enum attributes, enabled by default
16
+ (Note that this required changing where factory_bot constantizes the build
17
+ class, which may affect applications that were using abstract factories for
18
+ inheritance. See issue #1409.)
11
19
  * Added: `traits_for_enum` method to define traits for non-Active Record enums
12
20
  * Added: `build_stubbed_starting_id=` option to define the starting id for `build_stubbed`
13
21
  * Removed: deprecated methods on the top-level `FactoryBot` module meant only for internal use
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # factory_bot [![Build Status][ci-image]][ci] [![Code Climate][grade-image]][grade] [![Gem Version][version-image]][version] [![Reviewed by Hound][hound-badge-image]][hound]
1
+ # factory_bot [![Build Status][ci-image]][ci] [![Code Climate][grade-image]][grade] [![Gem Version][version-image]][version]
2
2
 
3
3
  factory_bot is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.
4
4
 
@@ -43,13 +43,7 @@ gem install factory_bot
43
43
  Supported Ruby versions
44
44
  -----------------------
45
45
 
46
- The factory_bot 5.x series supports MRI Ruby 2.3+.
47
-
48
- The factory_bot 3.x+ series supports MRI Ruby 1.9. Additionally, factory_bot
49
- 3.6+ supports JRuby 1.6.7.2+ while running in 1.9 mode. See [GETTING_STARTED]
50
- for more information on configuring the JRuby environment.
51
-
52
- For versions of Ruby prior to 1.9, please use factory_bot 2.x.
46
+ Supported Ruby versions are listed in [`.travis.yml`](https://github.com/thoughtbot/factory_bot/blob/master/.travis.yml)
53
47
 
54
48
  More Information
55
49
  ----------------
@@ -6,6 +6,7 @@ module FactoryBot
6
6
  super(name, false)
7
7
  @options = options.dup
8
8
  @overrides = options.extract_options!
9
+ @factory_name = @overrides.delete(:factory) || name
9
10
  @traits = options
10
11
  end
11
12
 
@@ -21,20 +22,36 @@ module FactoryBot
21
22
 
22
23
  private
23
24
 
25
+ attr_reader :factory_name, :overrides, :traits
26
+
24
27
  def build
25
- ensure_factory_is_not_a_declaration!
28
+ raise_if_arguments_are_declarations!
26
29
 
27
- factory_name = @overrides[:factory] || name
28
- [Attribute::Association.new(name, factory_name, [@traits, @overrides.except(:factory)].flatten)]
30
+ [
31
+ Attribute::Association.new(
32
+ name,
33
+ factory_name,
34
+ [traits, overrides].flatten
35
+ )
36
+ ]
29
37
  end
30
38
 
31
- def ensure_factory_is_not_a_declaration!
32
- if @overrides[:factory].is_a?(Declaration)
39
+ def raise_if_arguments_are_declarations!
40
+ if factory_name.is_a?(Declaration)
33
41
  raise ArgumentError.new(<<~MSG)
34
42
  Association '#{name}' received an invalid factory argument.
35
- Did you mean? 'factory: :#{@overrides[:factory].name}'
43
+ Did you mean? 'factory: :#{factory_name.name}'
36
44
  MSG
37
45
  end
46
+
47
+ overrides.each do |attribute, value|
48
+ if value.is_a?(Declaration)
49
+ raise ArgumentError.new(<<~MSG)
50
+ Association '#{name}' received an invalid attribute override.
51
+ Did you mean? '#{attribute}: :#{value.name}'
52
+ MSG
53
+ end
54
+ end
38
55
  end
39
56
  end
40
57
  end
@@ -6,18 +6,30 @@ module FactoryBot
6
6
  @component = component
7
7
  end
8
8
 
9
- def method_missing(name, *args, &block) # rubocop:disable Style/MethodMissingSuper
10
- @component.send(name, *args, &block)
9
+ if ::Gem::Version.new(::RUBY_VERSION) >= ::Gem::Version.new("2.7")
10
+ class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
11
+ def method_missing(...) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
12
+ @component.send(...)
13
+ end
14
+
15
+ def send(...)
16
+ __send__(...)
17
+ end
18
+ RUBY
19
+ else
20
+ def method_missing(name, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
21
+ @component.send(name, *args, &block)
22
+ end
23
+
24
+ def send(symbol, *args, &block)
25
+ __send__(symbol, *args, &block)
26
+ end
11
27
  end
12
28
 
13
29
  def respond_to_missing?(name, include_private = false)
14
30
  @component.respond_to?(name, true) || super
15
31
  end
16
32
 
17
- def send(symbol, *args, &block)
18
- __send__(symbol, *args, &block)
19
- end
20
-
21
33
  def self.const_missing(name)
22
34
  ::Object.const_get(name)
23
35
  end
@@ -6,9 +6,16 @@ module FactoryBot
6
6
  @invoked_methods = []
7
7
  end
8
8
 
9
- def method_missing(name, *args, &block) # rubocop:disable Style/MissingRespondToMissing
10
- @invoked_methods << name
11
- super
9
+ if ::Gem::Version.new(::RUBY_VERSION) >= ::Gem::Version.new("2.7")
10
+ def method_missing(name, *args, **kwargs, &block) # rubocop:disable Style/MissingRespondToMissing
11
+ @invoked_methods << name
12
+ super
13
+ end
14
+ else
15
+ def method_missing(name, *args, &block) # rubocop:disable Style/MissingRespondToMissing
16
+ @invoked_methods << name
17
+ super
18
+ end
12
19
  end
13
20
 
14
21
  def __invoked_methods__
@@ -33,13 +33,23 @@ module FactoryBot
33
33
  @build_strategy.association(runner)
34
34
  end
35
35
 
36
- attr_writer :instance
36
+ attr_accessor :instance
37
37
 
38
- def method_missing(method_name, *args, &block) # rubocop:disable Style/MethodMissingSuper
39
- if @instance.respond_to?(method_name)
40
- @instance.send(method_name, *args, &block)
41
- else
42
- SyntaxRunner.new.send(method_name, *args, &block)
38
+ if ::Gem::Version.new(::RUBY_VERSION) >= ::Gem::Version.new("2.7")
39
+ def method_missing(method_name, *args, **kwargs, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
40
+ if @instance.respond_to?(method_name)
41
+ @instance.send(method_name, *args, **kwargs, &block)
42
+ else
43
+ SyntaxRunner.new.send(method_name, *args, **kwargs, &block)
44
+ end
45
+ end
46
+ else
47
+ def method_missing(method_name, *args, &block) # rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
48
+ if @instance.respond_to?(method_name)
49
+ @instance.send(method_name, *args, &block)
50
+ else
51
+ SyntaxRunner.new.send(method_name, *args, &block)
52
+ end
43
53
  end
44
54
  end
45
55
 
@@ -1,3 +1,3 @@
1
1
  module FactoryBot
2
- VERSION = "6.0.2".freeze
2
+ VERSION = "6.1.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factory_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.2
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Clayton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-06-20 00:00:00.000000000 Z
12
+ date: 2020-07-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport