core-boundary 0.0.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a3c60c0403b1eae350795cf62fb64a08a13fe081afdd99113d62156087a296b
4
- data.tar.gz: 9bd8395ab67510bd42ba0bb6f82352375e02395c273a970477bb12a5bd30e973
3
+ metadata.gz: 888c832c6456608723ba3bbc4ca60d75bc0daf7025da4a6c4c0c1dd0eb7c8b55
4
+ data.tar.gz: a2d8727f09455b413529c87bd3f283a72c385b1ebdb14a264b0be9835d698518
5
5
  SHA512:
6
- metadata.gz: 6e8ada0220bc91451e05aaa771ef405799d568d47d218afdebc099df2a482ccc67d1a29ccc6e1cd2f619d9f24bda09823af0ebe539f809a08d4cb958e00c8660
7
- data.tar.gz: 429f0f93a5eebd24d9c09ebd68f788d4bdfdfcae1b8b33ae7ee63b2150f5beef8fbdcbcdd41c528583f3ddc5a12e76c7cab5cec6b34e39ff33edc1551615b88f
6
+ metadata.gz: b81d6d3e0348016fb1e6742e01a2fb5353ae391a8f274f1dec7c322243982c80af1e1118c7bb3cf753deb6f42839e671eb4c95bda4d499d56652f2811fb8da48
7
+ data.tar.gz: f58d23822333f25076e0bcbcb4eac07a308133e30fedf30049925c67efa3f22ddfc16d08f2170d76cefd71fff49b96b25af1422eb553040920cab48559031f02
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [v0.1.0](https://github.com/bryanp/corerb/releases/tag/2023-12-24)
2
+
3
+ *released on 2023-12-24*
4
+
5
+ * `add` [#147](https://github.com/bryanp/corerb/pull/147) Add support for verification modules ([bryanp](https://github.com/bryanp))
6
+ * `dep` [#143](https://github.com/bryanp/corerb/pull/143) Deprecate `Is::*` and `Refine::*` namespaces ([bryanp](https://github.com/bryanp))
7
+
1
8
  ## [v0.0.1](https://github.com/bryanp/corerb/releases/tag/2023-12-20)
2
9
 
3
10
  *released on 2023-12-20*
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/extension"
4
- require "is/stateful"
3
+ require "core/extension"
4
+ require "core/state"
5
5
 
6
6
  require_relative "../normalizer"
7
7
 
@@ -11,7 +11,7 @@ module Core
11
11
  # [public]
12
12
  #
13
13
  module Normalization
14
- extend Is::Extension
14
+ extend Core::Extension
15
15
 
16
16
  # [public]
17
17
  #
@@ -19,7 +19,7 @@ module Core
19
19
  normalizer.action(&block)
20
20
  end
21
21
 
22
- extends dependencies: [Is::Stateful]
22
+ extends dependencies: [Core::State]
23
23
 
24
24
  applies do
25
25
  state :normalizer, default: Normalizer.new
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/extension"
4
- require "is/stateful"
3
+ require "core/extension"
4
+ require "core/state"
5
5
 
6
6
  require_relative "../validator"
7
7
 
@@ -11,7 +11,7 @@ module Core
11
11
  # [public]
12
12
  #
13
13
  module Validation
14
- extend Is::Extension
14
+ extend Core::Extension
15
15
 
16
16
  # [public]
17
17
  #
@@ -19,7 +19,7 @@ module Core
19
19
  validator.action(name, &block)
20
20
  end
21
21
 
22
- extends dependencies: [Is::Stateful]
22
+ extends dependencies: [Core::State]
23
23
 
24
24
  applies do
25
25
  state :validator, default: Validator.new
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/extension"
4
- require "is/stateful"
3
+ require "core/extension"
4
+ require "core/state"
5
5
 
6
6
  require_relative "../verifier"
7
7
 
@@ -11,7 +11,7 @@ module Core
11
11
  # [public]
12
12
  #
13
13
  module Verifiable
14
- extend Is::Extension
14
+ extend Core::Extension
15
15
 
16
16
  # [public]
17
17
  #
@@ -25,7 +25,7 @@ module Core
25
25
  verifier.optional(...)
26
26
  end
27
27
 
28
- extends dependencies: [Is::Stateful]
28
+ extends dependencies: [Core::State]
29
29
 
30
30
  applies do
31
31
  state :verifier, default: Verifier.new
@@ -1,26 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/copyable"
4
- require "is/inspectable"
5
-
6
- require "refine/object/copy"
3
+ require "core/copy"
4
+ require "core/inspect"
7
5
 
8
6
  module Core
9
7
  module Boundary
10
8
  # [public]
11
9
  #
12
10
  class Normalizer
13
- include Is::Copyable
14
- include Is::Inspectable
11
+ include Core::Inspect
15
12
 
16
- using Refine::Object::Copy
13
+ using Core::Copy
17
14
 
18
15
  def initialize
19
16
  @actions = []
20
17
  end
21
18
 
22
- callback "core.copy" do
19
+ def initialize_copy(...)
23
20
  @actions = @actions.copy
21
+
22
+ super
24
23
  end
25
24
 
26
25
  # [public]
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "core/type"
4
- require "is/inspectable"
4
+ require "core/inspect"
5
5
 
6
6
  require_relative "behavior/normalization"
7
7
  require_relative "behavior/validation"
@@ -14,7 +14,7 @@ module Core
14
14
  include Behavior::Normalization
15
15
  include Behavior::Validation
16
16
 
17
- include Is::Inspectable
17
+ include Core::Inspect
18
18
  inspects without: [:@stringified]
19
19
 
20
20
  UNDEFINED = Object.new
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/inspectable"
3
+ require "core/inspect"
4
4
 
5
5
  require_relative "errors"
6
6
 
@@ -9,7 +9,7 @@ module Core
9
9
  # [public]
10
10
  #
11
11
  class Result
12
- include Is::Inspectable
12
+ include Core::Inspect
13
13
  inspects :@values, :@errors
14
14
 
15
15
  def initialize
@@ -1,26 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/copyable"
4
- require "is/inspectable"
5
-
6
- require "refine/object/copy"
3
+ require "core/copy"
4
+ require "core/inspect"
7
5
 
8
6
  module Core
9
7
  module Boundary
10
8
  # [public]
11
9
  #
12
10
  class Validator
13
- include Is::Copyable
14
- include Is::Inspectable
11
+ include Core::Inspect
15
12
 
16
- using Refine::Object::Copy
13
+ using Core::Copy
17
14
 
18
15
  def initialize
19
16
  @validations = []
20
17
  end
21
18
 
22
- callback "core.copy" do
19
+ def initialize_copy(...)
23
20
  @validations = @validations.copy
21
+
22
+ super
24
23
  end
25
24
 
26
25
  # [public]
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "is/copyable"
4
- require "is/inspectable"
5
-
6
- require "refine/object/copy"
3
+ require "core/copy"
4
+ require "core/inspect"
7
5
 
8
6
  require_relative "error"
9
7
  require_relative "result"
@@ -14,17 +12,30 @@ module Core
14
12
  # [public]
15
13
  #
16
14
  class Verifier
17
- include Is::Copyable
18
- include Is::Inspectable
15
+ include Core::Inspect
19
16
 
20
- using Refine::Object::Copy
17
+ using Core::Copy
21
18
 
22
19
  def initialize
23
20
  @references = []
21
+ @verification_modules = []
24
22
  end
25
23
 
26
- callback "core.copy" do
24
+ def initialize_copy(...)
27
25
  @references = @references.map(&:copy)
26
+ @verification_modules = @verification_modules.copy
27
+
28
+ super
29
+ end
30
+
31
+ # [public]
32
+ #
33
+ def verifies_with(verification_module)
34
+ @references.each do |reference|
35
+ mixin_verification_module(reference, verification_module)
36
+ end
37
+
38
+ @verification_modules << verification_module
28
39
  end
29
40
 
30
41
  # [public]
@@ -39,7 +50,7 @@ module Core
39
50
  options[:type] = type
40
51
  end
41
52
 
42
- reference = Reference.new(reference, **options)
53
+ reference = build_reference(reference, **options)
43
54
 
44
55
  if block
45
56
  case block.arity
@@ -68,7 +79,7 @@ module Core
68
79
  options[:type] = type
69
80
  end
70
81
 
71
- reference = Reference.new(reference, **options)
82
+ reference = build_reference(reference, **options)
72
83
 
73
84
  if block
74
85
  case block.arity
@@ -82,6 +93,22 @@ module Core
82
93
  @references << reference
83
94
  end
84
95
 
96
+ private def build_reference(...)
97
+ Reference.new(...).tap { |reference|
98
+ mixin_verification_modules(reference)
99
+ }
100
+ end
101
+
102
+ private def mixin_verification_modules(reference)
103
+ @verification_modules.each do |verification_module|
104
+ mixin_verification_module(reference, verification_module)
105
+ end
106
+ end
107
+
108
+ private def mixin_verification_module(reference, verification_module)
109
+ reference.singleton_class.include(verification_module)
110
+ end
111
+
85
112
  # [public]
86
113
  #
87
114
  def verify(object, result: result_omitted = true)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Core
4
4
  module Boundary
5
- VERSION = "0.0.1"
5
+ VERSION = "0.1.0"
6
6
 
7
7
  # [public]
8
8
  #
data/lib/core/boundary.rb CHANGED
@@ -1,13 +1,113 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "core/extension"
4
+ require "core/state"
5
+
3
6
  module Core
4
7
  module Boundary
5
8
  require_relative "boundary/validator"
6
9
  require_relative "boundary/verifier"
7
10
  require_relative "boundary/version"
8
11
 
9
- require_relative "boundary/bootstrap"
12
+ # This gets around a circular dependency.
13
+ #
14
+ require_relative "boundary/behavior/verifiable"
15
+ Core::Boundary::Reference.include(Core::Boundary::Behavior::Verifiable)
16
+
17
+ extend Core::Extension
18
+
19
+ extends dependencies: [Core::State]
20
+
21
+ extends :definition do
22
+ # [public]
23
+ #
24
+ def boundary(method, default: false, &block)
25
+ method = method.to_sym
26
+
27
+ unless (verifier = __boundary_verifiers__[method])
28
+ verifier = (__boundary_verifiers__[method] = Core::Boundary::Verifier.new)
29
+
30
+ __boundaries_module__.module_eval(<<~CODE, __FILE__, __LINE__ + 1)
31
+ def #{method}(*arguments, **values, &block)
32
+ result = self.class.__boundary_verifiers__[#{method.inspect}].verify!(values)
33
+
34
+ super(*arguments, **result.values, &block)
35
+ end
36
+ CODE
37
+ end
38
+
39
+ if default == true
40
+ @__default_boundary__verifier__ = method
41
+ end
42
+
43
+ if block
44
+ case block.arity
45
+ when 0
46
+ verifier.instance_eval(&block)
47
+ else
48
+ block.call(verifier)
49
+ end
50
+ end
51
+
52
+ unless ancestors.include?(__boundaries_module__)
53
+ prepend(__boundaries_module__)
54
+ end
55
+
56
+ verifier
57
+ end
58
+ end
59
+
60
+ DELEGATED_METHODS = %i[required optional verifies_with].freeze
61
+
62
+ extends :definition, prepend: true do
63
+ def method_missing(name, ...)
64
+ if delegate_to_default_boundary?(name)
65
+ __boundary_verifiers__[__default_boundary__verifier__].__send__(name, ...)
66
+ else
67
+ super
68
+ end
69
+ end
70
+
71
+ def respond_to_missing?(name, ...)
72
+ delegate_to_default_boundary?(name) || super
73
+ end
74
+
75
+ private def delegate_to_default_boundary?(name)
76
+ DELEGATED_METHODS.include?(name) && __default_boundary__verifier__
77
+ end
78
+ end
79
+
80
+ extends :definition, :implementation do
81
+ # [public]
82
+ #
83
+ def verify(object, &block)
84
+ build_verifier(&block).verify(object)
85
+ end
86
+
87
+ # [public]
88
+ #
89
+ def verify!(object, &block)
90
+ build_verifier(&block).verify!(object)
91
+ end
92
+
93
+ private def build_verifier(&block)
94
+ verifier = Core::Boundary::Verifier.new
95
+
96
+ case block.arity
97
+ when 0
98
+ verifier.instance_eval(&block)
99
+ else
100
+ block.call(verifier)
101
+ end
102
+
103
+ verifier
104
+ end
105
+ end
106
+
107
+ applies do
108
+ state :__default_boundary__verifier__
109
+ state :__boundaries_module__, default: Module.new
110
+ state :__boundary_verifiers__, default: {}
111
+ end
10
112
  end
11
113
  end
12
-
13
- require_relative "../is/boundary"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: core-boundary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Powell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-20 00:00:00.000000000 Z
11
+ date: 2023-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: core-copy
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.2'
19
+ version: '0.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.2'
26
+ version: '0.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: core-extension
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.4'
33
+ version: '0.5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.4'
40
+ version: '0.5'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: core-inspect
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.1'
47
+ version: '0.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.1'
54
+ version: '0.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: core-state
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.1'
61
+ version: '0.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.1'
68
+ version: '0.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: core-type
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.0'
75
+ version: '0.1'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.0'
82
+ version: '0.1'
83
83
  description: Define boundaries for verification, validation, and normalization.
84
84
  email: bryan@bryanp.org
85
85
  executables: []
@@ -92,7 +92,6 @@ files:
92
92
  - lib/core/boundary/behavior/normalization.rb
93
93
  - lib/core/boundary/behavior/validation.rb
94
94
  - lib/core/boundary/behavior/verifiable.rb
95
- - lib/core/boundary/bootstrap.rb
96
95
  - lib/core/boundary/error.rb
97
96
  - lib/core/boundary/errors.rb
98
97
  - lib/core/boundary/normalizer.rb
@@ -101,7 +100,6 @@ files:
101
100
  - lib/core/boundary/validator.rb
102
101
  - lib/core/boundary/verifier.rb
103
102
  - lib/core/boundary/version.rb
104
- - lib/is/boundary.rb
105
103
  homepage: https://github.com/bryanp/corerb/
106
104
  licenses:
107
105
  - MPL-2.0
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "behavior/verifiable"
4
- Core::Boundary::Reference.include(Core::Boundary::Behavior::Verifiable)
data/lib/is/boundary.rb DELETED
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "is/extension"
4
- require "is/stateful"
5
-
6
- require_relative "../core/boundary/verifier"
7
- require_relative "../core/boundary/bootstrap"
8
-
9
- module Is
10
- # [public]
11
- #
12
- module Boundary
13
- extend Is::Extension
14
-
15
- extends dependencies: [Is::Stateful]
16
-
17
- extends :definition do
18
- # [public]
19
- #
20
- def boundary(method, default: false, &block)
21
- method = method.to_sym
22
-
23
- unless (verifier = __boundary_verifiers__[method])
24
- verifier = (__boundary_verifiers__[method] = Core::Boundary::Verifier.new)
25
-
26
- __boundaries_module__.module_eval(<<~CODE, __FILE__, __LINE__ + 1)
27
- def #{method}(*arguments, **values, &block)
28
- result = self.class.__boundary_verifiers__[#{method.inspect}].verify!(values)
29
-
30
- super(*arguments, **result.values, &block)
31
- end
32
- CODE
33
- end
34
-
35
- if default == true
36
- @__default_boundary__verifier__ = method
37
- end
38
-
39
- if block
40
- case block.arity
41
- when 0
42
- verifier.instance_eval(&block)
43
- else
44
- block.call(verifier)
45
- end
46
- end
47
-
48
- unless ancestors.include?(__boundaries_module__)
49
- prepend(__boundaries_module__)
50
- end
51
-
52
- verifier
53
- end
54
- end
55
-
56
- DELEGATED_METHODS = %i[required optional].freeze
57
-
58
- extends :definition, prepend: true do
59
- def method_missing(name, ...)
60
- if delegate_to_default_boundary?(name)
61
- __boundary_verifiers__[__default_boundary__verifier__].__send__(name, ...)
62
- else
63
- super
64
- end
65
- end
66
-
67
- def respond_to_missing?(name, ...)
68
- delegate_to_default_boundary?(name) || super
69
- end
70
-
71
- private def delegate_to_default_boundary?(name)
72
- DELEGATED_METHODS.include?(name) && __default_boundary__verifier__
73
- end
74
- end
75
-
76
- extends :definition, :implementation do
77
- # [public]
78
- #
79
- def verify(object, &block)
80
- build_verifier(&block).verify(object)
81
- end
82
-
83
- # [public]
84
- #
85
- def verify!(object, &block)
86
- build_verifier(&block).verify!(object)
87
- end
88
-
89
- private def build_verifier(&block)
90
- verifier = Core::Boundary::Verifier.new
91
-
92
- case block.arity
93
- when 0
94
- verifier.instance_eval(&block)
95
- else
96
- block.call(verifier)
97
- end
98
-
99
- verifier
100
- end
101
- end
102
-
103
- applies do
104
- state :__default_boundary__verifier__
105
- state :__boundaries_module__, default: Module.new
106
- state :__boundary_verifiers__, default: {}
107
- end
108
- end
109
- end