trailblazer-macro-contract 2.1.0.beta2

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.
@@ -0,0 +1,31 @@
1
+ require "test_helper"
2
+ require "dry/container"
3
+
4
+ class DryContainerTest < Minitest::Spec
5
+ Song = Struct.new(:id, :title)
6
+
7
+ class MyContract < Reform::Form
8
+ property :title
9
+ validates :title, length: 2..33
10
+ end
11
+
12
+ my_container = Dry::Container.new
13
+ my_container.register("contract.default.class", MyContract)
14
+ # my_container.namespace("contract") do
15
+ # register("create") { Array }
16
+ # end
17
+
18
+ #---
19
+ #- dependency injection
20
+ #- with Dry-container
21
+ class Create < Trailblazer::Operation
22
+ step Model( Song, :new )
23
+ step Contract::Build()
24
+ step Contract::Validate()
25
+ step Contract::Persist( method: :sync )
26
+ end
27
+ #:key end
28
+
29
+ it { Create.({ params: { title: "A" } }, my_container).inspect(:model).must_equal %{<Result:false [#<struct DryContainerTest::Song id=nil, title=nil>] >} }
30
+ it { Create.({ params: { title: "Anthony's Song" } }, my_container).inspect(:model).must_equal %{<Result:true [#<struct DryContainerTest::Song id=nil, title="Anthony's Song">] >} }
31
+ end
@@ -0,0 +1,84 @@
1
+ require "test_helper"
2
+
3
+ class ContractTest < Minitest::Spec
4
+ Song = Struct.new(:title)
5
+ #---
6
+ #- validate
7
+ class ValidateTest < Minitest::Spec
8
+ #---
9
+ # Contract::Validate[]
10
+ class Update < Trailblazer::Operation
11
+ class Form < Reform::Form
12
+ property :title
13
+ validates :title, presence: true
14
+ end
15
+
16
+ step Model( Song, :new )
17
+ step Contract::Build( constant: Form )
18
+ step Contract::Validate() # generic validate call for you.
19
+
20
+ # include Procedural::Validate
21
+ ->(*) { validate(options["params"][:song]) } # <-- TODO
22
+ end
23
+
24
+ # success
25
+ it do
26
+ result = Update.(params: {title: "SVG"})
27
+ result.success?.must_equal true
28
+ result["result.contract.default"].success?.must_equal true
29
+ result["result.contract.default"].errors.messages.must_equal({})
30
+ end
31
+
32
+ # failure
33
+ it do
34
+ result = Update.(params: {title: nil})
35
+ result.success?.must_equal false
36
+ result["result.contract.default"].success?.must_equal false
37
+ result["result.contract.default"].errors.messages.must_equal({:title=>["can't be blank"]})
38
+ end
39
+
40
+ #---
41
+ # Contract::Validate[key: :song]
42
+ class Upsert < Trailblazer::Operation
43
+ class Form < Reform::Form
44
+ property :title
45
+ validates :title, presence: true
46
+ end
47
+
48
+ step Model( Song, :new ) # FIXME.
49
+ step Contract::Build( constant: Form )
50
+ step Contract::Validate( key: :song) # generic validate call for you.
51
+ # ->(*) { validate(options["params"][:song]) } # <-- TODO
52
+ step Contract::Persist( method: :sync )
53
+ end
54
+
55
+ # success
56
+ it { Upsert.(params: {song: { title: "SVG" }}).success?.must_equal true }
57
+ # failure
58
+ it { Upsert.(params: {song: { title: nil }}).success?.must_equal false }
59
+ # key not found
60
+ it { Upsert.(params: {}).success?.must_equal false }
61
+
62
+ #---
63
+ # contract.default.params gets set (TODO: change in 2.1)
64
+ it { Upsert.( params: {song: { title: "SVG" }})[:params].must_equal({:song=>{:title=>"SVG"}} ) }
65
+ it { Upsert.( params: {song: { title: "SVG" }})["contract.default.params"].must_equal({:title=>"SVG"} ) }
66
+
67
+ #---
68
+ #- inheritance
69
+ class New < Upsert
70
+ end
71
+
72
+ it { Trailblazer::Operation::Inspect.(New).must_equal %{[>model.build,>contract.build,>contract.default.validate,>persist.save]} }
73
+
74
+ #- overwriting Validate
75
+ class NewHit < Upsert
76
+ step Contract::Validate( key: :hit ), override: true
77
+ end
78
+
79
+ it { Trailblazer::Operation::Inspect.(NewHit).must_equal %{[>model.build,>contract.build,>contract.default.validate,>persist.save]} }
80
+ it { NewHit.(params: {:hit => { title: "Hooray For Me" }}).inspect(:model).must_equal %{<Result:true [#<struct ContractTest::Song title=\"Hooray For Me\">] >} }
81
+ end
82
+ end
83
+
84
+ # TODO: full stack test with validate, process, save, etc.
@@ -0,0 +1,51 @@
1
+ require "test_helper"
2
+
3
+ class PersistTest < Minitest::Spec
4
+ Song = Struct.new(:title, :saved) do
5
+ def save; title=="Fail!" ? false : self.saved = true; end
6
+ end
7
+
8
+ class Create < Trailblazer::Operation
9
+ class Form < Reform::Form
10
+ property :title
11
+ end
12
+
13
+ class Fail1
14
+ def self.call(options, **); options["1. fail"] = "Validate" end
15
+ end
16
+
17
+ class Fail2
18
+ def self.call(options, **); options["2. fail"] = "Persist" end
19
+ end
20
+
21
+ step Model( Song, :new )
22
+ step Contract::Build( constant: Form )
23
+ step Contract::Validate()
24
+ fail Fail1
25
+ step Contract::Persist()
26
+ fail Fail2
27
+ end
28
+
29
+ it { Create.(params: { title: "In Recital" })[:model].title.must_equal "In Recital" }
30
+ it { Create.(params: { title: "In Recital" })[:model].saved.must_equal true }
31
+ # failure
32
+ it do
33
+ result = Create.(params: { title: "Fail!" })
34
+ result[:model].saved.must_be_nil
35
+ result[:model].title.must_equal "Fail!"
36
+ result["2. fail"].must_equal "Persist"
37
+ result.success?.must_equal false
38
+ end
39
+
40
+ #---
41
+ #- inheritance
42
+ class Update < Create
43
+ end
44
+
45
+ it { Operation::Inspect.( Update ).must_equal %{[>model.build,>contract.build,>contract.default.validate,<<PersistTest::Create::Fail1,>persist.save,<<PersistTest::Create::Fail2]} }
46
+
47
+ #---
48
+ it do
49
+ skip "show how save! could be applied and how we could rescue and deviate to left track"
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ require "pp"
2
+ require 'delegate'
3
+ require "trailblazer/macro"
4
+ require "trailblazer/macro/contract"
5
+ require "minitest/autorun"
6
+
7
+ # TODO: convert tests to non-rails.
8
+ require "reform"
9
+ require "reform/form/active_model/validations"
10
+ Reform::Form.class_eval do
11
+ include Reform::Form::ActiveModel::Validations
12
+ end
13
+
14
+ module Mock
15
+ class Result
16
+ def initialize(bool); @bool = bool end
17
+ def success?; @bool end
18
+ def errors; ["hihi"] end
19
+ end
20
+ end
21
+
22
+ module Test
23
+ module ReturnCall
24
+ def self.included(includer)
25
+ includer._insert :_insert, ReturnResult, {replace: Trailblazer::Operation::Result::Build}, ReturnResult, ""
26
+ end
27
+ end
28
+ ReturnResult = ->(last, input, options) { input }
29
+ end
30
+
31
+ require "pp"
32
+
33
+ Minitest::Spec::Operation = Trailblazer::Operation
34
+
35
+ Memo = Struct.new(:id, :body) do
36
+ def self.find(id)
37
+ return new(id, "Yo!") if id
38
+ nil
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'trailblazer/macro/contract/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "trailblazer-macro-contract"
7
+ spec.version = Trailblazer::Macro::Contract::VERSION
8
+ spec.authors = ["Nick Sutterer"]
9
+ spec.email = ["apotonick@gmail.com"]
10
+ spec.description = 'Trailblazer operation macros to integrate Reform'
11
+ spec.summary = 'Trailblazer operation macros to integrate Reform forms and DRY.rb schemas.'
12
+ spec.homepage = "http://trailblazer.to"
13
+ spec.license = "LGPL-3.0"
14
+
15
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "declarative"
21
+ spec.add_dependency "reform", ">= 2.2.0", "< 3.0.0"
22
+ spec.add_dependency "trailblazer-operation", ">= 0.2.4", "< 0.3.0"
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "trailblazer-macro", ">= 2.1.0.beta2", "< 2.2.0"
26
+
27
+ spec.add_development_dependency "reform-rails"
28
+ spec.add_development_dependency "dry-validation"
29
+ spec.add_development_dependency "activemodel"
30
+
31
+ spec.add_development_dependency "minitest"
32
+ spec.add_development_dependency "nokogiri"
33
+ spec.add_development_dependency "rake"
34
+
35
+ spec.add_development_dependency "roar"
36
+ spec.add_development_dependency "multi_json"
37
+
38
+ spec.required_ruby_version = '>= 2.0.0'
39
+ end
metadata ADDED
@@ -0,0 +1,270 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trailblazer-macro-contract
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0.beta2
5
+ platform: ruby
6
+ authors:
7
+ - Nick Sutterer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: declarative
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: reform
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.0
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: 3.0.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.2.0
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: 3.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: trailblazer-operation
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.4
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.3.0
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.2.4
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.3.0
67
+ - !ruby/object:Gem::Dependency
68
+ name: bundler
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: trailblazer-macro
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 2.1.0.beta2
88
+ - - "<"
89
+ - !ruby/object:Gem::Version
90
+ version: 2.2.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.1.0.beta2
98
+ - - "<"
99
+ - !ruby/object:Gem::Version
100
+ version: 2.2.0
101
+ - !ruby/object:Gem::Dependency
102
+ name: reform-rails
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: dry-validation
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: activemodel
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: minitest
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: nokogiri
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - !ruby/object:Gem::Dependency
172
+ name: rake
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ - !ruby/object:Gem::Dependency
186
+ name: roar
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ - !ruby/object:Gem::Dependency
200
+ name: multi_json
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ description: Trailblazer operation macros to integrate Reform
214
+ email:
215
+ - apotonick@gmail.com
216
+ executables: []
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - ".gitignore"
221
+ - ".rubocop.yml"
222
+ - ".rubocop_todo.yml"
223
+ - ".travis.yml"
224
+ - CHANGES.md
225
+ - COMM-LICENSE
226
+ - Gemfile
227
+ - LICENSE.txt
228
+ - README.md
229
+ - Rakefile
230
+ - lib/trailblazer/macro/contract.rb
231
+ - lib/trailblazer/macro/contract/version.rb
232
+ - lib/trailblazer/operation/contract.rb
233
+ - lib/trailblazer/operation/persist.rb
234
+ - lib/trailblazer/operation/validate.rb
235
+ - test/docs/contract_test.rb
236
+ - test/docs/dry_test.rb
237
+ - test/operation/contract_test.rb
238
+ - test/operation/persist_test.rb
239
+ - test/test_helper.rb
240
+ - trailblazer-macro-contract.gemspec
241
+ homepage: http://trailblazer.to
242
+ licenses:
243
+ - LGPL-3.0
244
+ metadata: {}
245
+ post_install_message:
246
+ rdoc_options: []
247
+ require_paths:
248
+ - lib
249
+ required_ruby_version: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: 2.0.0
254
+ required_rubygems_version: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">"
257
+ - !ruby/object:Gem::Version
258
+ version: 1.3.1
259
+ requirements: []
260
+ rubyforge_project:
261
+ rubygems_version: 2.7.3
262
+ signing_key:
263
+ specification_version: 4
264
+ summary: Trailblazer operation macros to integrate Reform forms and DRY.rb schemas.
265
+ test_files:
266
+ - test/docs/contract_test.rb
267
+ - test/docs/dry_test.rb
268
+ - test/operation/contract_test.rb
269
+ - test/operation/persist_test.rb
270
+ - test/test_helper.rb