trailblazer-declarative 0.0.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.
- checksums.yaml +7 -0
- data/.github/workflows/main.yml +18 -0
- data/.gitignore +8 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +10 -0
- data/README.md +18 -0
- data/Rakefile +12 -0
- data/lib/trailblazer/declarative/schema.rb +69 -0
- data/lib/trailblazer/declarative/state.rb +65 -0
- data/lib/trailblazer/declarative/version.rb +5 -0
- data/lib/trailblazer/declarative.rb +11 -0
- data/trailblazer-declarative.gemspec +34 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 243dc1410b80f1a84c5d6a85b7e933d64cb9fee257cf2b5fd63d76c791246e53
|
4
|
+
data.tar.gz: 6186c3c33419a8692bc91dbe3a29fef6b343cee22ccf65a0c429a18e62a48d9d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f0f638638dbd13ef1c7fa8517bba2e6b6d469f5b56df83d93b162ccbcf3efd0d5d6cbb4c8637d535c411a71128a5082ed3da01b80b227c06d15a7ddaab3da1b
|
7
|
+
data.tar.gz: b29bc27efa77142065687093bea0105f0a1c96cc27f576cf8c4ad83a4811348627d780b8a4407be3ecbf0941d59aeb452c51b7cc370e3175ad01f0dd44336ab3
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push,pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- name: Set up Ruby
|
11
|
+
uses: ruby/setup-ruby@v1
|
12
|
+
with:
|
13
|
+
ruby-version: 3.0.0
|
14
|
+
- name: Run the default task
|
15
|
+
run: |
|
16
|
+
gem install bundler -v 2.2.11
|
17
|
+
bundle install
|
18
|
+
bundle exec rake
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Trailblazer::Declarative
|
2
|
+
|
3
|
+
|
4
|
+
## State
|
5
|
+
|
6
|
+
`State` is a minimalistic state handling object, similar to a hash with
|
7
|
+
additional "inheritance" logic via `State#copy`. Every field in `state`
|
8
|
+
can have a specific copying strategy, ranging from simply referencing the
|
9
|
+
original object to subclassing.
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
state = Declarative.State(key: ["value", ...])
|
13
|
+
state.add!
|
14
|
+
state.update!
|
15
|
+
state.get
|
16
|
+
state.copy # inheritance
|
17
|
+
```
|
18
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module Trailblazer
|
2
|
+
module Declarative
|
3
|
+
def self.Schema(&block)
|
4
|
+
Class.new do
|
5
|
+
extend Trailblazer::Declarative::Schema
|
6
|
+
instance_exec(&block)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
# Include this to maintain inheritable, nested schemas with ::defaults and
|
10
|
+
# ::feature the way we have it in Representable, Reform, and Disposable.
|
11
|
+
#
|
12
|
+
# The schema with its defnitions will be kept in ::definitions.
|
13
|
+
#
|
14
|
+
# Requirements to includer: ::default_nested_class, override building with ::nested_builder.
|
15
|
+
module Schema
|
16
|
+
def self.extended(extender)
|
17
|
+
extender.extend DSL # ::property
|
18
|
+
# extender.extend Feature # ::feature
|
19
|
+
# extender.extend Heritage::DSL # ::heritage
|
20
|
+
# extender.extend Heritage::Inherited # ::included
|
21
|
+
|
22
|
+
extender.initialize_state!() # replaces {@definitions ||= Definitions.new(definition_class)}
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# class << self
|
27
|
+
# end
|
28
|
+
|
29
|
+
module DSL
|
30
|
+
# def initialize_state!()
|
31
|
+
# @state = State.new
|
32
|
+
# end
|
33
|
+
|
34
|
+
# # @return State
|
35
|
+
# def update_state!(key, value)
|
36
|
+
# @state = @state.merge(key => value)
|
37
|
+
# end
|
38
|
+
|
39
|
+
def property(name, options={}, &block)
|
40
|
+
# heritage.record(:property, name, options, &block)
|
41
|
+
|
42
|
+
# build_definition(name, options, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
module State
|
47
|
+
def initialize_state!(tuples)
|
48
|
+
@state = Declarative.State(tuples)
|
49
|
+
end
|
50
|
+
|
51
|
+
def state
|
52
|
+
@state
|
53
|
+
end
|
54
|
+
|
55
|
+
module Inherited
|
56
|
+
# DISCUSS: this is *not* a class method and will not be executed when extended the first time.
|
57
|
+
def inherited(subclass)
|
58
|
+
super
|
59
|
+
|
60
|
+
inherited_fields = state.copy_fields(subclass: subclass)
|
61
|
+
|
62
|
+
subclass.initialize_state!(inherited_fields) # TODO: discuss, should this be done "in" the subclass rather than here?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end # Schema::State
|
66
|
+
end # Schema
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Trailblazer
|
2
|
+
module Declarative
|
3
|
+
# Class-wide configuration data
|
4
|
+
def self.State(tuples={})
|
5
|
+
state = State.new
|
6
|
+
tuples.each { |path, (value, options)| state.add!(path, value, **options) }
|
7
|
+
state
|
8
|
+
end
|
9
|
+
|
10
|
+
class State # FIXME: who is providing the immutable API?
|
11
|
+
def self.dup(value, **) # DISCUSS: should that be here?
|
12
|
+
value.dup
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.subclass(value, **)
|
16
|
+
Class.new(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@fields = {}
|
21
|
+
@field_options = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def add!(path, value, copy: State.method(:dup))
|
25
|
+
@fields[path] = value
|
26
|
+
@field_options[path] = {copy: copy}
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Tries to retrieve {path}, if it exists {block} is called
|
31
|
+
# and receives the old value.
|
32
|
+
# The return value of the block will be the new value.
|
33
|
+
def update!(path, &block)
|
34
|
+
value = get(path)
|
35
|
+
new_value = yield(value, **{})
|
36
|
+
set!(path, new_value)
|
37
|
+
end
|
38
|
+
|
39
|
+
def get(path)
|
40
|
+
@fields.fetch(path)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @private
|
44
|
+
def set!(path, value)
|
45
|
+
@fields[path] = value
|
46
|
+
end
|
47
|
+
|
48
|
+
def copy_fields(**options)
|
49
|
+
inherited_fields = @fields.collect do |path, value|
|
50
|
+
path_options = @field_options.fetch(path)
|
51
|
+
inherited_value = path_options.fetch(:copy).(value, **options)
|
52
|
+
|
53
|
+
[path, [inherited_value, path_options]]
|
54
|
+
end.to_h
|
55
|
+
end
|
56
|
+
|
57
|
+
# DISCUSS: do we need it?
|
58
|
+
def copy(**options) # DISCUSS: make class method?
|
59
|
+
inherited_fields = copy_fields(**options)
|
60
|
+
|
61
|
+
Declarative.State(inherited_fields)
|
62
|
+
end
|
63
|
+
end # State
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/trailblazer/declarative/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "trailblazer-declarative"
|
7
|
+
spec.version = Trailblazer::Declarative::VERSION
|
8
|
+
spec.authors = ["Nick Sutterer"]
|
9
|
+
spec.email = ["apotonick@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Generic DSL providing schemas and inheritance."
|
12
|
+
spec.homepage = "https://github.com/trailblazer/trailblazer-declarative"
|
13
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
14
|
+
|
15
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
16
|
+
spec.metadata["source_code_uri"] = "https://github.com/trailblazer/trailblazer-declarative"
|
17
|
+
spec.metadata["changelog_uri"] = "https://github.com/trailblazer/trailblazer-declarative/CHANGELOG.md"
|
18
|
+
|
19
|
+
# Specify which files should be added to the gem when it is released.
|
20
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
21
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
22
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
23
|
+
end
|
24
|
+
spec.bindir = "exe"
|
25
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
26
|
+
spec.require_paths = ["lib"]
|
27
|
+
|
28
|
+
# Uncomment to register a new dependency of your gem
|
29
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
30
|
+
spec.add_development_dependency "minitest-line"
|
31
|
+
|
32
|
+
# For more information and examples about making a new gem, checkout our
|
33
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trailblazer-declarative
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nick Sutterer
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-03-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest-line
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- apotonick@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".github/workflows/main.yml"
|
35
|
+
- ".gitignore"
|
36
|
+
- CHANGELOG.md
|
37
|
+
- Gemfile
|
38
|
+
- README.md
|
39
|
+
- Rakefile
|
40
|
+
- lib/trailblazer/declarative.rb
|
41
|
+
- lib/trailblazer/declarative/schema.rb
|
42
|
+
- lib/trailblazer/declarative/state.rb
|
43
|
+
- lib/trailblazer/declarative/version.rb
|
44
|
+
- trailblazer-declarative.gemspec
|
45
|
+
homepage: https://github.com/trailblazer/trailblazer-declarative
|
46
|
+
licenses: []
|
47
|
+
metadata:
|
48
|
+
homepage_uri: https://github.com/trailblazer/trailblazer-declarative
|
49
|
+
source_code_uri: https://github.com/trailblazer/trailblazer-declarative
|
50
|
+
changelog_uri: https://github.com/trailblazer/trailblazer-declarative/CHANGELOG.md
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 2.4.0
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubygems_version: 3.2.3
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: Generic DSL providing schemas and inheritance.
|
70
|
+
test_files: []
|