dry-initializer 0.11.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +8 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +14 -62
  6. data/.travis.yml +15 -11
  7. data/CHANGELOG.md +538 -158
  8. data/Gemfile +2 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +6 -6
  11. data/Rakefile +2 -41
  12. data/benchmarks/{several_defaults.rb → compare_several_defaults.rb} +4 -4
  13. data/benchmarks/{without_options.rb → plain_options.rb} +21 -10
  14. data/benchmarks/{params.rb → plain_params.rb} +20 -9
  15. data/benchmarks/{with_types.rb → with_coercion.rb} +23 -16
  16. data/benchmarks/with_defaults.rb +19 -8
  17. data/benchmarks/{with_types_and_defaults.rb → with_defaults_and_coercion.rb} +21 -12
  18. data/dry-initializer.gemspec +4 -4
  19. data/lib/dry/initializer/builders/attribute.rb +81 -0
  20. data/lib/dry/initializer/builders/initializer.rb +61 -0
  21. data/lib/dry/initializer/builders/reader.rb +50 -0
  22. data/lib/dry/initializer/builders/signature.rb +32 -0
  23. data/lib/dry/initializer/builders.rb +7 -0
  24. data/lib/dry/initializer/config.rb +172 -0
  25. data/lib/dry/initializer/definition.rb +116 -0
  26. data/lib/dry/initializer/dispatchers.rb +44 -0
  27. data/lib/dry/initializer/dsl.rb +43 -0
  28. data/lib/dry/initializer/mixin/local.rb +19 -0
  29. data/lib/dry/initializer/mixin/root.rb +10 -0
  30. data/lib/dry/initializer/mixin.rb +8 -70
  31. data/lib/dry/initializer.rb +49 -12
  32. data/lib/tasks/benchmark.rake +41 -0
  33. data/lib/tasks/profile.rake +78 -0
  34. data/spec/attributes_spec.rb +38 -0
  35. data/spec/coercion_of_nil_spec.rb +25 -0
  36. data/spec/custom_dispatchers_spec.rb +35 -0
  37. data/spec/custom_initializer_spec.rb +1 -1
  38. data/spec/default_values_spec.rb +8 -8
  39. data/spec/definition_spec.rb +107 -0
  40. data/spec/invalid_default_spec.rb +2 -2
  41. data/spec/missed_default_spec.rb +3 -3
  42. data/spec/optional_spec.rb +35 -8
  43. data/spec/options_tolerance_spec.rb +1 -1
  44. data/spec/public_attributes_utility_spec.rb +22 -0
  45. data/spec/reader_spec.rb +11 -11
  46. data/spec/repetitive_definitions_spec.rb +41 -21
  47. data/spec/several_assignments_spec.rb +41 -0
  48. data/spec/spec_helper.rb +7 -0
  49. data/spec/subclassing_spec.rb +7 -3
  50. data/spec/type_argument_spec.rb +1 -1
  51. data/spec/type_constraint_spec.rb +38 -7
  52. data/spec/value_coercion_via_dry_types_spec.rb +12 -4
  53. metadata +37 -40
  54. data/benchmarks/options.rb +0 -54
  55. data/benchmarks/params_vs_options.rb +0 -35
  56. data/lib/dry/initializer/builder.rb +0 -100
  57. data/lib/dry/initializer/errors/default_value_error.rb +0 -6
  58. data/lib/dry/initializer/errors/order_error.rb +0 -7
  59. data/lib/dry/initializer/errors/plugin_error.rb +0 -6
  60. data/lib/dry/initializer/errors/redefinition_error.rb +0 -5
  61. data/lib/dry/initializer/errors/type_constraint_error.rb +0 -5
  62. data/lib/dry/initializer/errors.rb +0 -10
  63. data/lib/dry/initializer/plugins/base.rb +0 -47
  64. data/lib/dry/initializer/plugins/default_proc.rb +0 -28
  65. data/lib/dry/initializer/plugins/signature.rb +0 -28
  66. data/lib/dry/initializer/plugins/type_constraint.rb +0 -21
  67. data/lib/dry/initializer/plugins/variable_setter.rb +0 -30
  68. data/lib/dry/initializer/plugins.rb +0 -10
  69. data/lib/dry/initializer/signature.rb +0 -61
  70. data/spec/base_spec.rb +0 -21
  71. data/spec/container_spec.rb +0 -45
  72. data/spec/default_nil_spec.rb +0 -17
  73. data/spec/plugin_registry_spec.rb +0 -45
  74. data/spec/renaming_options_spec.rb +0 -20
@@ -1,61 +0,0 @@
1
- module Dry::Initializer
2
- # Immutable container for chunks of code describing argument signatures.
3
- # Responcible for building the resulting signature for the initializer args.
4
- class Signature
5
- include Enumerable
6
- include Errors
7
-
8
- def initialize(*list)
9
- @list = list
10
- end
11
-
12
- def add(*args)
13
- signature = Plugins::Signature.new(*args)
14
-
15
- validate_order_of signature
16
- validate_param_uniqueness_of signature
17
- validate_option_uniqueness_of signature
18
- validate_attribute_uniqueness_of signature
19
-
20
- self.class.new(*@list, signature)
21
- end
22
-
23
- def each
24
- @list.each { |item| yield item }
25
- end
26
-
27
- def call
28
- options = all?(&:param?) ? %w(__options__={}) : %w(**__options__)
29
- (select(&:param?).map(&:call) + options).compact.join(", ")
30
- end
31
-
32
- private
33
-
34
- def validate_param_uniqueness_of(signature)
35
- return unless signature.param?
36
- return unless select(&:param?).map(&:name).include? signature.name
37
-
38
- fail RedefinitionError.new(signature.name)
39
- end
40
-
41
- def validate_option_uniqueness_of(signature)
42
- return if signature.param?
43
- return unless reject(&:param?).map(&:name).include? signature.name
44
-
45
- fail RedefinitionError.new(signature.name)
46
- end
47
-
48
- def validate_attribute_uniqueness_of(signature)
49
- return unless map(&:rename).include? signature.rename
50
-
51
- fail RedefinitionError.new(signature.name)
52
- end
53
-
54
- def validate_order_of(signature)
55
- return unless signature.required? && signature.param?
56
- return unless reject(&:required?).any?(&:param?)
57
-
58
- fail OrderError.new(signature.name)
59
- end
60
- end
61
- end
data/spec/base_spec.rb DELETED
@@ -1,21 +0,0 @@
1
- describe "base example" do
2
- before do
3
- class Test::Foo
4
- extend Dry::Initializer::Mixin
5
-
6
- param :foo
7
- param :bar
8
- option :baz
9
- option :qux
10
- end
11
- end
12
-
13
- it "instantiates attributes" do
14
- subject = Test::Foo.new(1, 2, baz: 3, qux: 4)
15
-
16
- expect(subject.foo).to eql 1
17
- expect(subject.bar).to eql 2
18
- expect(subject.baz).to eql 3
19
- expect(subject.qux).to eql 4
20
- end
21
- end
@@ -1,45 +0,0 @@
1
- describe "container" do
2
- context "with block syntax" do
3
- before do
4
- class Test::Foo
5
- include Dry::Initializer.define {
6
- param :foo
7
- param :bar
8
- option :baz
9
- option :qux
10
- }
11
- end
12
- end
13
-
14
- it "instantiates attributes" do
15
- subject = Test::Foo.new(1, 2, baz: 3, qux: 4)
16
-
17
- expect(subject.foo).to eql 1
18
- expect(subject.bar).to eql 2
19
- expect(subject.baz).to eql 3
20
- expect(subject.qux).to eql 4
21
- end
22
- end
23
-
24
- context "with lambda syntax" do
25
- before do
26
- class Test::Foo
27
- include Dry::Initializer.define -> do
28
- param :foo
29
- param :bar
30
- option :baz
31
- option :qux
32
- end
33
- end
34
- end
35
-
36
- it "instantiates attributes" do
37
- subject = Test::Foo.new(1, 2, baz: 3, qux: 4)
38
-
39
- expect(subject.foo).to eql 1
40
- expect(subject.bar).to eql 2
41
- expect(subject.baz).to eql 3
42
- expect(subject.qux).to eql 4
43
- end
44
- end
45
- end
@@ -1,17 +0,0 @@
1
- describe "default nil" do
2
- before do
3
- class Test::Foo
4
- extend Dry::Initializer::Mixin
5
-
6
- param :foo, default: proc { nil }
7
- param :bar, default: proc { nil }
8
- end
9
- end
10
-
11
- it "is assigned" do
12
- subject = Test::Foo.new(1)
13
-
14
- expect(subject.foo).to eql 1
15
- expect(subject.bar).to be_nil
16
- end
17
- end
@@ -1,45 +0,0 @@
1
- describe "plugin registry" do
2
- before do
3
- # Define a plugin
4
- module Test::Stringifier
5
- class Plugin < Dry::Initializer::Plugins::Base
6
- def call
7
- "@#{name} = @#{name}.to_s"
8
- end
9
- end
10
-
11
- def self.extended(klass)
12
- klass.register_initializer_plugin(Plugin)
13
- end
14
- end
15
-
16
- # Define superclass
17
- class Test::Foo
18
- extend Dry::Initializer::Mixin
19
-
20
- param :foo
21
- end
22
-
23
- # Apply the plugin to the subclass
24
- class Test::Bar < Test::Foo
25
- extend Test::Stringifier
26
-
27
- param :bar
28
- end
29
- end
30
-
31
- let(:instance_of_superclass) { Test::Foo.new :FOO }
32
- let(:instance_of_subclass) { Test::Bar.new :FOO, :BAR }
33
-
34
- it "does not pollute superclass" do
35
- expect(instance_of_superclass.foo).to eql :FOO
36
- end
37
-
38
- it "preserves declarations made in superclass" do
39
- expect(instance_of_subclass.foo).to eql :FOO
40
- end
41
-
42
- it "applies plugin to new declarations" do
43
- expect(instance_of_subclass.bar).to eql "BAR"
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- describe "renaming options" do
2
- before do
3
- class Test::Foo
4
- extend Dry::Initializer::Mixin
5
-
6
- option :"some foo", as: :bar
7
- end
8
- end
9
-
10
- subject { Test::Foo.new "some foo": :BAZ }
11
-
12
- it "renames the attribute" do
13
- expect(subject.bar).to eq :BAZ
14
- expect(subject).not_to respond_to :foo
15
- end
16
-
17
- it "renames the variable" do
18
- expect(subject.instance_variable_get(:@bar)).to eq :BAZ
19
- end
20
- end