dry-initializer 1.4.1 → 2.0.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -8
  3. data/.travis.yml +0 -3
  4. data/CHANGELOG.md +339 -196
  5. data/LICENSE.txt +1 -1
  6. data/README.md +3 -3
  7. data/Rakefile +2 -47
  8. data/benchmarks/{several_defaults.rb → compare_several_defaults.rb} +4 -4
  9. data/benchmarks/{without_options.rb → plain_options.rb} +20 -9
  10. data/benchmarks/{params.rb → plain_params.rb} +20 -9
  11. data/benchmarks/{with_types.rb → with_coercion.rb} +20 -9
  12. data/benchmarks/with_defaults.rb +19 -8
  13. data/benchmarks/{with_types_and_defaults.rb → with_defaults_and_coercion.rb} +21 -10
  14. data/dry-initializer.gemspec +3 -3
  15. data/lib/dry/initializer/builders/attribute.rb +76 -0
  16. data/lib/dry/initializer/builders/initializer.rb +61 -0
  17. data/lib/dry/initializer/builders/reader.rb +50 -0
  18. data/lib/dry/initializer/builders/signature.rb +32 -0
  19. data/lib/dry/initializer/builders.rb +7 -0
  20. data/lib/dry/initializer/config.rb +161 -0
  21. data/lib/dry/initializer/definition.rb +93 -0
  22. data/lib/dry/initializer/dsl.rb +43 -0
  23. data/lib/dry/initializer/mixin/local.rb +19 -0
  24. data/lib/dry/initializer/mixin/root.rb +10 -0
  25. data/lib/dry/initializer/mixin.rb +15 -0
  26. data/lib/dry/initializer.rb +45 -41
  27. data/lib/tasks/benchmark.rake +41 -0
  28. data/lib/tasks/profile.rake +78 -0
  29. data/spec/{options_var_spec.rb → attributes_spec.rb} +9 -9
  30. data/spec/custom_initializer_spec.rb +1 -1
  31. data/spec/default_values_spec.rb +6 -6
  32. data/spec/definition_spec.rb +21 -14
  33. data/spec/invalid_default_spec.rb +2 -2
  34. data/spec/missed_default_spec.rb +2 -2
  35. data/spec/optional_spec.rb +2 -2
  36. data/spec/options_tolerance_spec.rb +1 -1
  37. data/spec/public_attributes_utility_spec.rb +22 -0
  38. data/spec/reader_spec.rb +11 -11
  39. data/spec/repetitive_definitions_spec.rb +5 -5
  40. data/spec/several_assignments_spec.rb +1 -1
  41. data/spec/spec_helper.rb +5 -0
  42. data/spec/subclassing_spec.rb +7 -3
  43. data/spec/type_argument_spec.rb +1 -1
  44. data/spec/type_constraint_spec.rb +2 -2
  45. data/spec/value_coercion_via_dry_types_spec.rb +1 -1
  46. metadata +27 -27
  47. data/benchmarks/options.rb +0 -54
  48. data/benchmarks/params_vs_options.rb +0 -35
  49. data/benchmarks/profiler.rb +0 -28
  50. data/lib/dry/initializer/attribute.rb +0 -123
  51. data/lib/dry/initializer/builder.rb +0 -127
  52. data/lib/dry/initializer/class_dsl.rb +0 -37
  53. data/lib/dry/initializer/exceptions/default_value_error.rb +0 -8
  54. data/lib/dry/initializer/exceptions/params_order_error.rb +0 -8
  55. data/lib/dry/initializer/exceptions/type_constraint_error.rb +0 -7
  56. data/lib/dry/initializer/instance_dsl.rb +0 -15
  57. data/lib/dry/initializer/option.rb +0 -61
  58. data/lib/dry/initializer/param.rb +0 -52
  59. data/spec/gem_enhancement_spec.rb +0 -18
@@ -18,10 +18,10 @@ describe "definition" do
18
18
  end
19
19
  end
20
20
 
21
- it_behaves_like :initializer, "extend Dry::Initializer::Mixin" do
21
+ it_behaves_like :initializer, "extend Dry::Initializer" do
22
22
  before do
23
23
  class Test::Foo
24
- extend Dry::Initializer::Mixin
24
+ extend Dry::Initializer
25
25
  param :foo
26
26
  option :bar
27
27
  end
@@ -41,10 +41,12 @@ describe "definition" do
41
41
  it_behaves_like :initializer, "include Dry::Initializer with block" do
42
42
  before do
43
43
  class Test::Foo
44
- include Dry::Initializer.define {
45
- param :foo
46
- option :bar
47
- }
44
+ include(
45
+ Dry::Initializer.define do
46
+ param :foo
47
+ option :bar
48
+ end
49
+ )
48
50
  end
49
51
  end
50
52
  end
@@ -63,21 +65,26 @@ describe "definition" do
63
65
  it_behaves_like :initializer, "include Dry::Initializer[undefined: false]" do
64
66
  before do
65
67
  class Test::Foo
66
- include Dry::Initializer[undefined: false].define {
67
- param :foo
68
- option :bar
69
- }
68
+ include(
69
+ Dry::Initializer[undefined: false].define do
70
+ param :foo
71
+ option :bar
72
+ end
73
+ )
70
74
  end
71
75
  end
72
76
  end
73
77
 
78
+ # @deprecated
74
79
  it_behaves_like :initializer, "include Dry::Initializer::Mixin" do
75
80
  before do
76
81
  class Test::Foo
77
- include Dry::Initializer::Mixin.define {
78
- param :foo
79
- option :bar
80
- }
82
+ include(
83
+ Dry::Initializer::Mixin.define do
84
+ param :foo
85
+ option :bar
86
+ end
87
+ )
81
88
  end
82
89
  end
83
90
  end
@@ -1,13 +1,13 @@
1
1
  describe "invalid default value assignment" do
2
2
  subject do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
 
6
6
  param :foo, default: 1
7
7
  end
8
8
  end
9
9
 
10
10
  it "raises TypeError" do
11
- expect { subject }.to raise_error TypeError, /1/
11
+ expect { subject }.to raise_error TypeError
12
12
  end
13
13
  end
@@ -1,7 +1,7 @@
1
1
  describe "missed default values" do
2
2
  subject do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
 
6
6
  param :foo, default: proc { :FOO }
7
7
  param :bar, required: true
@@ -9,6 +9,6 @@ describe "missed default values" do
9
9
  end
10
10
 
11
11
  it "raises SyntaxError" do
12
- expect { subject }.to raise_error RuntimeError, /bar/
12
+ expect { subject }.to raise_error SyntaxError, /bar/
13
13
  end
14
14
  end
@@ -2,7 +2,7 @@ describe "optional value" do
2
2
  context "when has no default value" do
3
3
  before do
4
4
  class Test::Foo
5
- extend Dry::Initializer::Mixin
5
+ extend Dry::Initializer
6
6
 
7
7
  param :foo
8
8
  param :bar, optional: true
@@ -49,7 +49,7 @@ describe "optional value" do
49
49
  context "when has a default value" do
50
50
  before do
51
51
  class Test::Foo
52
- extend Dry::Initializer::Mixin
52
+ extend Dry::Initializer
53
53
 
54
54
  param :foo
55
55
  param :bar, optional: true, default: proc { "baz" }
@@ -1,7 +1,7 @@
1
1
  describe "options tolerance" do
2
2
  before do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
  end
6
6
  end
7
7
 
@@ -0,0 +1,22 @@
1
+ describe Dry::Initializer, ".dry_initializer.public_attributes" do
2
+ subject { instance.class.dry_initializer.public_attributes(instance) }
3
+
4
+ context "when class has params" do
5
+ before do
6
+ class Test::Foo
7
+ extend Dry::Initializer
8
+ param :foo, proc(&:to_s)
9
+ option :moo, optional: true
10
+ option :bar, default: proc { 1 }, reader: false
11
+ option :baz, optional: true, reader: :protected
12
+ option :qux, proc(&:to_s), as: :quxx, reader: :private
13
+ end
14
+ end
15
+
16
+ let(:instance) { Test::Foo.new(:FOO, bar: :BAR, baz: :BAZ, qux: :QUX) }
17
+
18
+ it "collects public options only" do
19
+ expect(subject).to eq({ foo: "FOO", moo: nil })
20
+ end
21
+ end
22
+ end
data/spec/reader_spec.rb CHANGED
@@ -9,7 +9,7 @@ describe "reader" do
9
9
  context "with reader: :public or no reader: option" do
10
10
  subject do
11
11
  class Test::Foo
12
- extend Dry::Initializer::Mixin
12
+ extend Dry::Initializer
13
13
 
14
14
  param :foo
15
15
  param :foo2, reader: :public
@@ -28,17 +28,17 @@ describe "reader" do
28
28
  end
29
29
 
30
30
  context "with reader: false" do
31
- subject do
31
+ before do
32
32
  class Test::Foo
33
- extend Dry::Initializer::Mixin
33
+ extend Dry::Initializer
34
34
 
35
35
  param :foo, reader: false
36
36
  option :bar, reader: false
37
37
  end
38
-
39
- Test::Foo.new 1, bar: 2
40
38
  end
41
39
 
40
+ subject { Test::Foo.new 1, bar: 2 }
41
+
42
42
  it_behaves_like "it has no public attr_reader"
43
43
 
44
44
  it "keeps assigning variables" do
@@ -48,17 +48,17 @@ describe "reader" do
48
48
  end
49
49
 
50
50
  context "with reader: :private" do
51
- subject do
51
+ before do
52
52
  class Test::Foo
53
- extend Dry::Initializer::Mixin
53
+ extend Dry::Initializer
54
54
 
55
55
  param :foo, reader: :private
56
56
  option :bar, reader: :private
57
57
  end
58
-
59
- Test::Foo.new 1, bar: 2
60
58
  end
61
59
 
60
+ subject { Test::Foo.new 1, bar: 2 }
61
+
62
62
  it_behaves_like "it has no public attr_reader"
63
63
 
64
64
  it "adds a private attr_reader" do
@@ -70,7 +70,7 @@ describe "reader" do
70
70
  context "with reader: :protected" do
71
71
  subject do
72
72
  class Test::Foo
73
- extend Dry::Initializer::Mixin
73
+ extend Dry::Initializer
74
74
 
75
75
  param :foo, reader: :protected
76
76
  option :bar, reader: :protected
@@ -81,7 +81,7 @@ describe "reader" do
81
81
 
82
82
  it "adds a protected attr_reader" do
83
83
  protected_instance_methods = subject.class.protected_instance_methods
84
- expect(protected_instance_methods).to match_array([:foo, :bar])
84
+ expect(protected_instance_methods).to match_array(%i[foo bar])
85
85
  end
86
86
  end
87
87
  end
@@ -4,7 +4,7 @@ describe "repetitive definitions" do
4
4
  context "of params" do
5
5
  before do
6
6
  class Test::Foo
7
- extend Dry::Initializer::Mixin
7
+ extend Dry::Initializer
8
8
 
9
9
  param :foo, default: proc { 0 }
10
10
  param :bar, default: proc { 1 }
@@ -20,7 +20,7 @@ describe "repetitive definitions" do
20
20
  context "of options" do
21
21
  before do
22
22
  class Test::Foo
23
- extend Dry::Initializer::Mixin
23
+ extend Dry::Initializer
24
24
 
25
25
  option :foo, default: proc { 0 }
26
26
  option :bar, default: proc { 1 }
@@ -36,7 +36,7 @@ describe "repetitive definitions" do
36
36
  context "of param and option" do
37
37
  before do
38
38
  class Test::Foo
39
- extend Dry::Initializer::Mixin
39
+ extend Dry::Initializer
40
40
 
41
41
  param :foo, default: proc { 0 }
42
42
  option :bar, default: proc { 1 }
@@ -52,9 +52,9 @@ describe "repetitive definitions" do
52
52
  context "of optional param and option" do
53
53
  before do
54
54
  class Test::Foo
55
- extend Dry::Initializer::Mixin
55
+ extend Dry::Initializer
56
56
 
57
- param :foo, optional: true
57
+ param :baz, optional: true, as: :foo
58
58
  option :bar, optional: true
59
59
  option :foo, optional: true
60
60
  end
@@ -1,7 +1,7 @@
1
1
  describe "attribute with several assignments" do
2
2
  before do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
 
6
6
  option :bar, proc(&:to_s), optional: true
7
7
  option :"some foo", as: :bar, optional: true
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,9 @@
1
1
  require "dry/initializer"
2
+ begin
3
+ require "pry"
4
+ rescue
5
+ nil
6
+ end
2
7
 
3
8
  RSpec.configure do |config|
4
9
  config.order = :random
@@ -1,8 +1,7 @@
1
1
  describe "subclassing" do
2
2
  before do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
5
-
4
+ extend Dry::Initializer[undefined: false]
6
5
  param :foo
7
6
  option :bar
8
7
  end
@@ -21,6 +20,11 @@ describe "subclassing" do
21
20
  Test::Bar.new 1, 2, bar: 3, qux: 4
22
21
  end
23
22
 
23
+ it "preserves null definition" do
24
+ expect(Test::Foo.dry_initializer.null).to be_nil
25
+ expect(Test::Bar.dry_initializer.null).to be_nil
26
+ end
27
+
24
28
  it "preserves definitions made in the superclass" do
25
29
  expect(instance_of_subclass.foo).to eql 1
26
30
  expect(instance_of_subclass.baz).to eql 2
@@ -37,7 +41,7 @@ describe "subclassing" do
37
41
  called = false
38
42
  mixin = Module.new { define_method(:inherited) { |_| called = true } }
39
43
 
40
- base = Class.new { extend mixin; extend Dry::Initializer::Mixin }
44
+ base = Class.new { extend mixin; extend Dry::Initializer }
41
45
  Class.new(base)
42
46
 
43
47
  expect(called).to be true
@@ -3,7 +3,7 @@ require "dry-types"
3
3
  describe "type argument" do
4
4
  before do
5
5
  class Test::Foo
6
- extend Dry::Initializer::Mixin
6
+ extend Dry::Initializer
7
7
  param :foo, Dry::Types["strict.string"]
8
8
  option :bar, Dry::Types["strict.string"]
9
9
  end
@@ -4,7 +4,7 @@ describe "type constraint" do
4
4
  context "by dry-type" do
5
5
  before do
6
6
  class Test::Foo
7
- extend Dry::Initializer::Mixin
7
+ extend Dry::Initializer
8
8
  param :foo, Dry::Types["strict.string"], optional: true
9
9
  end
10
10
  end
@@ -39,7 +39,7 @@ describe "type constraint" do
39
39
  it "raises TypeError" do
40
40
  expect do
41
41
  class Test::Foo
42
- extend Dry::Initializer::Mixin
42
+ extend Dry::Initializer
43
43
  param :foo, type: String
44
44
  end
45
45
  end.to raise_error(TypeError)
@@ -7,7 +7,7 @@ describe "value coercion via dry-types" do
7
7
  end
8
8
 
9
9
  class Test::Foo
10
- extend Dry::Initializer::Mixin
10
+ extend Dry::Initializer
11
11
 
12
12
  param :foo, type: Test::Types::Coercible::String
13
13
  option :bar, proc(&:to_i), default: proc { "16" }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-initializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Kochnev (marshall-lee)
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-05 00:00:00.000000000 Z
12
+ date: 2017-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -68,9 +68,7 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0.42'
70
70
  description:
71
- email:
72
- - hashtable@yandex.ru
73
- - andrew.kozin@gmail.com
71
+ email: andrew.kozin@gmail.com
74
72
  executables: []
75
73
  extensions: []
76
74
  extra_rdoc_files:
@@ -88,36 +86,37 @@ files:
88
86
  - LICENSE.txt
89
87
  - README.md
90
88
  - Rakefile
91
- - benchmarks/options.rb
92
- - benchmarks/params.rb
93
- - benchmarks/params_vs_options.rb
94
- - benchmarks/profiler.rb
95
- - benchmarks/several_defaults.rb
89
+ - benchmarks/compare_several_defaults.rb
90
+ - benchmarks/plain_options.rb
91
+ - benchmarks/plain_params.rb
92
+ - benchmarks/with_coercion.rb
96
93
  - benchmarks/with_defaults.rb
97
- - benchmarks/with_types.rb
98
- - benchmarks/with_types_and_defaults.rb
99
- - benchmarks/without_options.rb
94
+ - benchmarks/with_defaults_and_coercion.rb
100
95
  - dry-initializer.gemspec
101
96
  - lib/dry-initializer.rb
102
97
  - lib/dry/initializer.rb
103
- - lib/dry/initializer/attribute.rb
104
- - lib/dry/initializer/builder.rb
105
- - lib/dry/initializer/class_dsl.rb
106
- - lib/dry/initializer/exceptions/default_value_error.rb
107
- - lib/dry/initializer/exceptions/params_order_error.rb
108
- - lib/dry/initializer/exceptions/type_constraint_error.rb
109
- - lib/dry/initializer/instance_dsl.rb
110
- - lib/dry/initializer/option.rb
111
- - lib/dry/initializer/param.rb
98
+ - lib/dry/initializer/builders.rb
99
+ - lib/dry/initializer/builders/attribute.rb
100
+ - lib/dry/initializer/builders/initializer.rb
101
+ - lib/dry/initializer/builders/reader.rb
102
+ - lib/dry/initializer/builders/signature.rb
103
+ - lib/dry/initializer/config.rb
104
+ - lib/dry/initializer/definition.rb
105
+ - lib/dry/initializer/dsl.rb
106
+ - lib/dry/initializer/mixin.rb
107
+ - lib/dry/initializer/mixin/local.rb
108
+ - lib/dry/initializer/mixin/root.rb
109
+ - lib/tasks/benchmark.rake
110
+ - lib/tasks/profile.rake
111
+ - spec/attributes_spec.rb
112
112
  - spec/custom_initializer_spec.rb
113
113
  - spec/default_values_spec.rb
114
114
  - spec/definition_spec.rb
115
- - spec/gem_enhancement_spec.rb
116
115
  - spec/invalid_default_spec.rb
117
116
  - spec/missed_default_spec.rb
118
117
  - spec/optional_spec.rb
119
118
  - spec/options_tolerance_spec.rb
120
- - spec/options_var_spec.rb
119
+ - spec/public_attributes_utility_spec.rb
121
120
  - spec/reader_spec.rb
122
121
  - spec/repetitive_definitions_spec.rb
123
122
  - spec/several_assignments_spec.rb
@@ -138,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
137
  requirements:
139
138
  - - ">="
140
139
  - !ruby/object:Gem::Version
141
- version: '2.2'
140
+ version: '2.3'
142
141
  required_rubygems_version: !ruby/object:Gem::Requirement
143
142
  requirements:
144
143
  - - ">="
@@ -151,15 +150,15 @@ signing_key:
151
150
  specification_version: 4
152
151
  summary: DSL for declaring params and options of the initializer
153
152
  test_files:
153
+ - spec/attributes_spec.rb
154
154
  - spec/custom_initializer_spec.rb
155
155
  - spec/default_values_spec.rb
156
156
  - spec/definition_spec.rb
157
- - spec/gem_enhancement_spec.rb
158
157
  - spec/invalid_default_spec.rb
159
158
  - spec/missed_default_spec.rb
160
159
  - spec/optional_spec.rb
161
160
  - spec/options_tolerance_spec.rb
162
- - spec/options_var_spec.rb
161
+ - spec/public_attributes_utility_spec.rb
163
162
  - spec/reader_spec.rb
164
163
  - spec/repetitive_definitions_spec.rb
165
164
  - spec/several_assignments_spec.rb
@@ -168,3 +167,4 @@ test_files:
168
167
  - spec/type_argument_spec.rb
169
168
  - spec/type_constraint_spec.rb
170
169
  - spec/value_coercion_via_dry_types_spec.rb
170
+ has_rdoc:
@@ -1,54 +0,0 @@
1
- Bundler.require(:benchmarks)
2
-
3
- require "dry-initializer"
4
- class NoOptsTest
5
- extend Dry::Initializer::Mixin
6
-
7
- param :foo
8
- option :bar
9
- end
10
-
11
- class DefaultsTest
12
- extend Dry::Initializer::Mixin
13
-
14
- param :foo, default: proc { "FOO" }
15
- option :bar, default: proc { "BAR" }
16
- end
17
-
18
- class TypesTest
19
- extend Dry::Initializer::Mixin
20
-
21
- param :foo, proc(&:to_s)
22
- option :bar, proc(&:to_s)
23
- end
24
-
25
- class DefaultsAndTypesTest
26
- extend Dry::Initializer::Mixin
27
-
28
- param :foo, proc(&:to_s), default: proc { "FOO" }
29
- option :bar, proc(&:to_s), default: proc { "BAR" }
30
- end
31
-
32
- puts "Benchmark for various options"
33
-
34
- Benchmark.ips do |x|
35
- x.config time: 15, warmup: 10
36
-
37
- x.report("no opts") do
38
- NoOptsTest.new "foo", bar: "bar"
39
- end
40
-
41
- x.report("with defaults") do
42
- DefaultsTest.new
43
- end
44
-
45
- x.report("with types") do
46
- TypesTest.new "foo", bar: "bar"
47
- end
48
-
49
- x.report("with defaults and types") do
50
- DefaultsAndTypesTest.new
51
- end
52
-
53
- x.compare!
54
- end
@@ -1,35 +0,0 @@
1
- Bundler.require(:benchmarks)
2
-
3
- require "dry-initializer"
4
-
5
- class ParamDefaults
6
- extend Dry::Initializer::Mixin
7
-
8
- param :foo, default: proc { "FOO" }
9
- param :bar, default: proc { "BAR" }
10
- param :baz, default: proc { "BAZ" }
11
- end
12
-
13
- class OptionDefaults
14
- extend Dry::Initializer::Mixin
15
-
16
- option :foo, default: proc { "FOO" }
17
- option :bar, default: proc { "BAR" }
18
- option :baz, default: proc { "BAZ" }
19
- end
20
-
21
- puts "Benchmark for param's vs. option's defaults"
22
-
23
- Benchmark.ips do |x|
24
- x.config time: 15, warmup: 10
25
-
26
- x.report("param's defaults") do
27
- ParamDefaults.new
28
- end
29
-
30
- x.report("option's defaults") do
31
- OptionDefaults.new
32
- end
33
-
34
- x.compare!
35
- end
@@ -1,28 +0,0 @@
1
- require "dry-initializer"
2
- require "ruby-prof"
3
- require "fileutils"
4
-
5
- class User
6
- extend Dry::Initializer
7
-
8
- param :first_name, proc(&:to_s), default: proc { "Unknown" }
9
- param :second_name, proc(&:to_s), default: proc { "Unknown" }
10
- option :email, proc(&:to_s), optional: true
11
- option :phone, proc(&:to_s), optional: true
12
- end
13
-
14
- result = RubyProf.profile do
15
- 1_000.times { User.new :Andy, email: :"andy@example.com" }
16
- end
17
-
18
- FileUtils.mkdir_p "./tmp"
19
-
20
- FileUtils.touch "./tmp/profile.dot"
21
- File.open("./tmp/profile.dot", "w+") do |output|
22
- RubyProf::DotPrinter.new(result).print(output, min_percent: 0)
23
- end
24
-
25
- FileUtils.touch "./tmp/profile.html"
26
- File.open("./tmp/profile.html", "w+") do |output|
27
- RubyProf::CallStackPrinter.new(result).print(output, min_percent: 0)
28
- end