active_value 0.1.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/publish.yml +41 -0
- data/.github/workflows/test.yml +16 -0
- data/README.md +38 -13
- data/active_value.gemspec +9 -16
- data/lib/active_value.rb +1 -1
- data/lib/active_value/base.rb +90 -36
- data/lib/active_value/version.rb +1 -1
- metadata +24 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5072b5c5ad5e643c3bdc8c9986be317b3badfce1bfce29e79c07795046113957
|
4
|
+
data.tar.gz: 89956a9fefb5ba8a6e7a4ca70b3bb5cfab527fc0a133d830790659d8a5e99d5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb9ac9c497dce8199818f4d59a694f8fd8f016313eca4e8a893428d706ab233bf1d01cba0c258258a4b3dcf348c9cebc8a7a8dabd88072fa09043986374d7024
|
7
|
+
data.tar.gz: e61bc5891f72b87fff0ecf593b0037792cea63e1114f515d2c732e6ebdba47ebe1f55310a9ceef92a1821ff5eafebd008372addd1ed96f1f53c50e8940439451
|
@@ -0,0 +1,41 @@
|
|
1
|
+
name: Publish
|
2
|
+
on:
|
3
|
+
workflow_dispatch:
|
4
|
+
push:
|
5
|
+
branches: [ $default-branch ]
|
6
|
+
tags:
|
7
|
+
- v*
|
8
|
+
jobs:
|
9
|
+
build:
|
10
|
+
name: Build + Publish
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- name: Set up Ruby 3.0
|
15
|
+
uses: ruby/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
ruby-version: 3.0
|
18
|
+
bundler-cache: true
|
19
|
+
- name: Publish to GitHub Package Repository
|
20
|
+
run: |
|
21
|
+
mkdir -p $HOME/.gem
|
22
|
+
touch $HOME/.gem/credentials
|
23
|
+
chmod 0600 $HOME/.gem/credentials
|
24
|
+
printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
25
|
+
gem build *.gemspec
|
26
|
+
gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
|
27
|
+
env:
|
28
|
+
GEM_HOST_API_KEY: "Bearer ${{ secrets.GITHUB_TOKEN }}"
|
29
|
+
OWNER: ${{ github.repository_owner }}
|
30
|
+
continue-on-error: true
|
31
|
+
- name: Publish to RubyGems
|
32
|
+
run: |
|
33
|
+
mkdir -p $HOME/.gem
|
34
|
+
touch $HOME/.gem/credentials
|
35
|
+
chmod 0600 $HOME/.gem/credentials
|
36
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
37
|
+
gem build *.gemspec
|
38
|
+
gem push *.gem
|
39
|
+
env:
|
40
|
+
GEM_HOST_API_KEY: "${{ secrets.RUBYGEMS_AUTH_TOKEN }}"
|
41
|
+
continue-on-error: true
|
@@ -0,0 +1,16 @@
|
|
1
|
+
name: Test
|
2
|
+
on: [push, pull_request]
|
3
|
+
jobs:
|
4
|
+
test:
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
strategy:
|
7
|
+
fail-fast: false
|
8
|
+
matrix:
|
9
|
+
ruby: [3.0, 2.7, 2.3]
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v2
|
12
|
+
- uses: ruby/setup-ruby@v1
|
13
|
+
with:
|
14
|
+
ruby-version: ${{ matrix.ruby }}
|
15
|
+
bundler-cache: true
|
16
|
+
- run: bundle exec rake
|
data/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
-
|
1
|
+
![TEST](https://img.shields.io/github/workflow/status/hiratai/active_value/Test?style=for-the-badge)
|
2
|
+
![RELEASE_VERSION](https://img.shields.io/github/v/release/hiratai/active_value?style=for-the-badge)
|
3
|
+
![GEM_VERSION](https://img.shields.io/gem/v/active_value?style=for-the-badge)
|
4
|
+
![LICENSE](https://img.shields.io/github/license/hiratai/active_value?style=for-the-badge)
|
2
5
|
|
3
|
-
|
4
|
-
However like ActiveRecord.
|
6
|
+
# ActiveValue
|
5
7
|
|
8
|
+
ActiveValue::Base is base class for immutable value object that has interfaces like ActiveRecord.
|
9
|
+
In a class inherited this class, constant variables get the behavior like records of ActiveRecord.
|
6
10
|
|
7
11
|
## Installation
|
8
12
|
|
@@ -14,7 +18,7 @@ gem 'active_value'
|
|
14
18
|
|
15
19
|
And then execute:
|
16
20
|
|
17
|
-
$ bundle
|
21
|
+
$ bundle install
|
18
22
|
|
19
23
|
Or install it yourself as:
|
20
24
|
|
@@ -23,19 +27,40 @@ Or install it yourself as:
|
|
23
27
|
|
24
28
|
## Usage
|
25
29
|
|
30
|
+
1. Define the target class inherited from ActiveValue::Base
|
31
|
+
2. List attributes of the object using attr_accessor
|
32
|
+
3. Declare constant variables as this instance in this class
|
33
|
+
|
26
34
|
```ruby
|
27
|
-
class
|
28
|
-
|
35
|
+
class FormCategory < ActiveValue::Base
|
36
|
+
|
29
37
|
attr_accessor :id, :symbol, :name
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
|
39
|
+
CHECK_BOX = new id: 1, symbol: :checkbox, name: "Check Box"
|
40
|
+
RADIO = new id: 2, symbol: :radio, name: "Radio Button"
|
41
|
+
SELECT_BOX = new id: 3, symbol: :select, name: "Select Box"
|
42
|
+
TEXT = new id: 4, symbol: :text, name: "Text Box"
|
43
|
+
TEXTAREA = new id: 5, symbol: :textarea, name: "Text Area"
|
44
|
+
|
37
45
|
end
|
38
46
|
```
|
47
|
+
Then, constant variables in the class can be accessed by following methods.
|
48
|
+
```ruby
|
49
|
+
FormCategory.find(1)
|
50
|
+
=> <#FormCategory id: 1, symbol: :checkbox, name: "Check Box" >
|
51
|
+
|
52
|
+
FormCategory.find_by(symbol: :radio).name
|
53
|
+
=> "Radio Button"
|
54
|
+
|
55
|
+
FormCategory.find(1).checkbox?
|
56
|
+
=> true
|
57
|
+
|
58
|
+
FormCategory.pluck(:id, :name)
|
59
|
+
=> [[1, "Check Box"], [2, "Radio Button"], [3, "Select Box"], ...]
|
60
|
+
|
61
|
+
FormCategory.find(2).to_h
|
62
|
+
=> { :id => 2, :symbol => :radio, :name => "Radio Button" }
|
63
|
+
```
|
39
64
|
|
40
65
|
|
41
66
|
## Contributing
|
data/active_value.gemspec
CHANGED
@@ -7,22 +7,13 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "active_value"
|
8
8
|
spec.version = ActiveValue::VERSION
|
9
9
|
spec.authors = ["Taiki Hiramatsu"]
|
10
|
-
spec.email = ["
|
10
|
+
spec.email = ["info@hiramatsu-sa-office.jp"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
13
|
-
|
12
|
+
spec.summary = %q{ActiveValue is base class for immutable value object that has interfaces like ActiveRecord.}
|
13
|
+
spec.description = %q{In a class inherited this class, constant variables get the behavior like records of ActiveRecord.}
|
14
14
|
spec.homepage = "https://github.com/hiratai/active_value"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
-
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
21
|
-
else
|
22
|
-
raise "RubyGems 2.0 or newer is required to protect against " \
|
23
|
-
"public gem pushes."
|
24
|
-
end
|
25
|
-
|
26
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
18
|
f.match(%r{^(test|spec|features)/})
|
28
19
|
end
|
@@ -30,9 +21,11 @@ Gem::Specification.new do |spec|
|
|
30
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
22
|
spec.require_paths = ["lib"]
|
32
23
|
|
33
|
-
spec.
|
34
|
-
|
35
|
-
spec.add_development_dependency "
|
24
|
+
spec.required_ruby_version = ">= 2.3"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "> 1.0.0"
|
27
|
+
spec.add_development_dependency "rake", "> 10.0"
|
28
|
+
spec.add_development_dependency "minitest", "> 5.0"
|
36
29
|
|
37
|
-
spec.add_dependency "activesupport"
|
30
|
+
spec.add_dependency "activesupport", "~> 5.2.4"
|
38
31
|
end
|
data/lib/active_value.rb
CHANGED
data/lib/active_value/base.rb
CHANGED
@@ -1,51 +1,82 @@
|
|
1
1
|
require "active_support/core_ext/hash/keys"
|
2
|
+
require "json"
|
2
3
|
|
3
4
|
module ActiveValue
|
4
|
-
#
|
5
|
-
# ActiveRecord
|
6
|
-
# このクラスを継承したクラス内で宣言した定数をレコードとして扱うことができる。
|
7
|
-
# 継承先のクラスでattr_accessorで要素を定義することで、その要素をDBのカラムのように扱うことができる。
|
5
|
+
# ActiveValue::Base is base class for immutable value object that has interfaces like ActiveRecord.
|
6
|
+
# In a class inherited this class, constant variables get the behavior like records of ActiveRecord.
|
8
7
|
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
8
|
+
# Usage.
|
9
|
+
# 1. Define the target class inherited from ActiveValue::Base
|
10
|
+
# 2. List attributes of the object using attr_accessor
|
11
|
+
# 3. Declare constant variables as this class
|
13
12
|
#
|
13
|
+
# Example.
|
14
|
+
# class QuestionType < ActiveValue::Base
|
15
|
+
# attr_accessor :id, :symbol, :name
|
16
|
+
# CHECKBOX = new id: 1, symbol: :checkbox, name: "Check Box"
|
17
|
+
# RADIO = new id: 2, symbol: :radio, name: "Radio Button"
|
18
|
+
# SELECTBOX = new id: 3, symbol: :select, name: "Select Box"
|
19
|
+
# TEXT = new id: 4, symbol: :text, name: "Text Box"
|
20
|
+
# TEXTAREA = new id: 5, symbol: :textarea, name: "Text Area"
|
21
|
+
# end
|
22
|
+
# QuestionType.find(1)
|
23
|
+
# => QuestionType::CHECKBOX
|
24
|
+
# QuestionType.find(1).name
|
25
|
+
# => "Check Box"
|
26
|
+
# QuestionType.find(1).checkbox?
|
27
|
+
# => true
|
28
|
+
# QuestionType.pluck(:id, :name)
|
29
|
+
# => [[1, "Check Box"], [2, "Radio Button"], [3, "Select Box"], ...]
|
30
|
+
|
14
31
|
class Base
|
15
32
|
|
16
|
-
#
|
33
|
+
# Delegate undefined method calls to `all` method (returns Array).
|
17
34
|
def self.method_missing(method, *args, &block)
|
18
35
|
all.public_send(method, *args, &block)
|
19
36
|
end
|
20
37
|
|
21
|
-
#
|
22
|
-
def self.find(index)
|
38
|
+
# Getter interface by the id element like `find` method in ActiveRecord.
|
39
|
+
def self.find(index)
|
40
|
+
object = all.bsearch { |object| object.public_send(:id) >= index }
|
41
|
+
object&.id == index ? object : nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# Getter interface by the argument element like `find_by` method in ActiveRecord.
|
23
45
|
def self.find_by(conditions)
|
24
|
-
|
46
|
+
unsorted_all.find do |object|
|
25
47
|
conditions.all? { |key, value| object.public_send(key) == value }
|
26
48
|
end
|
27
49
|
end
|
50
|
+
|
51
|
+
# Get all constant instances. (Unsorted)
|
52
|
+
def self.unsorted_all
|
53
|
+
constants.collect { |name| const_get(name) }.select { |object| object.instance_of?(self) }
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get all constant instances. (Sorted by the first defined accessor)
|
28
57
|
def self.all
|
29
|
-
|
58
|
+
unsorted_all.sort
|
30
59
|
end
|
60
|
+
|
61
|
+
# Get attributes
|
31
62
|
def self.pluck(*accessors)
|
32
|
-
map { |record|
|
63
|
+
map { |record| Array(accessors).map { |accessor| record.public_send(accessor) } }.map { |array| array.size == 1 ? array.first : array }
|
33
64
|
end
|
34
65
|
|
35
|
-
#
|
66
|
+
# Automatically these methods are defined in this version. This method is remained only for compatibility.
|
36
67
|
def self.define_question_methods(attr_name = :symbol)
|
37
|
-
|
68
|
+
unsorted_all.each do |object|
|
38
69
|
define_method(object.public_send(attr_name).to_s + '?') { self == object } if object.respond_to?(attr_name)
|
39
70
|
end
|
40
71
|
end
|
41
72
|
|
42
|
-
#
|
73
|
+
# Wrap default attr_accessor method in order to save accessor defined order.
|
43
74
|
def self.attr_accessor(*several_variants)
|
44
75
|
@accessors = *several_variants
|
45
76
|
super
|
46
77
|
end
|
47
78
|
|
48
|
-
#
|
79
|
+
# Get accessors the overrided method saved.
|
49
80
|
def self.accessors
|
50
81
|
readers = instance_methods.reject { |attr| attr.to_s[-1] == '=' }
|
51
82
|
writers = instance_methods.select { |attr| attr.to_s[-1] == '=' }.map { |attr| attr.to_s.chop.to_sym }
|
@@ -53,40 +84,53 @@ module ActiveValue
|
|
53
84
|
Array(@accessors) | accessors.reverse!
|
54
85
|
end
|
55
86
|
|
56
|
-
#
|
57
|
-
|
87
|
+
# Wrapper dup method for can't dup on Fixnum#dup (NilClass etc.) before Ruby 2.4
|
88
|
+
def self.patched_dup(object)
|
89
|
+
object.dup
|
90
|
+
rescue TypeError
|
91
|
+
object
|
92
|
+
end
|
93
|
+
|
94
|
+
# If self instance is passed as an argument, create a new instance that has copied attributes. (it's like copy constructor by shallow copy)
|
95
|
+
# Hash instance is passed, the hash attributes apply a new instance.
|
58
96
|
def initialize(attributes = {})
|
59
97
|
case attributes
|
60
|
-
when self.class then self.class.accessors.
|
98
|
+
when self.class then self.class.accessors.map(&:to_s).each { |attribute| public_send(attribute + '=', attributes.public_send(attribute)) }
|
61
99
|
when Hash then attributes.stringify_keys.each { |key, value| public_send(key + '=', value) if respond_to?(key + '=') }
|
62
100
|
end
|
63
101
|
end
|
64
102
|
|
65
|
-
#
|
66
|
-
|
67
|
-
|
103
|
+
# If objects have symbol attributes, the objects can be checked equivalence by the method named symbol + `?`
|
104
|
+
def method_missing(method, *args, &block)
|
105
|
+
object = self.class.unsorted_all.find { |object| object.respond_to?(:symbol) && method.to_s == object.public_send(:symbol).to_s + '?' }
|
106
|
+
if object.nil?
|
107
|
+
super
|
108
|
+
else
|
109
|
+
self == object
|
110
|
+
end
|
111
|
+
end
|
68
112
|
|
69
|
-
#
|
113
|
+
# Convert to hash with shallow copy. If values include collections(Hash, Array, etc.), search and convert without elements of the collection.
|
70
114
|
def to_shallow_hash
|
71
|
-
self.class.accessors.
|
115
|
+
self.class.accessors.each_with_object({}) { |key, hash| hash[key] = self.class.patched_dup(public_send(key)) }
|
72
116
|
end
|
73
117
|
|
74
|
-
#
|
118
|
+
# Convert to hash with deep copy. If values include collections(Hash, Array, etc.), search and convert into collections recursively.
|
75
119
|
def to_deep_hash
|
76
120
|
scan = ->(value) do
|
77
121
|
case value
|
78
|
-
when Hash
|
79
|
-
when Array
|
80
|
-
when
|
81
|
-
else value
|
122
|
+
when Hash then value.each_with_object({}) { |(k, v), h| h[k] = scan.call(v) }
|
123
|
+
when Array then value.map { |v| scan.call(v) }
|
124
|
+
when Base then scan.call(value.to_shallow_hash)
|
125
|
+
else self.class.patched_dup(value)
|
82
126
|
end
|
83
127
|
end
|
84
|
-
self.class.accessors.
|
128
|
+
self.class.accessors.each_with_object({}) { |key, hash| hash[key] = scan.call(public_send(key)) }
|
85
129
|
end
|
86
130
|
alias_method :to_h, :to_deep_hash
|
87
131
|
|
88
132
|
def to_json
|
89
|
-
to_h
|
133
|
+
JSON.generate(to_h)
|
90
134
|
end
|
91
135
|
|
92
136
|
def inspect
|
@@ -94,11 +138,21 @@ module ActiveValue
|
|
94
138
|
Hash === hash ? '#<' << self.class.name.split('::').last << ' ' << hash.map { |key, value| key.to_s << ': ' << value.inspect }.join(', ') << '>' : hash.inspect
|
95
139
|
end
|
96
140
|
|
97
|
-
#
|
98
|
-
|
141
|
+
# Define the equal operator. `A == B` expression means every attribute has same value. (NOT object_id comparison)
|
142
|
+
def ==(another)
|
143
|
+
self.class.accessors.all? { |attr| public_send(attr) == another.public_send(attr) }
|
144
|
+
end
|
145
|
+
alias_method :eql?, :==
|
146
|
+
|
147
|
+
# Hash method for equivalence comparison with `eql?` method. (Referenced by `Enumerable#uniq` method etc.)
|
148
|
+
def hash
|
149
|
+
to_json.hash
|
150
|
+
end
|
151
|
+
|
152
|
+
# Define the spaceship operator. Compare self with another by the first defined accessor. (In many cases, it's `id` implicitly)
|
99
153
|
def <=>(another)
|
100
154
|
attr = self.class.accessors.first || :object_id
|
101
|
-
public_send(attr) <=> another.public_send(attr)
|
155
|
+
public_send(attr) <=> another.public_send(attr) if respond_to?(attr) && another.respond_to?(attr)
|
102
156
|
end
|
103
157
|
|
104
158
|
end
|
data/lib/active_value/version.rb
CHANGED
metadata
CHANGED
@@ -1,78 +1,81 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_value
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taiki Hiramatsu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.0.0
|
20
20
|
type: :development
|
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:
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '5.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activesupport
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 5.2.4
|
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:
|
69
|
-
description:
|
68
|
+
version: 5.2.4
|
69
|
+
description: In a class inherited this class, constant variables get the behavior
|
70
|
+
like records of ActiveRecord.
|
70
71
|
email:
|
71
|
-
-
|
72
|
+
- info@hiramatsu-sa-office.jp
|
72
73
|
executables: []
|
73
74
|
extensions: []
|
74
75
|
extra_rdoc_files: []
|
75
76
|
files:
|
77
|
+
- ".github/workflows/publish.yml"
|
78
|
+
- ".github/workflows/test.yml"
|
76
79
|
- ".gitignore"
|
77
80
|
- ".travis.yml"
|
78
81
|
- Gemfile
|
@@ -88,8 +91,7 @@ files:
|
|
88
91
|
homepage: https://github.com/hiratai/active_value
|
89
92
|
licenses:
|
90
93
|
- MIT
|
91
|
-
metadata:
|
92
|
-
allowed_push_host: https://rubygems.org
|
94
|
+
metadata: {}
|
93
95
|
post_install_message:
|
94
96
|
rdoc_options: []
|
95
97
|
require_paths:
|
@@ -98,15 +100,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
100
|
requirements:
|
99
101
|
- - ">="
|
100
102
|
- !ruby/object:Gem::Version
|
101
|
-
version: '
|
103
|
+
version: '2.3'
|
102
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
105
|
requirements:
|
104
106
|
- - ">="
|
105
107
|
- !ruby/object:Gem::Version
|
106
108
|
version: '0'
|
107
109
|
requirements: []
|
108
|
-
rubygems_version: 3.
|
110
|
+
rubygems_version: 3.2.3
|
109
111
|
signing_key:
|
110
112
|
specification_version: 4
|
111
|
-
summary:
|
113
|
+
summary: ActiveValue is base class for immutable value object that has interfaces
|
114
|
+
like ActiveRecord.
|
112
115
|
test_files: []
|