trailblazer 1.1.2 → 2.0.0.beta1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -7
  3. data/CHANGES.md +108 -0
  4. data/COMM-LICENSE +91 -0
  5. data/Gemfile +18 -4
  6. data/LICENSE.txt +7 -20
  7. data/README.md +55 -15
  8. data/Rakefile +21 -2
  9. data/draft-1.2.rb +7 -0
  10. data/lib/trailblazer.rb +17 -4
  11. data/lib/trailblazer/dsl.rb +47 -0
  12. data/lib/trailblazer/operation/auto_inject.rb +47 -0
  13. data/lib/trailblazer/operation/builder.rb +18 -18
  14. data/lib/trailblazer/operation/callback.rb +31 -38
  15. data/lib/trailblazer/operation/contract.rb +46 -0
  16. data/lib/trailblazer/operation/controller.rb +45 -27
  17. data/lib/trailblazer/operation/guard.rb +24 -0
  18. data/lib/trailblazer/operation/model.rb +41 -33
  19. data/lib/trailblazer/operation/nested.rb +43 -0
  20. data/lib/trailblazer/operation/params.rb +13 -0
  21. data/lib/trailblazer/operation/persist.rb +13 -0
  22. data/lib/trailblazer/operation/policy.rb +26 -72
  23. data/lib/trailblazer/operation/present.rb +19 -0
  24. data/lib/trailblazer/operation/procedural/contract.rb +15 -0
  25. data/lib/trailblazer/operation/procedural/validate.rb +22 -0
  26. data/lib/trailblazer/operation/pundit.rb +42 -0
  27. data/lib/trailblazer/operation/representer.rb +25 -92
  28. data/lib/trailblazer/operation/rescue.rb +23 -0
  29. data/lib/trailblazer/operation/resolver.rb +18 -24
  30. data/lib/trailblazer/operation/validate.rb +50 -0
  31. data/lib/trailblazer/operation/wrap.rb +37 -0
  32. data/lib/trailblazer/version.rb +1 -1
  33. data/test/{operation/controller_test.rb → controller_test.rb} +8 -4
  34. data/test/docs/auto_inject_test.rb +30 -0
  35. data/test/docs/contract_test.rb +429 -0
  36. data/test/docs/dry_test.rb +31 -0
  37. data/test/docs/guard_test.rb +143 -0
  38. data/test/docs/nested_test.rb +117 -0
  39. data/test/docs/policy_test.rb +2 -0
  40. data/test/docs/pundit_test.rb +109 -0
  41. data/test/docs/representer_test.rb +268 -0
  42. data/test/docs/rescue_test.rb +153 -0
  43. data/test/docs/wrap_test.rb +174 -0
  44. data/test/gemfiles/Gemfile.ruby-1.9 +3 -0
  45. data/test/gemfiles/Gemfile.ruby-2.0 +12 -0
  46. data/test/gemfiles/Gemfile.ruby-2.3 +12 -0
  47. data/test/module_test.rb +22 -15
  48. data/test/operation/builder_test.rb +66 -18
  49. data/test/operation/callback_test.rb +70 -0
  50. data/test/operation/contract_test.rb +385 -15
  51. data/test/operation/dsl/callback_test.rb +18 -30
  52. data/test/operation/dsl/contract_test.rb +209 -19
  53. data/test/operation/dsl/representer_test.rb +42 -15
  54. data/test/operation/guard_test.rb +1 -147
  55. data/test/operation/model_test.rb +105 -0
  56. data/test/operation/params_test.rb +36 -0
  57. data/test/operation/persist_test.rb +44 -0
  58. data/test/operation/pipedream_test.rb +59 -0
  59. data/test/operation/pipetree_test.rb +104 -0
  60. data/test/operation/present_test.rb +24 -0
  61. data/test/operation/pundit_test.rb +104 -0
  62. data/test/{representer_test.rb → operation/representer_test.rb} +58 -42
  63. data/test/operation/resolver_test.rb +34 -70
  64. data/test/operation_test.rb +57 -189
  65. data/test/test_helper.rb +23 -3
  66. data/trailblazer.gemspec +8 -7
  67. metadata +91 -59
  68. data/gemfiles/Gemfile.rails.lock +0 -130
  69. data/gemfiles/Gemfile.reform-2.0 +0 -6
  70. data/gemfiles/Gemfile.reform-2.1 +0 -7
  71. data/lib/trailblazer/autoloading.rb +0 -15
  72. data/lib/trailblazer/endpoint.rb +0 -31
  73. data/lib/trailblazer/operation.rb +0 -175
  74. data/lib/trailblazer/operation/collection.rb +0 -6
  75. data/lib/trailblazer/operation/dispatch.rb +0 -3
  76. data/lib/trailblazer/operation/model/dsl.rb +0 -29
  77. data/lib/trailblazer/operation/model/external.rb +0 -34
  78. data/lib/trailblazer/operation/policy/guard.rb +0 -35
  79. data/lib/trailblazer/operation/uploaded_file.rb +0 -77
  80. data/test/callback_test.rb +0 -104
  81. data/test/collection_test.rb +0 -57
  82. data/test/model_test.rb +0 -148
  83. data/test/operation/external_model_test.rb +0 -71
  84. data/test/operation/policy_test.rb +0 -97
  85. data/test/operation/reject_test.rb +0 -34
  86. data/test/rollback_test.rb +0 -47
@@ -1,28 +1,26 @@
1
1
  require "test_helper"
2
- require "trailblazer/operation/dispatch"
3
-
4
2
 
5
3
  class DslCallbackTest < MiniTest::Spec
6
4
  module SongProcess
7
- def process(params)
8
- contract(OpenStruct.new).validate(params)
9
- dispatch!
10
- end
11
-
12
5
  def _invocations
13
- @_invocations ||= []
6
+ self["x"] ||= []
14
7
  end
15
8
 
16
9
  def self.included(includer)
10
+ includer.extend Trailblazer::Operation::Contract::DSL
17
11
  includer.contract do
18
12
  property :title
19
13
  end
14
+ includer.| Trailblazer::Operation::Model[OpenStruct, :new]
15
+ includer.| Trailblazer::Operation::Contract::Build[includer["contract.default.class"]]
16
+ includer.| Trailblazer::Operation::Contract::Validate[]
17
+ includer.| Trailblazer::Operation::Callback[:default]
20
18
  end
21
19
  end
22
20
 
23
21
  describe "inheritance across operations" do
24
22
  class Operation < Trailblazer::Operation
25
- include Dispatch
23
+ extend Callback::DSL
26
24
  include SongProcess
27
25
 
28
26
  callback do
@@ -39,21 +37,14 @@ class DslCallbackTest < MiniTest::Spec
39
37
  def admin_default!(*); _invocations << :admin_default!; end
40
38
  def after_save!(*); _invocations << :after_save!; end
41
39
 
42
- def process(*)
43
- super
44
- dispatch!(:after_save)
45
- end
40
+ self.| Trailblazer::Operation::Callback[:after_save]
46
41
  end
47
42
 
48
43
  def default!(*); _invocations << :default!; end
49
44
  end
50
45
 
51
- it { Operation.({"title"=> "Love-less"})._invocations.must_equal([:default!]) }
52
- it { Operation::Admin.({"title"=> "Love-less"})._invocations.must_equal([:default!, :admin_default!, :after_save!]) }
53
- end
54
-
55
- describe "Op.callback" do
56
- it { Operation.callback(:default).must_equal Operation.callbacks[:default][:group] }
46
+ it { Operation.({"title"=> "Love-less"})["x"].must_equal([:default!]) }
47
+ it { Operation::Admin.({"title"=> "Love-less"})["x"].must_equal([:default!, :admin_default!, :after_save!]) }
57
48
  end
58
49
 
59
50
  describe "Op.callback :after_save, AfterSaveCallback" do
@@ -66,17 +57,14 @@ class DslCallbackTest < MiniTest::Spec
66
57
  end
67
58
 
68
59
  class OpWithExternalCallback < Trailblazer::Operation
69
- include Dispatch
70
60
  include SongProcess
61
+ extend Callback::DSL
71
62
  callback :after_save, AfterSaveCallback
72
63
 
73
- def process(params)
74
- contract(OpenStruct.new).validate(params)
75
- dispatch!(:after_save)
76
- end
64
+ self.| Callback[:after_save]
77
65
  end
78
66
 
79
- it { OpWithExternalCallback.("title"=>"Thunder Rising")._invocations.must_equal([:after_save!]) }
67
+ it { OpWithExternalCallback.("title"=>"Thunder Rising").must_equal([:after_save!]) }
80
68
  end
81
69
 
82
70
  describe "Op.callback :after_save, AfterSaveCallback do .. end" do
@@ -89,13 +77,13 @@ class DslCallbackTest < MiniTest::Spec
89
77
  end
90
78
 
91
79
  class OpUsingCallback < Trailblazer::Operation
92
- include Dispatch
80
+ extend Callback::DSL
93
81
  include SongProcess
94
82
  callback :default, DefaultCallback
95
83
  end
96
84
 
97
85
  class OpExtendingCallback < Trailblazer::Operation
98
- include Dispatch
86
+ extend Callback::DSL
99
87
  include SongProcess
100
88
  callback :default, DefaultCallback do
101
89
  on_change :after_save!
@@ -111,8 +99,8 @@ class DslCallbackTest < MiniTest::Spec
111
99
  end
112
100
 
113
101
  # this operation copies DefaultCallback and shouldn't run #after_save!.
114
- it { OpUsingCallback.(title: "Thunder Rising")._invocations.must_equal([:default!]) }
102
+ it { OpUsingCallback.(title: "Thunder Rising")["x"].must_equal([:default!]) }
115
103
  # this operation copies DefaultCallback, extends it and runs #after_save!.
116
- it { OpExtendingCallback.(title: "Thunder Rising")._invocations.must_equal([:extended_default!, :after_save!]) }
104
+ it { OpExtendingCallback.(title: "Thunder Rising")["x"].must_equal([:extended_default!, :after_save!]) }
117
105
  end
118
- end
106
+ end
@@ -1,16 +1,165 @@
1
1
  require "test_helper"
2
+ require "trailblazer/operation/contract"
3
+
4
+ # contract Constant # new
5
+ # contract Constant, inherit: true # extend existing
6
+ # contract do end # extend existing || new
7
+ # contract Constant do .. end # new, extend new
2
8
 
3
- # ::contract builds Reform::Form class
4
9
  class DslContractTest < MiniTest::Spec
5
- module SongProcess
6
- def process(params)
7
- validate(params, @model = OpenStruct.new)
10
+ module Call
11
+ def call(params)
12
+ validate(params, model: model=OpenStruct.new) { contract.sync }
13
+ model
14
+ end
15
+
16
+ def self.included(includer)
17
+ includer.| Trailblazer::Operation::Model( OpenStruct, :new )
18
+ includer.| Trailblazer::Operation::Contract::Build()
19
+ includer.| Trailblazer::Operation::Contract::Validate()
20
+ includer.| Trailblazer::Operation::Persist( save_method: :sync )
21
+ # includer.> ->(op, *) { op["x"] = [] }
22
+ end
23
+ end
24
+
25
+ # ---
26
+ # Operation::["contract.default.class"]
27
+ # Operation::["contract.default.class"]=
28
+ class Create < Trailblazer::Operation
29
+ include Contract
30
+ self["contract.default.class"] = String
31
+ end
32
+
33
+ # reader method.
34
+ # no subclassing.
35
+ it { Create["contract.default.class"].must_equal String }
36
+
37
+ class CreateOrFind < Create
38
+ end
39
+
40
+ # no inheritance with setter.
41
+ it { CreateOrFind["contract.default.class"].must_equal nil }
42
+
43
+ # ---
44
+ # Op::contract Constant
45
+ class Update < Trailblazer::Operation
46
+ class IdContract < Reform::Form
47
+ property :id
48
+ end
49
+
50
+ extend Contract::DSL
51
+ contract IdContract
52
+
53
+ include Call
54
+ end
55
+
56
+ # UT: subclasses contract.
57
+ it { Update["contract.default.class"].superclass.must_equal Update::IdContract }
58
+ # IT: only knows `id`.
59
+ it { Update.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct id=1>} }
60
+
61
+ # Op::contract with inheritance
62
+ # no ::contract call.
63
+ class Upgrade < Update
64
+ end
65
+
66
+ # UT: subclasses contract but doesn't share with parent.
67
+ it { Upgrade["contract.default.class"].superclass.must_equal Update::IdContract }
68
+ it { Upgrade["contract.default.class"].wont_equal Update["contract.default.class"] }
69
+ # IT: only knows `id`.
70
+ it { Upgrade.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct id=1>} }
71
+
72
+ # ::contract B overrides old A contract.
73
+ # this makes sure when calling contract(Constant), the old class gets wiped and is replaced with the new constant.
74
+ class Upsert < Update
75
+ class TitleContract < Reform::Form
76
+ property :title
77
+ end
78
+
79
+ contract TitleContract
80
+ end
81
+
82
+ # UT: subclasses contract.
83
+ it { Upsert["contract.default.class"].superclass.must_equal Upsert::TitleContract }
84
+ # IT: only knows `title`.
85
+ it { Upsert.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct title="Coaster">} }
86
+
87
+ # ::contract B do ..end overrides and extends new.
88
+ # using a constant will wipe out the existing class.
89
+ class Upside < Update
90
+ contract Upsert::TitleContract do
91
+ property :id
92
+ end
93
+ end
94
+
95
+ # UT: subclasses contract.
96
+ it { Upside["contract.default.class"].superclass.must_equal Upsert::TitleContract }
97
+ # IT: only knows `title`.
98
+ it { Upside.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct title="Coaster", id=1>} }
99
+
100
+
101
+
102
+ #---
103
+ # contract do .. end
104
+ # (with block)
105
+ class Delete < Trailblazer::Operation
106
+ include Call
107
+ extend Contract::DSL
108
+ contract do
109
+ property :title
110
+ end
111
+ end
112
+
113
+ # UT: contract path is "contract.default.class"
114
+ it { Delete["contract.default.class"].definitions.keys.must_equal ["title"] }
115
+ # IT: knows `title`.
116
+ it { Delete.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct title=\"Coaster\">} }
117
+
118
+ class Wipe < Trailblazer::Operation
119
+ extend Contract::DSL
120
+
121
+ self["x"] = contract do end
122
+ end
123
+ # UT: ::contract returns form class
124
+ it { Wipe["x"].superclass.must_equal Reform::Form }
125
+
126
+ # subsequent calls merge.
127
+ class Remove < Trailblazer::Operation
128
+ extend Contract::DSL
129
+ include Call
130
+
131
+ contract do
132
+ property :title
133
+ end
134
+
135
+ contract do
136
+ property :id
137
+ end
138
+ end
139
+
140
+ # IT: knows `title` and `id`, since contracts get merged.
141
+ it { Remove.(id: 1, title: "Coaster")["model"].inspect.must_equal %{#<OpenStruct title=\"Coaster\", id=1>} }
142
+
143
+
144
+
145
+
146
+
147
+
148
+ # Operation::["contract.default.class"]
149
+ # Operation::["contract.default.class"]=
150
+ describe %{Operation::["contract.default.class"]} do
151
+
152
+ class Update2 < Trailblazer::Operation
153
+ self["contract.default.class"] = String
8
154
  end
155
+
156
+ it { Update2["contract.default.class"].must_equal String }
9
157
  end
10
158
 
11
159
  describe "inheritance across operations" do
12
160
  # inheritance
13
161
  class Operation < Trailblazer::Operation
162
+ extend Contract::DSL
14
163
  contract do
15
164
  property :title
16
165
  property :band
@@ -22,24 +171,28 @@ class DslContractTest < MiniTest::Spec
22
171
  property :band, virtual: true
23
172
  end
24
173
  end
174
+
175
+ class XML < self
176
+ end
25
177
  end
26
178
 
27
179
  # inherits subclassed Contract.
28
- it { Operation.contract_class.wont_equal Operation::JSON.contract_class }
180
+ it { Operation["contract.default.class"].wont_equal Operation::JSON["contract.default.class"] }
181
+ it { Operation::XML["contract.default.class"].superclass.must_equal Reform::Form }
29
182
 
30
183
  it do
31
- form = Operation.contract_class.new(OpenStruct.new)
184
+ form = Operation["contract.default.class"].new(OpenStruct.new)
32
185
  form.validate({})#.must_equal true
33
186
  form.errors.to_s.must_equal "{}"
34
187
 
35
- form = Operation::JSON.contract_class.new(OpenStruct.new)
188
+ form = Operation::JSON["contract.default.class"].new(OpenStruct.new)
36
189
  form.validate({})#.must_equal true
37
190
  form.errors.to_s.must_equal "{:genre=>[\"can't be blank\"]}"
38
191
  end
39
192
 
40
193
  # allows overriding options
41
194
  it do
42
- form = Operation::JSON.contract_class.new(song = OpenStruct.new)
195
+ form = Operation::JSON["contract.default.class"].new(song = OpenStruct.new)
43
196
  form.validate({genre: "Punkrock", band: "Osker"}).must_equal true
44
197
  form.sync
45
198
 
@@ -48,21 +201,18 @@ class DslContractTest < MiniTest::Spec
48
201
  end
49
202
  end
50
203
 
51
- describe "Op.contract" do
52
- it { Operation.contract.must_equal Operation.contract_class }
53
- end
54
-
55
204
  describe "Op.contract CommentForm" do
56
205
  class SongForm < Reform::Form
57
206
  property :songTitle, validates: {presence: true}
58
207
  end
59
208
 
60
209
  class OpWithExternalContract < Trailblazer::Operation
210
+ extend Contract::DSL
61
211
  contract SongForm
62
- include SongProcess
212
+ include Call
63
213
  end
64
214
 
65
- it { OpWithExternalContract.("songTitle"=> "Monsterparty").contract.songTitle.must_equal "Monsterparty" }
215
+ it { OpWithExternalContract.("songTitle"=> "Monsterparty")["contract.default"].songTitle.must_equal "Monsterparty" }
66
216
  end
67
217
 
68
218
  describe "Op.contract CommentForm do .. end" do
@@ -71,27 +221,29 @@ class DslContractTest < MiniTest::Spec
71
221
  end
72
222
 
73
223
  class OpNotExtendingContract < Trailblazer::Operation
224
+ extend Contract::DSL
74
225
  contract DifferentSongForm
75
- include SongProcess
226
+ include Call
76
227
  end
77
228
 
78
229
  class OpExtendingContract < Trailblazer::Operation
230
+ extend Contract::DSL
79
231
  contract DifferentSongForm do
80
232
  property :genre
81
233
  end
82
- include SongProcess
234
+ include Call
83
235
  end
84
236
 
85
237
  # this operation copies DifferentSongForm and shouldn't have `genre`.
86
238
  it do
87
- contract = OpNotExtendingContract.("songTitle"=>"Monsterparty", "genre"=>"Punk").contract
239
+ contract = OpNotExtendingContract.("songTitle"=>"Monsterparty", "genre"=>"Punk")["contract.default"]
88
240
  contract.songTitle.must_equal "Monsterparty"
89
241
  assert_raises(NoMethodError) { contract.genre }
90
242
  end
91
243
 
92
244
  # this operation copies DifferentSongForm and extends it with the property `genre`.
93
245
  it do
94
- contract = OpExtendingContract.("songTitle"=>"Monsterparty", "genre"=>"Punk").contract
246
+ contract = OpExtendingContract.("songTitle"=>"Monsterparty", "genre"=>"Punk")["contract.default"]
95
247
  contract.songTitle.must_equal "Monsterparty"
96
248
  contract.genre.must_equal "Punk"
97
249
  end
@@ -101,4 +253,42 @@ class DslContractTest < MiniTest::Spec
101
253
  assert_raises(NoMethodError) { DifferentSongForm.new(OpenStruct.new).genre }
102
254
  end
103
255
  end
104
- end
256
+
257
+ describe "Op.contract :name, Form" do
258
+ class Follow < Trailblazer::Operation
259
+ ParamsForm = Class.new
260
+
261
+ extend Contract::DSL
262
+ contract :params, ParamsForm
263
+ end
264
+
265
+ it { Follow["contract.params.class"].superclass.must_equal Follow::ParamsForm }
266
+ end
267
+
268
+ describe "Op.contract :name do..end" do
269
+ class Unfollow < Trailblazer::Operation
270
+ extend Contract::DSL
271
+ contract :params do
272
+ property :title
273
+ end
274
+ end
275
+
276
+ it { Unfollow["contract.params.class"].superclass.must_equal Reform::Form }
277
+ end
278
+
279
+ # multiple ::contract calls.
280
+ describe "multiple ::contract calls" do
281
+ class Star < Trailblazer::Operation
282
+ extend Contract::DSL
283
+ contract do
284
+ property :title
285
+ end
286
+
287
+ contract do
288
+ property :id
289
+ end
290
+ end
291
+
292
+ it { Star["contract.default.class"].definitions.keys.must_equal ["title", "id"] }
293
+ end
294
+ end
@@ -1,15 +1,16 @@
1
1
  require "test_helper"
2
2
  require "representable/json"
3
3
  require "trailblazer/operation/representer"
4
+ require "trailblazer/operation/contract"
4
5
 
5
6
  class DslRepresenterTest < MiniTest::Spec
6
7
  module SongProcess
7
8
  def process(params)
8
- @model = OpenStruct.new(params)
9
+ self["model"] = OpenStruct.new(params)
9
10
  end
10
11
 
11
12
  def represented
12
- model
13
+ self["model"]
13
14
  end
14
15
  end
15
16
 
@@ -34,10 +35,6 @@ class DslRepresenterTest < MiniTest::Spec
34
35
  it { Operation::JSON.(title: "Nothing To Lose", band: "Gary Moore").to_json.must_equal %{{"title":"Nothing To Lose","band":"Gary Moore"}} }
35
36
  end
36
37
 
37
- describe "Op.representer" do
38
- it { Operation.representer.must_equal Operation.representer_class }
39
- end
40
-
41
38
  describe "Op.representer CommentRepresenter" do
42
39
  class SongRepresenter < Representable::Decorator
43
40
  include Representable::JSON
@@ -53,6 +50,32 @@ class DslRepresenterTest < MiniTest::Spec
53
50
  it { OpWithExternalRepresenter.("songTitle"=>"Listen To Your Heartbeat").to_json.must_equal %{{"songTitle":"Listen To Your Heartbeat"}} }
54
51
  end
55
52
 
53
+ # name for representer
54
+ describe "1) Op.representer :parse, Representer" do
55
+ class Op1 < Trailblazer::Operation
56
+ include Representer
57
+ representer :parse, String
58
+ end
59
+
60
+ it { Op1["representer.parse.class"].superclass.must_equal String }
61
+ it { Op1.({})["representer.parse.class"].superclass.must_equal String }
62
+ end
63
+
64
+ # name for default representer
65
+ describe "2) Op.representer Representer" do
66
+ class Op2 < Trailblazer::Operation
67
+ include Representer
68
+ representer String
69
+ def call(*); self; end
70
+ end
71
+
72
+ it { Op2["representer.default.class"].superclass.must_equal String }
73
+ it { Op2.({})["representer.default.class"].superclass.must_equal String }
74
+ it { Op2.({}, "representer.default.class" => Integer)["representer.default.class"].must_equal Integer }
75
+ end
76
+
77
+
78
+
56
79
  describe "Op.representer CommentRepresenter do .. end" do
57
80
  class HitRepresenter < Representable::Decorator
58
81
  include Representable::JSON
@@ -90,28 +113,32 @@ class DslRepresenterTest < MiniTest::Spec
90
113
  end
91
114
 
92
115
  describe "Op.representer (inferring)" do
93
- class OpWithContract < Trailblazer::Operation
116
+ class ContractOperation < Trailblazer::Operation
94
117
  include Representer
118
+ include Representer::InferFromContract
95
119
  include SongProcess
120
+ include Contract::Explicit
96
121
 
97
122
  contract do
98
123
  property :songTitle
99
124
  end
100
125
  end
101
126
 
102
- class OpWithContract2 < Trailblazer::Operation
127
+ class ContractOperation2 < Trailblazer::Operation
103
128
  include Representer
104
129
  include SongProcess
130
+ include Contract::Explicit
131
+ include Representer::InferFromContract
132
+ contract ContractOperation["contract.default.class"]
105
133
 
106
- contract OpWithContract.contract
107
134
  representer do
108
135
  property :genre
109
136
  end
110
137
  end
111
138
 
112
- it { OpWithContract.("songTitle"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"songTitle":"Monsterparty"}} }
139
+ it { ContractOperation.("songTitle"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"songTitle":"Monsterparty"}} }
113
140
  # this representer block extends the inferred from contract.
114
- it { OpWithContract2.("songTitle"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"songTitle":"Monsterparty","genre":"Punk"}} }
141
+ it { ContractOperation2.("songTitle"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"songTitle":"Monsterparty","genre":"Punk"}} }
115
142
  end
116
143
 
117
144
  describe "Op.representer_class" do
@@ -123,20 +150,20 @@ class DslRepresenterTest < MiniTest::Spec
123
150
  class OpSettingRepresenter < Trailblazer::Operation
124
151
  include Representer
125
152
  include SongProcess
126
- self.representer_class= PlayRepresenter
153
+ self["representer.default.class"] = PlayRepresenter
127
154
  end
128
155
 
129
156
  class OpExtendRepresenter < Trailblazer::Operation
130
157
  include Representer
131
158
  include SongProcess
132
- self.representer_class= PlayRepresenter
159
+ self["representer.default.class"] = PlayRepresenter
133
160
  representer do
134
161
  property :genre
135
162
  end
136
163
  end
137
164
 
138
165
  # both operations produce the same as the representer is shared, not copied.
139
- it { OpSettingRepresenter.("title"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"title":"Monsterparty","genre":"Punk"}} }
166
+ it { skip; OpSettingRepresenter.("title"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"title":"Monsterparty","genre":"Punk"}} }
140
167
  it { OpExtendRepresenter.("title"=>"Monsterparty", "genre"=>"Punk").to_json.must_equal %{{"title":"Monsterparty","genre":"Punk"}} }
141
168
  end
142
- end
169
+ end