value_semantics 3.0.0 → 3.3.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 +4 -4
- data/CHANGELOG.md +27 -0
- data/README.md +37 -7
- data/lib/value_semantics.rb +36 -4
- data/lib/value_semantics/version.rb +1 -1
- metadata +19 -22
- data/.gitignore +0 -12
- data/.rspec +0 -2
- data/.travis.yml +0 -24
- data/Gemfile +0 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/bin/test +0 -19
- data/value_semantics.gemspec +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9917cde0bb66e10e931d39308a1d968973e10f5de4b60b15898cb3d390f77fb9
|
4
|
+
data.tar.gz: b9ab7670cc254252d357a8276c1fb98305e9c3e60634354883e078179bad7b03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40c1a0ef2a51f2e18465013660a71ca3dbd50fd615dd1e0e7dd4e6e0a65ba3fc5f742132b62467178dad75f5e14452d8ebc38742fa8928254baad8709e89dfd6
|
7
|
+
data.tar.gz: 9d1eebc8605d6aed14be4eb0fec9fb78f7eca69894e3ee3d79c34a8c41763542b4a8ffc8fd57eba2848735b0732286d8cacbb46a64d509c5fe89a519c06afbe3
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
Notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
## [3.3.0] - 2020-07-17
|
9
|
+
### Added
|
10
|
+
- Added support for pattern matching in Ruby 2.7
|
11
|
+
|
12
|
+
## [3.2.1] - 2020-07-11
|
13
|
+
### Fixed
|
14
|
+
- Fix warnings new to Ruby 2.7 about keyword arguments
|
15
|
+
|
16
|
+
## [3.2.0] - 2019-09-30
|
17
|
+
### Added
|
18
|
+
- `ValueSemantics::Struct`, a convenience for creating a new class and mixing
|
19
|
+
in ValueSemantics in a single step.
|
20
|
+
|
21
|
+
## [3.1.0] - 2019-06-30
|
22
|
+
### Added
|
23
|
+
- Built-in PP support for value classes
|
24
|
+
|
25
|
+
## [3.0.0] - 2019-01-27
|
26
|
+
|
27
|
+
First public release
|
data/README.md
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
[](https://badge.fury.io/rb/value_semantics)
|
2
2
|
[](https://travis-ci.org/tomdalling/value_semantics)
|
3
|
-

|
4
4
|
|
5
5
|
ValueSemantics
|
6
6
|
==============
|
7
7
|
|
8
|
-
|
8
|
+
A gem for making value classes.
|
9
9
|
|
10
|
-
Generates modules that provide value semantics for a given set of attributes.
|
11
|
-
|
12
|
-
|
10
|
+
Generates modules that provide [conventional value semantics](https://github.com/zverok/good-value-object) for a given set of attributes.
|
11
|
+
The behaviour is similar to an immutable `Struct` class,
|
12
|
+
plus extensible, lightweight validation and coercion.
|
13
13
|
|
14
14
|
These are intended for internal use, as opposed to validating user input like ActiveRecord.
|
15
|
-
Invalid or missing attributes cause an exception
|
16
|
-
not an error message intended for
|
15
|
+
Invalid or missing attributes cause an exception for developers,
|
16
|
+
not an error message intended for application users.
|
17
|
+
|
18
|
+
See the [announcement blog post][] for some of the rationale behind the gem, and some [discussion on Reddit].
|
19
|
+
|
20
|
+
[announcement blog post]: https://www.rubypigeon.com/posts/value-semantics-gem-for-making-value-classes/
|
21
|
+
[discussion on Reddit]: https://www.reddit.com/r/ruby/comments/akz4fs/valuesemanticsa_gem_for_making_value_classes/
|
17
22
|
|
18
23
|
|
19
24
|
Defining and Creating Value Objects
|
@@ -96,6 +101,15 @@ other_tom = Person.new(name: 'Tom', age: 31)
|
|
96
101
|
tom == other_tom #=> true
|
97
102
|
tom.eql?(other_tom) #=> true
|
98
103
|
tom.hash == other_tom.hash #=> true
|
104
|
+
|
105
|
+
|
106
|
+
#
|
107
|
+
# Ruby 2.7+ pattern matching
|
108
|
+
#
|
109
|
+
case tom
|
110
|
+
in { name: "Tom", age: }
|
111
|
+
puts age # outputs: 31
|
112
|
+
end
|
99
113
|
```
|
100
114
|
|
101
115
|
|
@@ -299,6 +313,21 @@ For example, the default value could be a string,
|
|
299
313
|
which would then be coerced into an `IPAddr` object.
|
300
314
|
|
301
315
|
|
316
|
+
## ValueSemantics::Struct
|
317
|
+
|
318
|
+
This is a convenience for making a new class and including ValueSemantics in
|
319
|
+
one step, similar to how `Struct` works from the Ruby standard library. For
|
320
|
+
example:
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
Cat = ValueSemantics::Struct.new do
|
324
|
+
name String, default: "Mittens"
|
325
|
+
end
|
326
|
+
|
327
|
+
Cat.new.name #=> "Mittens"
|
328
|
+
```
|
329
|
+
|
330
|
+
|
302
331
|
## Installation
|
303
332
|
|
304
333
|
Add this line to your application's Gemfile:
|
@@ -321,6 +350,7 @@ Or install it yourself as:
|
|
321
350
|
Bug reports and pull requests are welcome on GitHub at:
|
322
351
|
https://github.com/tomdalling/value_semantics
|
323
352
|
|
353
|
+
Keep in mind that this gem aims to be as close to 100% backwards compatible as possible.
|
324
354
|
|
325
355
|
## License
|
326
356
|
|
data/lib/value_semantics.rb
CHANGED
@@ -139,6 +139,20 @@ module ValueSemantics
|
|
139
139
|
|
140
140
|
"#<#{self.class} #{attrs}>"
|
141
141
|
end
|
142
|
+
|
143
|
+
def pretty_print(pp)
|
144
|
+
pp.object_group(self) do
|
145
|
+
to_h.each do |attr, value|
|
146
|
+
pp.breakable
|
147
|
+
pp.text("#{attr}=")
|
148
|
+
pp.pp(value)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def deconstruct_keys(_)
|
154
|
+
to_h
|
155
|
+
end
|
142
156
|
end
|
143
157
|
|
144
158
|
#
|
@@ -284,13 +298,13 @@ module ValueSemantics
|
|
284
298
|
ArrayOf.new(element_validator)
|
285
299
|
end
|
286
300
|
|
287
|
-
def def_attr(*args)
|
288
|
-
__attributes << Attribute.define(*args)
|
301
|
+
def def_attr(*args, **kwargs)
|
302
|
+
__attributes << Attribute.define(*args, **kwargs)
|
289
303
|
end
|
290
304
|
|
291
|
-
def method_missing(name, *args)
|
305
|
+
def method_missing(name, *args, **kwargs)
|
292
306
|
if respond_to_missing?(name)
|
293
|
-
def_attr(name, *args)
|
307
|
+
def_attr(name, *args, **kwargs)
|
294
308
|
else
|
295
309
|
super
|
296
310
|
end
|
@@ -356,4 +370,22 @@ module ValueSemantics
|
|
356
370
|
end
|
357
371
|
end
|
358
372
|
|
373
|
+
#
|
374
|
+
# ValueSemantics equivalent of the Struct class from the Ruby standard
|
375
|
+
# library
|
376
|
+
#
|
377
|
+
class Struct
|
378
|
+
#
|
379
|
+
# Creates a new Class with ValueSemantics mixed in
|
380
|
+
#
|
381
|
+
# @yield a block containing ValueSemantics DSL
|
382
|
+
# @return [Class] the newly created class
|
383
|
+
#
|
384
|
+
def self.new(&block)
|
385
|
+
klass = Class.new
|
386
|
+
klass.include(ValueSemantics.for_attributes(&block))
|
387
|
+
klass
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
359
391
|
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: value_semantics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Dalling
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-17 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
19
|
version: '1.15'
|
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
26
|
version: '1.15'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.7
|
33
|
+
version: '3.7'
|
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
|
-
version: 3.7
|
40
|
+
version: '3.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mutant-rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,32 +94,28 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
description: "\n
|
98
|
-
|
99
|
-
|
100
|
-
validation and coercion.\n "
|
97
|
+
description: "\n Generates modules that provide conventional value semantics for
|
98
|
+
a given set of attributes.\n The behaviour is similar to an immutable `Struct`
|
99
|
+
class,\n plus extensible, lightweight validation and coercion.\n "
|
101
100
|
email:
|
102
101
|
- tom@tomdalling.com
|
103
102
|
executables: []
|
104
103
|
extensions: []
|
105
104
|
extra_rdoc_files: []
|
106
105
|
files:
|
107
|
-
-
|
108
|
-
- ".rspec"
|
109
|
-
- ".travis.yml"
|
110
|
-
- Gemfile
|
106
|
+
- CHANGELOG.md
|
111
107
|
- LICENSE.txt
|
112
108
|
- README.md
|
113
|
-
- bin/console
|
114
|
-
- bin/setup
|
115
|
-
- bin/test
|
116
109
|
- lib/value_semantics.rb
|
117
110
|
- lib/value_semantics/version.rb
|
118
|
-
- value_semantics.gemspec
|
119
111
|
homepage: https://github.com/tomdalling/value_semantics
|
120
112
|
licenses:
|
121
113
|
- MIT
|
122
|
-
metadata:
|
114
|
+
metadata:
|
115
|
+
bug_tracker_uri: https://github.com/tomdalling/value_semantics/issues
|
116
|
+
changelog_uri: https://github.com/tomdalling/value_semantics/blob/master/CHANGELOG.md
|
117
|
+
documentation_uri: https://github.com/tomdalling/value_semantics/blob/v3.3.0/README.md
|
118
|
+
source_code_uri: https://github.com/tomdalling/value_semantics
|
123
119
|
post_install_message:
|
124
120
|
rdoc_options: []
|
125
121
|
require_paths:
|
@@ -135,8 +131,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
131
|
- !ruby/object:Gem::Version
|
136
132
|
version: '0'
|
137
133
|
requirements: []
|
138
|
-
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.7.7
|
139
136
|
signing_key:
|
140
137
|
specification_version: 4
|
141
|
-
summary:
|
138
|
+
summary: Makes value classes, with lightweight validation and coercion.
|
142
139
|
test_files: []
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.travis.yml
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
script: bin/test
|
3
|
-
|
4
|
-
# test old Ruby versions WITHOUT mutation testing
|
5
|
-
rvm:
|
6
|
-
- 2.3.8
|
7
|
-
- 2.4.5
|
8
|
-
- 2.5.3
|
9
|
-
env: MUTATION_TEST=false
|
10
|
-
|
11
|
-
# test the latest Ruby version WITH mutation testing
|
12
|
-
matrix:
|
13
|
-
include:
|
14
|
-
- rvm: 2.6.0
|
15
|
-
env: MUTATION_TEST=true
|
16
|
-
|
17
|
-
# deploy gem on tagged commits, on the latest Ruby version only
|
18
|
-
deploy:
|
19
|
-
provider: rubygems
|
20
|
-
on:
|
21
|
-
tags: true
|
22
|
-
env: MUTATION_TEST=true
|
23
|
-
api_key:
|
24
|
-
secure: nL74QuUczEpA0qbhSBN2zjGdviWgKB3wR6vFvwervv1MZNWmwOQUYe99Oq9kPeyc8/x2MR/H6PQm5qbrk/WAfRede01WxlZ/EBUW+9CYGrxcBsGONx9IULO8A0I8/yN/YJHW2vjo3dfR66EwVsXTVWq8U63PRRcwJIyTqnIiUm2sxauMQoPRBbXG+pD9v/EJSn3ugpdtxp0lVYDn8LDKk5Ho4/wbpY4ML11XUJa9mz9CyR/GsAzdy5FTXaDMOwuWOVEx9cab7m4qPOBhmlJY4TrmooFpxTxRwChcvByjq1IboEd2M3RT5on7Q/xDTlHSOuT0OS8mnS2AocGT4a1gC+W/xOlghgEcN+xs2V5mfucR6+iUYlCy32uz1w3ey7T2X5xN4ubut09r1xLi7eu1NisAoAc+GOJ4TIxQNqkeRhY4X/fs8j7SMfOEMDr6pPxSLKZxgSvExt+IbdcZD/uQ7rTBQkadYCbc9MX5dHazBievmar3ZsFffbIf+n13FVDXsaPgRt7DlFM5dqGrEwVwt1jFRhdFuDCjkj4QWOLn7E1uY3XqgrqGvgUBlF8Znwc6qicW8zxV4SIWhqIzCOH6L9WIZGLHNq0remoCd9sq9Ter9av3jL+6UmZRRAr+JceeZfZmsYIXKomECzleM9FXMx7FXlpjJKOlf3JnrfeCTwI=
|
data/Gemfile
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "value_semantics"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/bin/test
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
set -ue
|
3
|
-
|
4
|
-
MUTANT_PATTERN=${1:-ValueSemantics*}
|
5
|
-
|
6
|
-
# if $MUTATION_TEST is false, just run RSpec
|
7
|
-
if [[ "${MUTATION_TEST:-true}" == "false" ]] ; then
|
8
|
-
bundle exec rspec
|
9
|
-
else
|
10
|
-
bundle exec mutant \
|
11
|
-
--include lib \
|
12
|
-
--require value_semantics \
|
13
|
-
--use rspec "$MUTANT_PATTERN" \
|
14
|
-
# Mutant 0.8.24 introduces new mutations that cause infinite recursion inside
|
15
|
-
# #method_missing. These --ignore-subject lines prevent that from happening
|
16
|
-
#--ignore-subject "ValueSemantics::DSL#method_missing" \
|
17
|
-
#--ignore-subject "ValueSemantics::DSL#respond_to_missing?" \
|
18
|
-
#--ignore-subject "ValueSemantics::DSL#def_attr" \
|
19
|
-
fi
|
data/value_semantics.gemspec
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require "value_semantics/version"
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "value_semantics"
|
8
|
-
spec.version = ValueSemantics::VERSION
|
9
|
-
spec.authors = ["Tom Dalling"]
|
10
|
-
spec.email = [["tom", "@", "tomdalling.com"].join]
|
11
|
-
|
12
|
-
spec.summary = %q{Create value classes quickly, with all the proper conventions.}
|
13
|
-
spec.description = %q{
|
14
|
-
Create value classes quickly, with all the proper conventions.
|
15
|
-
|
16
|
-
Generates modules that provide value semantics for a given set of attributes.
|
17
|
-
Provides the behaviour of an immutable struct-like value class,
|
18
|
-
with light-weight validation and coercion.
|
19
|
-
}
|
20
|
-
spec.homepage = "https://github.com/tomdalling/value_semantics"
|
21
|
-
spec.license = "MIT"
|
22
|
-
|
23
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
24
|
-
f.match(%r{^(test|spec|features)/})
|
25
|
-
end
|
26
|
-
spec.bindir = "exe"
|
27
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = ["lib"]
|
29
|
-
|
30
|
-
spec.add_development_dependency "bundler", "~> 1.15"
|
31
|
-
spec.add_development_dependency "rspec", "~> 3.7.0"
|
32
|
-
spec.add_development_dependency "mutant-rspec"
|
33
|
-
spec.add_development_dependency "yard"
|
34
|
-
spec.add_development_dependency "byebug"
|
35
|
-
spec.add_development_dependency "gem-release"
|
36
|
-
end
|