domainic-attributer 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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +14 -0
  3. data/LICENSE +21 -0
  4. data/README.md +396 -0
  5. data/lib/domainic/attributer/attribute/callback.rb +68 -0
  6. data/lib/domainic/attributer/attribute/coercer.rb +93 -0
  7. data/lib/domainic/attributer/attribute/mixin/belongs_to_attribute.rb +68 -0
  8. data/lib/domainic/attributer/attribute/signature.rb +338 -0
  9. data/lib/domainic/attributer/attribute/validator.rb +128 -0
  10. data/lib/domainic/attributer/attribute.rb +256 -0
  11. data/lib/domainic/attributer/attribute_set.rb +208 -0
  12. data/lib/domainic/attributer/class_methods.rb +247 -0
  13. data/lib/domainic/attributer/dsl/attribute_builder/option_parser.rb +247 -0
  14. data/lib/domainic/attributer/dsl/attribute_builder.rb +233 -0
  15. data/lib/domainic/attributer/dsl/initializer.rb +130 -0
  16. data/lib/domainic/attributer/dsl/method_injector.rb +97 -0
  17. data/lib/domainic/attributer/dsl.rb +5 -0
  18. data/lib/domainic/attributer/instance_methods.rb +65 -0
  19. data/lib/domainic/attributer/undefined.rb +44 -0
  20. data/lib/domainic/attributer.rb +114 -0
  21. data/lib/domainic-attributer.rb +3 -0
  22. data/sig/domainic/attributer/attribute/callback.rbs +48 -0
  23. data/sig/domainic/attributer/attribute/coercer.rbs +59 -0
  24. data/sig/domainic/attributer/attribute/mixin/belongs_to_attribute.rbs +46 -0
  25. data/sig/domainic/attributer/attribute/signature.rbs +223 -0
  26. data/sig/domainic/attributer/attribute/validator.rbs +83 -0
  27. data/sig/domainic/attributer/attribute.rbs +150 -0
  28. data/sig/domainic/attributer/attribute_set.rbs +134 -0
  29. data/sig/domainic/attributer/class_methods.rbs +151 -0
  30. data/sig/domainic/attributer/dsl/attribute_builder/option_parser.rbs +130 -0
  31. data/sig/domainic/attributer/dsl/attribute_builder.rbs +156 -0
  32. data/sig/domainic/attributer/dsl/initializer.rbs +91 -0
  33. data/sig/domainic/attributer/dsl/method_injector.rbs +66 -0
  34. data/sig/domainic/attributer/dsl.rbs +1 -0
  35. data/sig/domainic/attributer/instance_methods.rbs +53 -0
  36. data/sig/domainic/attributer/undefined.rbs +14 -0
  37. data/sig/domainic/attributer.rbs +69 -0
  38. data/sig/domainic-attributer.rbs +1 -0
  39. data/sig/manifest.yaml +2 -0
  40. metadata +89 -0
@@ -0,0 +1,66 @@
1
+ module Domainic
2
+ module Attributer
3
+ module DSL
4
+ # A class responsible for injecting attribute methods into classes.
5
+ #
6
+ # This class handles the creation of reader and writer methods for attributes,
7
+ # ensuring they are injected safely without overwriting existing methods. It
8
+ # respects visibility settings and properly handles value assignment through
9
+ # the attribute system.
10
+ #
11
+ # @author {https://aaronmallen.me Aaron Allen}
12
+ # @since 0.1.0
13
+ class MethodInjector
14
+ @attribute: Attribute
15
+
16
+ @base: __todo__
17
+
18
+ # Inject methods for an attribute into a class.
19
+ #
20
+ # @param base [Class, Module] the class to inject methods into
21
+ # @param attribute [Attribute] the attribute to create methods for
22
+ #
23
+ # @return [void]
24
+ def self.inject!: (__todo__ base, Attribute attribute) -> void
25
+
26
+ # Initialize a new MethodInjector.
27
+ #
28
+ # @param base [Class, Module] the class to inject methods into
29
+ # @param attribute [Attribute] the attribute to create methods for
30
+ #
31
+ # @return [void]
32
+ def initialize: (__todo__ base, Attribute attribute) -> void
33
+
34
+ # Inject reader and writer methods.
35
+ #
36
+ # @return [void]
37
+ def inject!: () -> void
38
+
39
+ private
40
+
41
+ # Define a method if it doesn't already exist.
42
+ #
43
+ # @param method_name [Symbol] the name of the method to define
44
+ # @yield the method body to define
45
+ #
46
+ # @return [void]
47
+ def define_safe_method: (Symbol method_name) { (?) [self: untyped] -> void } -> void
48
+
49
+ # Inject the attribute reader method.
50
+ #
51
+ # Creates a reader method with the configured visibility.
52
+ #
53
+ # @return [void]
54
+ def inject_reader!: () -> void
55
+
56
+ # Inject the attribute writer method.
57
+ #
58
+ # Creates a writer method that processes values through the attribute
59
+ # system before assignment. Sets the configured visibility.
60
+ #
61
+ # @return [void]
62
+ def inject_writer!: () -> void
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,53 @@
1
+ module Domainic
2
+ module Attributer
3
+ # A module providing instance-level attribute functionality.
4
+ #
5
+ # This module defines instance methods for objects that include Domainic::Attributer.
6
+ # It provides initialization handling and attribute serialization capabilities, making
7
+ # it easy to work with attribute values in a consistent way.
8
+ #
9
+ # @example Basic usage
10
+ # class Person
11
+ # include Domainic::Attributer
12
+ #
13
+ # argument :name
14
+ # option :age, default: nil
15
+ # option :role, default: 'user', private_read: true
16
+ # end
17
+ #
18
+ # person = Person.new('Alice', age: 30)
19
+ # person.to_h # => { name: 'Alice', age: 30 } # role is private, not included
20
+ #
21
+ # @author {https://aaronmallen.me Aaron Allen}
22
+ # @since 0.1.0
23
+ module InstanceMethods
24
+ # Initialize a new instance with attribute values.
25
+ #
26
+ # Handles both positional arguments and keyword options, applying them to their
27
+ # corresponding attributes. This process includes:
28
+ # 1. Validating required arguments
29
+ # 2. Applying default values
30
+ # 3. Type validation and coercion
31
+ # 4. Change notifications
32
+ #
33
+ # @raise [ArgumentError] if required arguments are missing
34
+ # @return [void]
35
+ def initialize: (*untyped arguments, **untyped keyword_arguments) -> void
36
+
37
+ # Convert public attribute values to a hash.
38
+ #
39
+ # Creates a hash containing all public readable attributes and their current values.
40
+ # Any attributes marked as private or protected for reading are excluded from
41
+ # the result.
42
+ #
43
+ # @example Basic conversion
44
+ # person = Person.new('Alice', age: 30)
45
+ # person.to_h # => { name: 'Alice', age: 30 }
46
+ #
47
+ # @return [Hash{Symbol => Object}] hash of attribute names to values
48
+ def to_hash: () -> Hash[Symbol, untyped]
49
+
50
+ alias to_h to_hash
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ module Domainic
2
+ module Attributer
3
+ # A singleton object representing an undefined value.
4
+ #
5
+ # This object is used throughout Domainic::Attributer to represent values that
6
+ # are explicitly undefined, as opposed to nil which represents the absence of
7
+ # a value. It is immutable and implements custom string representations for
8
+ # debugging purposes.
9
+ #
10
+ # @author {https://aaronmallen.me Aaron Allen}
11
+ # @since 0.1.0
12
+ Undefined: Object
13
+ end
14
+ end
@@ -0,0 +1,69 @@
1
+ module Domainic
2
+ # Core functionality for defining and managing Ruby class attributes.
3
+ #
4
+ # This module provides a flexible attribute system for Ruby classes that supports
5
+ # positional arguments and keyword options with features like type validation,
6
+ # coercion, and visibility control.
7
+ #
8
+ # Can be included directly with default method names or customized via {Domainic.Attributer}.
9
+ #
10
+ # @example Basic usage with default method names
11
+ # class Person
12
+ # include Domainic::Attributer
13
+ #
14
+ # argument :name
15
+ # option :age
16
+ # end
17
+ #
18
+ # @example Custom method names
19
+ # class Person
20
+ # include Domainic.Attributer(argument: :param, option: :opt)
21
+ #
22
+ # param :name
23
+ # opt :age
24
+ # end
25
+ #
26
+ # @author {https://aaronmallen.me Aaron Allen}
27
+ # @since 0.1.0
28
+ module Attributer
29
+ # Create a customized Attributer module.
30
+ #
31
+ # @param argument [Symbol, String] custom name for the argument method
32
+ # @param option [Symbol, String] custom name for the option method
33
+ # @return [Module] configured Attributer module
34
+ def self.call: (?argument: (String | Symbol)?, ?option: (String | Symbol)?) -> Module
35
+
36
+ # Handle direct module inclusion.
37
+ #
38
+ # @param base [Class, Module] the including class/module
39
+ # @return [void]
40
+ def self.included: (untyped base) -> void
41
+
42
+ # Configure base class with Attributer functionality.
43
+ #
44
+ # @param base [Class, Module] the target class/module
45
+ # @param options [Hash] method name customization options
46
+ # @return [void]
47
+ private def self.include_attributer: (untyped base, ?argument: (String | Symbol)?, ?option: (String | Symbol)?) -> void
48
+
49
+ # Set up custom method names.
50
+ #
51
+ # @param base [Class, Module] the target class/module
52
+ # @param options [Hash] method name customization options
53
+ # @return [void]
54
+ private def self.inject_custom_methods!: (untyped base, ?argument: (String | Symbol)?, ?option: (String | Symbol)?) -> void
55
+ end
56
+
57
+ # Create a customized Attributer module.
58
+ #
59
+ # Provides a convenient way to include Attributer with customized method names.
60
+ #
61
+ # @example
62
+ # class Person
63
+ # include Domainic.Attributer(argument: :param, option: :opt)
64
+ # end
65
+ #
66
+ # @param options [Hash] method name customization options
67
+ # @return [Module] configured Attributer module
68
+ def self.Attributer: (?argument: (String | Symbol)?, ?option: (String | Symbol)?) -> Module
69
+ end
@@ -0,0 +1 @@
1
+
data/sig/manifest.yaml ADDED
@@ -0,0 +1,2 @@
1
+ dependencies:
2
+ - name: forwardable
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: domainic-attributer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Allen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-12-12 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Your domain objects deserve better than plain old attributes. Level up
14
+ your DDD game with powerful, configurable, and well-documented class attributes
15
+ that actually know what they want in life!
16
+ email:
17
+ - hello@aaronmallen.me
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - CHANGELOG.md
23
+ - LICENSE
24
+ - README.md
25
+ - lib/domainic-attributer.rb
26
+ - lib/domainic/attributer.rb
27
+ - lib/domainic/attributer/attribute.rb
28
+ - lib/domainic/attributer/attribute/callback.rb
29
+ - lib/domainic/attributer/attribute/coercer.rb
30
+ - lib/domainic/attributer/attribute/mixin/belongs_to_attribute.rb
31
+ - lib/domainic/attributer/attribute/signature.rb
32
+ - lib/domainic/attributer/attribute/validator.rb
33
+ - lib/domainic/attributer/attribute_set.rb
34
+ - lib/domainic/attributer/class_methods.rb
35
+ - lib/domainic/attributer/dsl.rb
36
+ - lib/domainic/attributer/dsl/attribute_builder.rb
37
+ - lib/domainic/attributer/dsl/attribute_builder/option_parser.rb
38
+ - lib/domainic/attributer/dsl/initializer.rb
39
+ - lib/domainic/attributer/dsl/method_injector.rb
40
+ - lib/domainic/attributer/instance_methods.rb
41
+ - lib/domainic/attributer/undefined.rb
42
+ - sig/domainic-attributer.rbs
43
+ - sig/domainic/attributer.rbs
44
+ - sig/domainic/attributer/attribute.rbs
45
+ - sig/domainic/attributer/attribute/callback.rbs
46
+ - sig/domainic/attributer/attribute/coercer.rbs
47
+ - sig/domainic/attributer/attribute/mixin/belongs_to_attribute.rbs
48
+ - sig/domainic/attributer/attribute/signature.rbs
49
+ - sig/domainic/attributer/attribute/validator.rbs
50
+ - sig/domainic/attributer/attribute_set.rbs
51
+ - sig/domainic/attributer/class_methods.rbs
52
+ - sig/domainic/attributer/dsl.rbs
53
+ - sig/domainic/attributer/dsl/attribute_builder.rbs
54
+ - sig/domainic/attributer/dsl/attribute_builder/option_parser.rbs
55
+ - sig/domainic/attributer/dsl/initializer.rbs
56
+ - sig/domainic/attributer/dsl/method_injector.rbs
57
+ - sig/domainic/attributer/instance_methods.rbs
58
+ - sig/domainic/attributer/undefined.rbs
59
+ - sig/manifest.yaml
60
+ homepage: https://github.com/domainic/domainic/tree/domainic-attributer-v0.1.0/domainic-attributer
61
+ licenses:
62
+ - MIT
63
+ metadata:
64
+ bug_tracker_uri: https://github.com/domainic/domainic/issues
65
+ changelog_uri: https://github.com/domainic/domainic/releases/tag/domainic-attributer-v0.1.0
66
+ homepage_uri: https://github.com/domainic/domainic/tree/domainic-attributer-v0.1.0/domainic-attributer
67
+ rubygems_mfa_required: 'true'
68
+ source_code_uri: https://github.com/domainic/domainic/tree/domainic-attributer-v0.1.0/domainic-attributer
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '3.1'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubygems_version: 3.3.27
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: A toolkit for creating self-documenting, type-safe class attributes with
88
+ built-in validation, coercion, and default values.
89
+ test_files: []