hashcraft 1.0.0.pre.alpha.1

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,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require_relative 'mutators/array'
11
+ require_relative 'mutators/hash'
12
+ require_relative 'mutators/property'
13
+
14
+ module Hashcraft
15
+ # Singleton that knows how to register and retrieve mutator instances.
16
+ class MutatorRegistry < Generic::Registry
17
+ def initialize
18
+ super(
19
+ 'array' => Mutators::Array.instance,
20
+ 'hash' => Mutators::Hash.instance,
21
+ 'property' => Mutators::Property.instance,
22
+ '' => Mutators::Property.instance
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Mutators
12
+ # When a hash's key is an arry then this mutator can be used to push a new value on the
13
+ # respective array.
14
+ class Array
15
+ include Singleton
16
+
17
+ def value!(data, key, value)
18
+ data[key] ||= []
19
+ data[key] << value
20
+
21
+ self
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Mutators
12
+ # When a hash's key a Hash then this mutator can be used to merge a new value on the
13
+ # respective hash.
14
+ class Hash
15
+ include Singleton
16
+
17
+ def value!(data, key, value)
18
+ data[key] ||= {}
19
+ data[key].merge!(value || {})
20
+
21
+ self
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Mutators
12
+ # When a hash key can be simply assigned to (like a property) then this mutator can be used to
13
+ # simply do the assignment.
14
+ class Property
15
+ include Singleton
16
+
17
+ def value!(data, key, value)
18
+ data[key] = value
19
+
20
+ self
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ # Defines a method and corresponding attribute for a craftable class.
12
+ class Option
13
+ attr_reader :craft,
14
+ :default,
15
+ :eager,
16
+ :key,
17
+ :mutator,
18
+ :name
19
+
20
+ def initialize(name, opts = {})
21
+ raise ArgumentError, 'name is required' if name.to_s.empty?
22
+
23
+ @craft = opts[:craft]
24
+ @default = opts[:default]
25
+ @eager = opts[:eager] || false
26
+ @internal_meta = (opts[:meta] || {}).symbolize_keys
27
+ @key = opts[:key].to_s
28
+ @mutator = MutatorRegistry.resolve(opts[:mutator])
29
+ @name = name.to_s
30
+
31
+ freeze
32
+ end
33
+
34
+ def meta(key)
35
+ internal_meta[key.to_s.to_sym]
36
+ end
37
+
38
+ def default!(data)
39
+ return self unless eager
40
+
41
+ data[name] = default
42
+
43
+ self
44
+ end
45
+
46
+ def value!(data, value, &block)
47
+ value = craft_value(value, &block)
48
+
49
+ mutator.value!(data, name, value)
50
+
51
+ self
52
+ end
53
+
54
+ private
55
+
56
+ attr_reader :internal_meta
57
+
58
+ def craft_value(value, &block)
59
+ craft ? craft.new(value, &block) : value
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require_relative 'transformers/camel_case'
11
+ require_relative 'transformers/pascal_case'
12
+ require_relative 'transformers/pass_thru'
13
+
14
+ module Hashcraft
15
+ # Singleton that knows how to register and retrieve transformer instances.
16
+ class TransformerRegistry < Generic::Registry
17
+ def initialize
18
+ super(
19
+ 'camel_case' => Transformers::CamelCase.instance,
20
+ 'pascal_case' => Transformers::PascalCase.instance,
21
+ 'pass_thru' => Transformers::PassThru.instance,
22
+ '' => Transformers::PassThru.instance
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Transformers
12
+ # Transform snake-cased to camel-cased string. Example:
13
+ # date_of_birth => dateOfBirth
14
+ # DATE_OF_BIRTH => dateOfBirth
15
+ class CamelCase
16
+ include Singleton
17
+
18
+ def transform(value, _option)
19
+ return '' if value.to_s.empty?
20
+
21
+ name = value.to_s.split('_').collect(&:capitalize).join
22
+
23
+ name[0, 1].downcase + name[1..-1]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Transformers
12
+ # Transform snake-cased to pascal-cased string. Example:
13
+ # date_of_birth => DateOfBirth
14
+ # DATE_OF_BIRTH => DateOfBirth
15
+ class PascalCase
16
+ include Singleton
17
+
18
+ def transform(value, _option)
19
+ return '' if value.to_s.empty?
20
+
21
+ value.to_s.split('_').collect(&:capitalize).join
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ module Transformers
12
+ # Default transformer, simply returns the value passed in.
13
+ class PassThru
14
+ include Singleton
15
+
16
+ def transform(value, _option)
17
+ value
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Hashcraft
11
+ VERSION = '1.0.0-alpha.1'
12
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hashcraft
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Ruggio
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-07-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard-rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.79.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.79.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.17.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.17.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov-console
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.6.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.6.0
111
+ description: " Provides a DSL for implementing classes which can then be consumed
112
+ to create pre-defined hashes.\n"
113
+ email:
114
+ - mruggio@bluemarblepayroll.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".editorconfig"
120
+ - ".gitignore"
121
+ - ".rubocop.yml"
122
+ - ".ruby-version"
123
+ - ".travis.yml"
124
+ - CHANGELOG.md
125
+ - CODE_OF_CONDUCT.md
126
+ - Gemfile
127
+ - Guardfile
128
+ - LICENSE
129
+ - README.md
130
+ - Rakefile
131
+ - bin/console
132
+ - hashcraft.gemspec
133
+ - lib/hashcraft.rb
134
+ - lib/hashcraft/base.rb
135
+ - lib/hashcraft/compiler.rb
136
+ - lib/hashcraft/core_ext/hash.rb
137
+ - lib/hashcraft/dsl.rb
138
+ - lib/hashcraft/generic.rb
139
+ - lib/hashcraft/generic/dictionary.rb
140
+ - lib/hashcraft/generic/registry.rb
141
+ - lib/hashcraft/mutator_registry.rb
142
+ - lib/hashcraft/mutators/array.rb
143
+ - lib/hashcraft/mutators/hash.rb
144
+ - lib/hashcraft/mutators/property.rb
145
+ - lib/hashcraft/option.rb
146
+ - lib/hashcraft/transformer_registry.rb
147
+ - lib/hashcraft/transformers/camel_case.rb
148
+ - lib/hashcraft/transformers/pascal_case.rb
149
+ - lib/hashcraft/transformers/pass_thru.rb
150
+ - lib/hashcraft/version.rb
151
+ homepage: https://github.com/bluemarblepayroll/hashcraft
152
+ licenses:
153
+ - MIT
154
+ metadata:
155
+ bug_tracker_uri: https://github.com/bluemarblepayroll/hashcraft/issues
156
+ changelog_uri: https://github.com/bluemarblepayroll/hashcraft/blob/master/CHANGELOG.md
157
+ documentation_uri: https://www.rubydoc.info/gems/hashcraft
158
+ homepage_uri: https://github.com/bluemarblepayroll/hashcraft
159
+ source_code_uri: https://github.com/bluemarblepayroll/hashcraft
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '2.5'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.3.1
174
+ requirements: []
175
+ rubygems_version: 3.0.3
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Hash-based Data Contracting Domain Specific Language
179
+ test_files: []