bcdd-process 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9aec3a08f8e5f7dd092929d24fb76c2c1b95d07bf13b3683256daafe19595070
4
- data.tar.gz: bb29f54a9ec8129bfbb52a1465736df59fa0c34957dc5cebe9566c3d312ec040
3
+ metadata.gz: 4fc44df9862fb1cc767ccf9c30a2449c9757beededc5362a827f0910cce3502f
4
+ data.tar.gz: ac170094d857f6dc057675083ebf5224620a423d8e9b09e50b5ab31f0442802b
5
5
  SHA512:
6
- metadata.gz: 15b804dd0b7b72c1e2c93013619677f1ca45db9f9fe56cb818c83ef59c2974064304366475d43b6e0a2232c677bff7edc76c439c773c083868e3fe1600ef06d9
7
- data.tar.gz: 02da1b070eb0f1ad40b5c04e719aae2759aaaaca9fac878c4abc4afb588a788032417d9a3a4f754baeb81a70d9dbc9f2d41ac485917a24f547442a4b6e855768
6
+ metadata.gz: d55396e492e307ff8c62e54b875bc4476c34918a4f0d722f1f8ef15a1a78ca12f1c984b4d129fa9957e237d431a923fd05325ff22eae58aca7d8f34ea7a06ab5
7
+ data.tar.gz: b81991dc5c9ee80191e5045824a22a91f5bd0635ba584585402d56e793fd5d2026e007e3288c02a7e2a61dede9b2436635151d97517294e4bd45d102b4885127
data/CHANGELOG.md CHANGED
@@ -1,11 +1,35 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0] - 2024-02-03
4
+
5
+ ### Added
6
+
7
+ - Allow the usage of `proc(&)` with the input `normalize:` property.
8
+ ```ruby
9
+ attribute :name, type: String, normalize: proc(&:to_s) >> proc(&:strip)
10
+ ```
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING**: Remove `validate:` input property and allow the composition of `contract:` + `type:` properties.
15
+ ```ruby
16
+ # Before
17
+ attribute :name, type: String, validate: :is_present
18
+
19
+ # After
20
+ attribute :name, type: String, contract: is_present
21
+ ```
22
+
3
23
  ## [0.2.0] - 2024-02-01
4
24
 
5
- - Update gem's dependencies.
25
+ ### Changed
26
+
27
+ - **BREAKING**: Update gem's dependencies.
6
28
  - bcdd-contract >= 0.1.0
7
29
  - bcdd-result >= 0.3.0
8
30
 
9
31
  ## [0.1.0] - 2024-02-01
10
32
 
33
+ ### Added
34
+
11
35
  - Add `BCDD::Process` - Initial/POC release.
data/README.md CHANGED
@@ -37,7 +37,7 @@ class User
37
37
  include BCDD::Result::RollbackOnFailure
38
38
 
39
39
  input do
40
- attribute :uuid, contract: :is_uuid, default: -> { ::SecureRandom.uuid }, normalize: -> { _1.strip.downcase }
40
+ attribute :uuid, contract: :is_uuid, normalize: -> { _1.strip.downcase }, default: -> { ::SecureRandom.uuid }
41
41
  attribute :name, contract: :is_str, normalize: -> { _1.strip.gsub(/\s+/, ' ') }
42
42
  attribute :email, contract: :is_email, normalize: -> { _1.strip.downcase }
43
43
  attribute :password, contract: :is_password
@@ -47,13 +47,13 @@ class User
47
47
  output do
48
48
  Failure(
49
49
  invalid_user: :errors_by_attribute,
50
- email_already_taken: :empty_hash,
50
+ email_already_taken: :empty_hash
51
51
  )
52
52
 
53
- user = contract[::User] & :is_persisted
54
- token = contract[Token] & :is_persisted
55
-
56
- Success(user_created: { user:, token: })
53
+ Success user_created: {
54
+ user: contract[::User] & :is_persisted,
55
+ token: contract[Token] & :is_persisted
56
+ }
57
57
  end
58
58
 
59
59
  def call(**input)
@@ -5,32 +5,29 @@ class Account
5
5
  include BCDD::Result::RollbackOnFailure
6
6
 
7
7
  input do
8
- attribute :uuid, contract: :is_uuid, default: -> { ::SecureRandom.uuid }, normalize: -> { _1.strip.downcase }
9
- attribute :owner, type: ::Hash, validate: :is_present
8
+ attribute :uuid, contract: :is_uuid, normalize: -> { _1.strip.downcase }, default: -> { ::SecureRandom.uuid }
9
+ attribute :owner, type: ::Hash, contract: :is_present
10
10
  end
11
11
 
12
12
  output do
13
13
  Failure(
14
14
  invalid_owner: ::Hash,
15
- invalid_account: :errors_by_attribute,
15
+ invalid_account: :errors_by_attribute
16
16
  )
17
17
 
18
- user = contract[::User] & :is_persisted
19
- account = contract[::Account] & :is_persisted
20
-
21
- Success(account_owner_created: { account:, user: })
18
+ Success account_owner_created: {
19
+ user: contract[::User] & :is_persisted,
20
+ account: contract[::Account] & :is_persisted
21
+ }
22
22
  end
23
23
 
24
24
  def call(**input)
25
- Given(input)
26
- .then { |result|
27
- rollback_on_failure {
28
- result
29
- .and_then(:create_owner)
30
- .and_then(:create_account)
31
- .and_then(:link_owner_to_account)
32
- }
33
- }.and_expose(:account_owner_created, %i[account user])
25
+ rollback_on_failure {
26
+ Given(input)
27
+ .and_then(:create_owner)
28
+ .and_then(:create_account)
29
+ .and_then(:link_owner_to_account)
30
+ }.and_expose(:account_owner_created, %i[account user])
34
31
  end
35
32
 
36
33
  private
@@ -5,7 +5,7 @@ class User
5
5
  include BCDD::Result::RollbackOnFailure
6
6
 
7
7
  input do
8
- attribute :uuid, contract: :is_uuid, default: -> { ::SecureRandom.uuid }, normalize: -> { _1.strip.downcase }
8
+ attribute :uuid, contract: :is_uuid, normalize: -> { _1.strip.downcase }, default: -> { ::SecureRandom.uuid }
9
9
  attribute :name, contract: :is_str, normalize: -> { _1.strip.gsub(/\s+/, ' ') }
10
10
  attribute :email, contract: :is_email, normalize: -> { _1.strip.downcase }
11
11
  attribute :password, contract: :is_password
@@ -15,13 +15,13 @@ class User
15
15
  output do
16
16
  Failure(
17
17
  invalid_user: :errors_by_attribute,
18
- email_already_taken: :empty_hash,
18
+ email_already_taken: :empty_hash
19
19
  )
20
20
 
21
- user = contract[::User] & :is_persisted
22
- token = contract[Token] & :is_persisted
23
-
24
- Success(user_created: { user:, token: })
21
+ Success user_created: {
22
+ user: contract[::User] & :is_persisted,
23
+ token: contract[Token] & :is_persisted
24
+ }
25
25
  end
26
26
 
27
27
  def call(**input)
@@ -13,9 +13,7 @@ class User::Token
13
13
  token_creation_failed: :errors_by_attribute
14
14
  )
15
15
 
16
- token = contract[User::Token] & :is_persisted
17
-
18
- Success(token_created: { token: })
16
+ Success token_created: { token: contract[User::Token] & :is_persisted }
19
17
  end
20
18
 
21
19
  def call(**input)
@@ -3,13 +3,13 @@
3
3
  module BCDD::Contracts
4
4
  HasSize = ->(min, max) { ->(val) { val.size.between?(min, max) or "must be >= #{min} and <= #{max} chars" } }
5
5
 
6
- is_str = ::BCDD::Contract[::String]
6
+ is_str = contract[::String]
7
7
  is_uuid = ->(val) { val.match?(/\A[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}\z/) or '%p must be an UUID' }
8
8
  is_email = ->(val) { val.match?(::URI::MailTo::EMAIL_REGEXP) or '%p must be an email' }
9
9
  is_present = ->(val) { val.present? or '%p must be present' }
10
10
  is_persisted = ->(val) { val.persisted? or '%p must be persisted' }
11
11
 
12
- ::BCDD::Contract.register(
12
+ register(
13
13
  is_str: is_str,
14
14
  is_uuid: is_str & is_present & is_uuid,
15
15
  is_email: is_str & is_present& is_email,
@@ -18,11 +18,11 @@ module BCDD::Contracts
18
18
  is_persisted: is_persisted
19
19
  )
20
20
 
21
- EmptyHash = ::BCDD::Contract[::Hash] & ->(value) { value.empty? }
22
- ErrorMessages = ::BCDD::Contract[errors: [::String]]
23
- ErrorsByAttribute = ::BCDD::Contract.pairs(::Symbol => [::String])
21
+ EmptyHash = contract[::Hash] & ->(value) { value.empty? }
22
+ ErrorMessages = contract[errors: [::String]]
23
+ ErrorsByAttribute = contract.pairs(::Symbol => [::String])
24
24
 
25
- ::BCDD::Contract.register(
25
+ register(
26
26
  empty_hash: EmptyHash,
27
27
  error_messages: ErrorMessages,
28
28
  errors_by_attribute: ErrorsByAttribute
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDD::Contract
4
+ # TODO: Move to bcdd-contract
5
+ module Null
6
+ class Checking
7
+ include Core::Checking
8
+
9
+ EMPTY_ARRAY = [].freeze
10
+
11
+ def initialize(_checker, value)
12
+ @value = value
13
+ @errors = EMPTY_ARRAY
14
+ end
15
+
16
+ def errors_message
17
+ ''
18
+ end
19
+ end
20
+ end
21
+
22
+ # TODO: Move to bcdd-contract
23
+ def self.null(value)
24
+ Null::Checking.new(nil, value)
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TODO: Move to bcdd-contract
4
+ module BCDD::Contracts
5
+ class << self
6
+ private
7
+
8
+ def contract
9
+ ::BCDD::Contract
10
+ end
11
+
12
+ def register(**kargs)
13
+ # TODO: Remove this method and make the use open BCDD::Contracts module to register contracts
14
+ ::BCDD::Contract.register(**kargs)
15
+ end
16
+ end
17
+
18
+ NotNil = contract[-> { _1.nil? and 'cannot be nil' }]
19
+
20
+ register(not_nil: NotNil)
21
+ end
@@ -3,18 +3,6 @@
3
3
  module BCDD
4
4
  class Process
5
5
  module Caller
6
- class NullContract
7
- attr_reader :value
8
-
9
- def initialize(value)
10
- @value = value
11
- end
12
-
13
- def invalid?
14
- false
15
- end
16
- end
17
-
18
6
  PrepareInputs = ->(spec, input) do
19
7
  spec.each_with_object({}) do |(name, options), result|
20
8
  value = input.fetch(name) do
@@ -27,7 +15,7 @@ module BCDD
27
15
 
28
16
  value = options[:normalize].call(value) if options.key?(:normalize)
29
17
 
30
- result[name] = options.key?(:contract) ? options[:contract][value] : NullContract.new(value)
18
+ result[name] = options.key?(:contract) ? options[:contract][value] : Contract.null(value)
31
19
  end
32
20
  end
33
21
 
@@ -10,17 +10,15 @@ module BCDD
10
10
  if options.key?(:contract) || options.key?(:type) || options.key?(:validate)
11
11
  resolve(options).then { required ? _1 : (_1 | nil) }
12
12
  elsif required
13
- Contracts::CannotBeNil
13
+ Contracts::NotNil
14
14
  end
15
15
  end
16
16
 
17
17
  def self.resolve(options)
18
- return ::BCDD::Contract[options[:contract]] if options.key?(:contract)
19
-
20
18
  type = ::BCDD::Contract.unit(options[:type]) if options.key?(:type)
21
- validate = ::BCDD::Contract.unit(options[:validate]) if options.key?(:validate)
19
+ contract = ::BCDD::Contract[options[:contract]] if options.key?(:contract)
22
20
 
23
- type && validate ? (type & validate) : type || validate
21
+ type && contract ? (type & contract) : type || contract
24
22
  end
25
23
  end
26
24
 
@@ -36,7 +34,7 @@ module BCDD
36
34
  MapNormalize = ->(options) do
37
35
  value = options[:normalize]
38
36
 
39
- return value if value.is_a?(Proc) && value.lambda? && value.arity == 1
37
+ return value if value.is_a?(Proc) && value.lambda?
40
38
 
41
39
  raise ArgumentError, 'normalize value must be a lambda with one arity'
42
40
  end
@@ -51,10 +49,6 @@ module BCDD
51
49
  def attribute(name, **options)
52
50
  name.is_a?(Symbol) or raise ArgumentError, "#{name.inspect} must be a Symbol"
53
51
 
54
- if options.key?(:contract) && (options.key?(:type) || options.key?(:validate))
55
- raise ArgumentError, 'Cannot specify both :contract and (:type or :validate)'
56
- end
57
-
58
52
  spec = {}
59
53
  spec[:default] = MapDefault[options] if options.key?(:default)
60
54
  spec[:normalize] = MapNormalize[options] if options.key?(:normalize)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module BCDD
4
4
  class Process
5
- VERSION = '0.2.0'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
data/lib/bcdd/process.rb CHANGED
@@ -3,16 +3,15 @@
3
3
  require 'bcdd/result'
4
4
  require 'bcdd/contract'
5
5
 
6
+ require_relative 'contracts'
7
+ require_relative 'contract/null'
8
+
6
9
  require_relative 'process/version'
7
10
  require_relative 'process/caller'
8
11
  require_relative 'process/input_spec'
9
12
  require_relative 'process/output_spec'
10
13
 
11
14
  module BCDD
12
- module Contracts
13
- CannotBeNil = BCDD::Contract[-> { _1.nil? and 'cannot be nil' }]
14
- end
15
-
16
15
  class Process
17
16
  class << self
18
17
  attr_reader :__input__, :__input_contract__, :__output__
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcdd-process
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-01 00:00:00.000000000 Z
11
+ date: 2024-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcdd-contract
@@ -71,6 +71,8 @@ files:
71
71
  - examples/business_processes/lib/runtime_breaker.rb
72
72
  - examples/business_processes/lib/transitions_listener/stdout.rb
73
73
  - lib/bcdd-process.rb
74
+ - lib/bcdd/contract/null.rb
75
+ - lib/bcdd/contracts.rb
74
76
  - lib/bcdd/process.rb
75
77
  - lib/bcdd/process/caller.rb
76
78
  - lib/bcdd/process/input_spec.rb