portrayal 0.1.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d9235eae25e3e88f554e43a68d163d24e7213bfb8830b256ffd6a12968ca7e2
4
- data.tar.gz: 930a8eeaa04ce976cf1b387abf9b3c6775af9abf90b7b59ec8ff74af68fe7ff2
3
+ metadata.gz: 8a6532caf62048d8a54a3dccfca29166c8277b47c19765d9ce8ee02b97ee709c
4
+ data.tar.gz: d58115282488d0c4dc22bacf65e8ea83e98986653b29798d6cade1d705e04fba
5
5
  SHA512:
6
- metadata.gz: e5ef351e415ba810039a9f4cb2a77f29dd088a8bd98322123fc3f534d16004faf2c9fbefd51fe8799949c91045fd3494c7dccf64c0e90f4b9cf617fb1e9e2f90
7
- data.tar.gz: 36583d990b87b84d5fc8b2f7f149f047a7f1c2b1e11c9b651a91ca240266a9af11c3c36331d9eaebd9a4f2acbd0800f77a478d729275d62b585c09cd3211eca7
6
+ metadata.gz: c177e83e03d1d80e6bcfa1970c3786a9e496f5d1e09df05d7758772be244d1c056c28971c4c4b1de6c040c8ea839b34c4e69b2cdf38bdc2bd1269133640bad1b
7
+ data.tar.gz: d664544c2fa4b822c8d677efe546ae13521daed0e700fd20ec72255a13595014213934154abe5ef70f7a94dce8ef5a886493c430ba41791b1a9c38b57bdae2f4
@@ -0,0 +1,24 @@
1
+ name: RSpec
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby: [ '2.4', '2.5', '2.6', '2.7' ]
15
+
16
+ name: Ruby ${{ matrix.ruby }}
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - run: gem install bundler
23
+ - run: bundle install
24
+ - run: bundle exec rake
@@ -0,0 +1,35 @@
1
+ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.6.0 - 2020-08-10
6
+
7
+ * Return keyword name from `keyword`, allowing usage such as `private keyword :foo`. [[commit]](https://github.com/scottscheapflights/portrayal/commit/9e9db2cafc7eae14789c5b84f70efd18898ace76)
8
+
9
+ ## 0.5.0 - 2020-05-28
10
+
11
+ * Add option `define` for overriding nested class name. [[commit]](https://github.com/scottscheapflights/portrayal/commit/665ad297fb71fcdf5f641c672a457ccbe29e4a49)
12
+
13
+ ## 0.4.0 - 2020-05-16
14
+
15
+ * Portrayal schema is deep-duped to subclasses. [[commit]](https://github.com/scottscheapflights/portrayal/commit/f346483a379ce9fbdece72cde8b0844f2d22b1cd)
16
+
17
+ ## 0.3.1 - 2020-05-11
18
+
19
+ * Fix the issue introduced in 0.3.0 where `==` and `eql?` were always treating rhs as another portrayal class. [[commit]](https://github.com/scottscheapflights/portrayal/commit/f6ec8f373c6582f7e8d8f872d289222e4a58f8f6)
20
+
21
+ ## 0.3.0 - 2020-05-09 (yanked)
22
+
23
+ * No longer compare classes in `==`, use `eql?` for that. [[commit]](https://github.com/scottscheapflights/portrayal/commit/9c5a37e4fb91e35d23b22e208344452930452af7)
24
+ * Define a protected writer for every keyword - useful when applying changes after `dup`/`clone`. [[commit]](https://github.com/scottscheapflights/portrayal/commit/1c0fa6c6357a09760dae39165e864238d231a08e)
25
+ * Add definition of `#hash` to fix hash equality. Now `hash[object]` will match if `object` is of the same class with the same keywords and values. [[commit]](https://github.com/scottscheapflights/portrayal/commit/ba9e390ab4aea4733ba084ac273da448e313ea53)
26
+ * Make `#freeze` propagate to all keyword values. [[commit]](https://github.com/scottscheapflights/portrayal/commit/0a734411a6eac08e2355c4277e09a2a70800d032)
27
+ * Make `#dup` and `#clone` propagate to all keyword values. [[commit]](https://github.com/scottscheapflights/portrayal/commit/010632d87d81a8d5b5ea5ff27d3d209cc667b0a5)
28
+
29
+ ## 0.2.0 - 2019-07-03
30
+
31
+ * It's now possible to specify non-lambda default values, like `default: "foo"`. There is now also a distinction between a proc and a lambda default. Procs are `call`-ed, while lambdas or any other types are returned as-is. In the majority of cases defaults are static values, and there is no need for the performance overhead of making all defaults into anonymous functions. [[commit]](https://github.com/scottscheapflights/portrayal/commit/a1cc9d0fd40e413210f61b945d37b81c87280fee)
32
+
33
+ ## 0.1.0
34
+
35
+ First version.
@@ -1,41 +1,41 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- portrayal (0.1.0)
4
+ portrayal (0.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  coderay (1.1.2)
10
10
  diff-lcs (1.3)
11
- method_source (0.9.2)
12
- pry (0.12.2)
13
- coderay (~> 1.1.0)
14
- method_source (~> 0.9.0)
15
- rake (10.5.0)
16
- rspec (3.8.0)
17
- rspec-core (~> 3.8.0)
18
- rspec-expectations (~> 3.8.0)
19
- rspec-mocks (~> 3.8.0)
20
- rspec-core (3.8.0)
21
- rspec-support (~> 3.8.0)
22
- rspec-expectations (3.8.3)
11
+ method_source (1.0.0)
12
+ pry (0.13.1)
13
+ coderay (~> 1.1)
14
+ method_source (~> 1.0)
15
+ rake (13.0.1)
16
+ rspec (3.9.0)
17
+ rspec-core (~> 3.9.0)
18
+ rspec-expectations (~> 3.9.0)
19
+ rspec-mocks (~> 3.9.0)
20
+ rspec-core (3.9.2)
21
+ rspec-support (~> 3.9.3)
22
+ rspec-expectations (3.9.2)
23
23
  diff-lcs (>= 1.2.0, < 2.0)
24
- rspec-support (~> 3.8.0)
25
- rspec-mocks (3.8.0)
24
+ rspec-support (~> 3.9.0)
25
+ rspec-mocks (3.9.1)
26
26
  diff-lcs (>= 1.2.0, < 2.0)
27
- rspec-support (~> 3.8.0)
28
- rspec-support (3.8.0)
27
+ rspec-support (~> 3.9.0)
28
+ rspec-support (3.9.3)
29
29
 
30
30
  PLATFORMS
31
31
  ruby
32
32
 
33
33
  DEPENDENCIES
34
- bundler (~> 2.0)
34
+ bundler (~> 2.1)
35
35
  portrayal!
36
- pry (~> 0.12)
37
- rake (~> 10.0)
38
- rspec (~> 3.0)
36
+ pry (~> 0.13)
37
+ rake (~> 13.0)
38
+ rspec (~> 3.9)
39
39
 
40
40
  BUNDLED WITH
41
- 2.0.1
41
+ 2.1.4
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ ![RSpec](https://github.com/scottscheapflights/portrayal/workflows/RSpec/badge.svg?branch=master)
2
+
1
3
  # Portrayal
2
4
 
3
5
  Inspired by:
@@ -14,7 +16,7 @@ class Person < MySuperClass
14
16
 
15
17
  keyword :name
16
18
  keyword :age, optional: true
17
- keyword :favorite_fruit, default: -> { 'feijoa' }
19
+ keyword :favorite_fruit, default: 'feijoa'
18
20
 
19
21
  keyword :address do
20
22
  keyword :street
@@ -30,8 +32,12 @@ end
30
32
  When you call `keyword`:
31
33
 
32
34
  * It defines an `attr_reader`
35
+ * It defines a protected `attr_writer`
33
36
  * It defines `initialize`
34
37
  * It defines `==` and `eql?`
38
+ * It defines `#hash` for hash equality
39
+ * It defines `#dup` and `#clone` that propagate to all keyword values
40
+ * It defines `#freeze` that propagates to all keyword values
35
41
  * It creates a nested class when you supply a block
36
42
  * It inherits parent's superclass when creating a nested class
37
43
 
@@ -39,25 +45,56 @@ The code above produces almost exactly the following ruby. There's a lot of boil
39
45
 
40
46
  ```ruby
41
47
  class Person < MySuperClass
42
- attr_reader :name, :age, :favorite_fruit, :address
48
+ attr_accessor :name, :age, :favorite_fruit, :address
49
+ protected :name=, :age=, :favorite_fruit=, :address=
43
50
 
44
- def initialize(name:, age: nil, favorite_fruit: -> { 'feijoa' }.call, address:)
51
+ def initialize(name:, age: nil, favorite_fruit: 'feijoa', address:)
45
52
  @name = name
46
53
  @age = age
47
54
  @favorite_fruit = favorite_fruit
48
55
  @address = address
49
56
  end
50
57
 
58
+ def eql?(other)
59
+ self.class == other.class && self == other
60
+ end
61
+
51
62
  def ==(other)
52
- self.class == other.class &&
53
- { name: name, age: age, favorite_fruit: favorite_fruit, address: address } ==
63
+ { name: name, age: age, favorite_fruit: favorite_fruit, address: address } ==
54
64
  { name: other.name, age: other.age, favorite_fruit: other.favorite_fruit, address: other.address }
55
65
  end
56
66
 
57
- alias eql? ==
67
+ def hash
68
+ [ self.class, { name: name, age: age, favorite_fruit: favorite_fruit, address: address } ].hash
69
+ end
70
+
71
+ def freeze
72
+ name.freeze
73
+ age.freeze
74
+ favorite_fruit.freeze
75
+ address.freeze
76
+ super
77
+ end
78
+
79
+ def initialize_dup(source)
80
+ @name = source.name.dup
81
+ @age = source.age.dup
82
+ @favorite_fruit = source.favorite_fruit.dup
83
+ @address = source.address.dup
84
+ super
85
+ end
86
+
87
+ def initialize_clone(source)
88
+ @name = source.name.clone
89
+ @age = source.age.clone
90
+ @favorite_fruit = source.favorite_fruit.clone
91
+ @address = source.address.clone
92
+ super
93
+ end
58
94
 
59
95
  class Address < MySuperClass
60
- attr_reader :street, :city
96
+ attr_accessor :street, :city
97
+ protected :street=, :city=
61
98
 
62
99
  def initialize(street:, city:)
63
100
  @street = street
@@ -68,12 +105,35 @@ class Person < MySuperClass
68
105
  "#{street}, #{city}"
69
106
  end
70
107
 
108
+ def eql?(other)
109
+ self.class == other.class && self == other
110
+ end
111
+
71
112
  def ==(other)
72
- self.class == other.class &&
73
- { street: street, city: city } == { street: other.street, city: other.city }
113
+ { street: street, city: city } == { street: other.street, city: other.city }
74
114
  end
75
115
 
76
- alias eql? ==
116
+ def hash
117
+ [ self.class, { street: street, city: city } ].hash
118
+ end
119
+
120
+ def freeze
121
+ street.freeze
122
+ city.freeze
123
+ super
124
+ end
125
+
126
+ def initialize_dup(source)
127
+ @street = source.street.dup
128
+ @city = source.city.dup
129
+ super
130
+ end
131
+
132
+ def initialize_clone(source)
133
+ @street = source.street.clone
134
+ @city = source.city.clone
135
+ super
136
+ end
77
137
  end
78
138
  end
79
139
  ```
@@ -123,6 +183,51 @@ Possible use cases for these objects include, but are not limited to:
123
183
  - Objects serializable for 3rd party APIs
124
184
  - Objects serializable for React components
125
185
 
186
+ ### Defaults
187
+
188
+ When specifying default, there's a difference between procs and lambda.
189
+
190
+ ```ruby
191
+ keyword :foo, default: proc { 2 + 2 } # => Will call this proc and return 4
192
+ keyword :foo, default: -> { 2 + 2 } # => Will return this lambda itself
193
+ ```
194
+
195
+ Any other value works as normal.
196
+
197
+ ```ruby
198
+ keyword :foo, default: 4
199
+ ```
200
+
201
+ ### Nested Classes
202
+
203
+ When you pass a block to a keyword, it creates a nested class named after camelized keyword name.
204
+
205
+ ```ruby
206
+ class Person
207
+ extend Portrayal
208
+
209
+ keyword :address do
210
+ keyword :street
211
+ end
212
+ end
213
+ ```
214
+
215
+ The above block created class `Person::Address`.
216
+
217
+ If you want to change the name of the created class, use the option `define`.
218
+
219
+ ```ruby
220
+ class Person
221
+ extend Portrayal
222
+
223
+ keyword :visited_countries, define: 'Country' do
224
+ keyword :name
225
+ end
226
+ end
227
+ ```
228
+
229
+ This defines `Person::Country`, while the accessor remains `visited_countries`.
230
+
126
231
  ### Schema
127
232
 
128
233
  Every class that has at least one keyword defined in it automatically receives a class method called `portrayal`. This method is a schema of your object with some additional helpers.
@@ -149,7 +254,7 @@ Address.portrayal.attributes(address) # => {street: '34th st', city: 'NYC', post
149
254
  Get everything portrayal knows about your keywords in one hash.
150
255
 
151
256
  ```ruby
152
- Address.portrayal.schema # => {:street=>{:optional=>false, :default=>nil}, :city=>{:optional=>false, :default=>nil}, :postcode=>{:optional=>false, :default=>nil}, :country=>{:optional=>true, :default=>#<Proc>}}
257
+ Address.portrayal.schema # => {:street=>{:optional=>false, :default=>nil}, :city=>{:optional=>false, :default=>nil}, :postcode=>{:optional=>false, :default=>nil}, :country=>{:optional=>true, :default=>[:return, nil]}}
153
258
  ```
154
259
 
155
260
  ## Philosophy
@@ -2,26 +2,32 @@ require 'portrayal/version'
2
2
  require 'portrayal/schema'
3
3
 
4
4
  module Portrayal
5
- def keyword(name, optional: Schema::NULL, default: Schema::NULL, &block)
5
+ NULL = :_portrayal_value_not_set
6
+
7
+ def keyword(name, optional: NULL, default: NULL, define: nil, &block)
6
8
  unless respond_to?(:portrayal)
7
- class << self; attr_reader :portrayal end
9
+ class << self
10
+ attr_reader :portrayal
11
+ def inherited(base)
12
+ base.instance_variable_set('@portrayal', portrayal.dup)
13
+ end
14
+ end
15
+
8
16
  @portrayal = Schema.new
17
+ class_eval(portrayal.definition_of_object_enhancements)
9
18
  end
10
19
 
11
- attr_reader name
20
+ attr_accessor name
21
+ protected "#{name}="
12
22
 
13
23
  portrayal.add_keyword(name, optional, default)
14
24
  class_eval(portrayal.definition_of_initialize)
15
25
 
16
- unless portrayal.equality_defined?
17
- class_eval(portrayal.definition_of_equality)
18
- portrayal.mark_equality_defined
19
- end
20
-
21
26
  if block_given?
22
- keyword_class = Class.new(superclass) { extend Portrayal }
23
- keyword_class.class_eval(&block)
24
- const_set(portrayal.camelcase(name), keyword_class)
27
+ kw_class = Class.new(superclass) { extend Portrayal }
28
+ const_set(define || portrayal.camelize(name), kw_class).class_eval(&block)
25
29
  end
30
+
31
+ name
26
32
  end
27
33
  end
@@ -1,90 +1,88 @@
1
1
  module Portrayal
2
2
  class Schema
3
- NULL = :_portrayal_value_not_set
4
-
5
3
  attr_reader :schema
6
4
 
7
- def initialize
8
- @schema = {}
9
- @equality_defined = false
10
- end
11
-
12
- def [](name)
13
- @schema[name]
14
- end
15
-
16
- def keywords
17
- @schema.keys
18
- end
5
+ def initialize; @schema = {} end
6
+ def keywords; @schema.keys end
7
+ def [](name); @schema[name] end
19
8
 
20
9
  def attributes(object)
21
- Hash[
22
- object.class.portrayal.keywords.map { |key| [key, object.send(key)] }
23
- ]
10
+ Hash[object.class.portrayal.keywords.map { |k| [k, object.send(k)] }]
24
11
  end
25
12
 
13
+ def camelize(string); string.to_s.gsub(/(?:^|_+)([^_])/) { $1.upcase } end
14
+
26
15
  def add_keyword(name, optional, default)
27
16
  optional, default =
28
- if optional == NULL && default == NULL
29
- [false, nil]
30
- elsif optional != NULL && default == NULL
31
- [optional, optional ? -> { nil } : nil]
32
- elsif optional == NULL && default != NULL
33
- [true, default]
34
- else
35
- [optional, optional ? default : nil]
17
+ case [optional == NULL, default == NULL]
18
+ when [true, true]; [false, nil]
19
+ when [false, true]; [optional, optional ? [:return, nil] : nil]
20
+ when [true, false]; [true, [default_strategy(default), default]]
21
+ else; [optional, optional ? [default_strategy(default), default] : nil]
36
22
  end
37
23
 
38
24
  @schema[name.to_sym] = { optional: optional, default: default }
39
25
  end
40
26
 
41
- def camelcase(string)
42
- string.to_s.gsub(/(?:^|_+)([^_])/) { $1.upcase }
27
+ def get_default(name)
28
+ action, value = @schema[name][:default]
29
+ action == :call ? value.call : value
30
+ end
31
+
32
+ def default_strategy(value)
33
+ (value.is_a?(Proc) && !value.lambda?) ? :call : :return
43
34
  end
44
35
 
45
- def call_default(name)
46
- @schema[name][:default].call
36
+ def initialize_dup(other)
37
+ super
38
+ @schema =
39
+ other.schema.map { |k, v|
40
+ default = v[:default] ? v[:default].map(&:dup) : v[:default]
41
+ [k, { optional: v[:optional], default: default }]
42
+ }.to_h
47
43
  end
48
44
 
49
45
  def definition_of_initialize
50
- init_args =
51
- @schema
52
- .map { |name, config|
53
- if config[:optional]
54
- "#{name}: self.class.portrayal.call_default(:#{name})"
55
- else
56
- "#{name}:"
57
- end
58
- }
59
- .join(',')
60
-
61
- init_assignments =
62
- @schema
63
- .keys
64
- .map { |name| "@#{name} = #{name}" }
65
- .join('; ')
66
-
67
- "def initialize(#{init_args}); #{init_assignments} end"
46
+ init_args = @schema.map { |name, config|
47
+ config[:optional] ?
48
+ "#{name}: self.class.portrayal.get_default(:#{name})" : "#{name}:"
49
+ }.join(',')
50
+
51
+ init_assigns = @schema.keys.map { |name| "@#{name} = #{name}" }.join('; ')
52
+ "def initialize(#{init_args}); #{init_assigns} end"
68
53
  end
69
54
 
70
- def definition_of_equality
55
+ def definition_of_object_enhancements
71
56
  <<-RUBY
57
+ def eql?(other); self.class == other.class && self == other end
58
+ def hash; [self.class, self.class.portrayal.attributes(self)].hash end
59
+
72
60
  def ==(other)
73
- self.class == other.class &&
74
- self.class.portrayal.attributes(self) ==
61
+ return super unless other.class.is_a?(Portrayal)
62
+
63
+ self.class.portrayal.attributes(self) ==
75
64
  self.class.portrayal.attributes(other)
76
65
  end
77
66
 
78
- alias eql? ==
79
- RUBY
80
- end
67
+ def freeze
68
+ self.class.portrayal.attributes(self).values.each(&:freeze)
69
+ super
70
+ end
81
71
 
82
- def equality_defined?
83
- @equality_defined
84
- end
72
+ def initialize_dup(source)
73
+ self.class.portrayal.attributes(source).each do |key, value|
74
+ instance_variable_set('@' + key.to_s, value.dup)
75
+ end
76
+ super
77
+ end
85
78
 
86
- def mark_equality_defined
87
- @equality_defined = true
79
+ def initialize_clone(source)
80
+ self.class.portrayal.attributes(source).each do |key, value|
81
+ instance_variable_set('@' + key.to_s, value.clone)
82
+ end
83
+ super
84
+ end
85
+ RUBY
88
86
  end
89
87
  end
90
88
  end
@@ -1,3 +1,3 @@
1
1
  module Portrayal
2
- VERSION = "0.1.0"
2
+ VERSION = '0.6.0'
3
3
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ['madfancier@gmail.com']
10
10
 
11
11
  spec.summary = 'A minimal builder for struct-like classes'
12
- spec.description = 'Inspired by dry-initializer and virtus, portrayal is a minimalist gem (~120 loc, no dependencies) that takes a somewhat different approach to building struct-like classes. It steps away from types, coersion, and writer methods in favor of encouraging well-designed constructors. Read more in the Philosophy section of the README.'
12
+ spec.description = 'Inspired by dry-initializer and virtus, portrayal is a minimalist gem that takes a somewhat different approach to building struct-like classes. It steps away from types, coersion, and writer methods in favor of encouraging well-designed constructors. Read more in the Philosophy section of the README.'
13
13
  spec.homepage = 'https://github.com/scottscheapflights/portrayal'
14
14
  spec.license = 'Apache-2.0'
15
15
 
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  end
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 2.0'
22
- spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'rspec', '~> 3.0'
24
- spec.add_development_dependency 'pry', '~> 0.12'
21
+ spec.add_development_dependency 'bundler', '~> 2.1'
22
+ spec.add_development_dependency 'rake', '~> 13.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.9'
24
+ spec.add_development_dependency 'pry', '~> 0.13'
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: portrayal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxim Chernyak
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-08 00:00:00.000000000 Z
11
+ date: 2020-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.1'
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: '2.0'
26
+ version: '2.1'
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
- version: '10.0'
33
+ version: '13.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
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '3.9'
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
- version: '3.0'
54
+ version: '3.9'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.12'
61
+ version: '0.13'
62
62
  type: :development
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: '0.12'
68
+ version: '0.13'
69
69
  description: Inspired by dry-initializer and virtus, portrayal is a minimalist gem
70
- (~120 loc, no dependencies) that takes a somewhat different approach to building
71
- struct-like classes. It steps away from types, coersion, and writer methods in favor
72
- of encouraging well-designed constructors. Read more in the Philosophy section of
73
- the README.
70
+ that takes a somewhat different approach to building struct-like classes. It steps
71
+ away from types, coersion, and writer methods in favor of encouraging well-designed
72
+ constructors. Read more in the Philosophy section of the README.
74
73
  email:
75
74
  - madfancier@gmail.com
76
75
  executables: []
77
76
  extensions: []
78
77
  extra_rdoc_files: []
79
78
  files:
79
+ - ".github/workflows/rspec.yml"
80
80
  - ".gitignore"
81
81
  - ".rspec"
82
- - ".travis.yml"
82
+ - CHANGELOG.md
83
83
  - CODE_OF_CONDUCT.md
84
84
  - Gemfile
85
85
  - Gemfile.lock
@@ -96,7 +96,7 @@ homepage: https://github.com/scottscheapflights/portrayal
96
96
  licenses:
97
97
  - Apache-2.0
98
98
  metadata: {}
99
- post_install_message:
99
+ post_install_message:
100
100
  rdoc_options: []
101
101
  require_paths:
102
102
  - lib
@@ -111,8 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
113
  requirements: []
114
- rubygems_version: 3.0.3
115
- signing_key:
114
+ rubygems_version: 3.1.2
115
+ signing_key:
116
116
  specification_version: 4
117
117
  summary: A minimal builder for struct-like classes
118
118
  test_files: []
@@ -1,10 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.3
7
- - 2.4
8
- - 2.5
9
- - 2.6
10
- before_install: gem install bundler -v 2.0.1