dry-struct-setters 0.1.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 +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.travis.yml +13 -0
- data/Gemfile +2 -0
- data/README.md +97 -0
- data/Rakefile +6 -0
- data/bin/console +11 -0
- data/bin/rspec +4 -0
- data/bin/setup +8 -0
- data/dry-struct-setters.gemspec +30 -0
- data/lib/dry/struct/setters.rb +44 -0
- data/lib/dry/struct/setters/mass_assignment.rb +15 -0
- data/lib/dry/struct/setters/version.rb +9 -0
- data/lib/dry/struct/with_setters.rb +12 -0
- metadata +129 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 8dc0293695e70153ec3cc1146c0cc0955e6d9f94
|
|
4
|
+
data.tar.gz: 99ee5bca887c5804c12ddd0a13866b6106967346
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 68d5b060ac2c4e100f38839f991d0c070c4245051653d94f6aeb4c4f8186e23a15ba41fbd0bce35ee805220d403512c2a231b52bdebf01914f5ada26b33b68cf
|
|
7
|
+
data.tar.gz: b73fd70f8d6c0a1a0dc14d55cfee89624a06c7c4092a77dd9040ec7227ef48a78ab086b95a61933820a4ef19c7d784b19cd774d2c90a8d064b2454704c1ded58
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Dry::Struct::Setters
|
|
2
|
+
|
|
3
|
+
[](http://badge.fury.io/rb/dry-struct-setters) [](https://travis-ci.org/tbuehlmann/dry-struct-setters)
|
|
4
|
+
|
|
5
|
+
Dry::Struct::Setters is an extension to the [Dry::Struct](https://github.com/dry-rb/dry-struct) library. Subclasses of Dry::Struct only define getter methods for its attributes by design (or preference). This library extends subclasses so they also provide setter methods.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
By including the Dry::Struct::Setters module into your Dry::Struct subclass every defined attribute will get a corresponding setter method:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
module Types
|
|
13
|
+
include Dry::Types.module
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class Project < Dry::Struct
|
|
17
|
+
include Dry::Struct::Setters
|
|
18
|
+
|
|
19
|
+
attribute :name, Types::String
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
project = Project.new(name: 'some-project')
|
|
23
|
+
project.name = 'some-project-new'
|
|
24
|
+
|
|
25
|
+
project.name # => 'some-project-new'
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Mass Assignment
|
|
29
|
+
|
|
30
|
+
Including the Dry::Struct::Setters module into you Dry::Struct subclass will only define setter methods, mass assigning attributes won't work with this. If you want to be able to mass assign attributes, just include the Dry::Struct::Setters::MassAssignment module, which will provide an assign_attributes method:
|
|
31
|
+
|
|
32
|
+
```ruby
|
|
33
|
+
module Types
|
|
34
|
+
include Dry::Types.module
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class Project < Dry::Struct
|
|
38
|
+
include Dry::Struct::Setters
|
|
39
|
+
include Dry::Struct::Setters::MassAssignment
|
|
40
|
+
|
|
41
|
+
attribute :name, Types::String
|
|
42
|
+
attribute :description, Types::String
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
project = Project.new(name: 'some-project', description: 'some-description')
|
|
46
|
+
|
|
47
|
+
project.assign_attributes(name: 'some-project-new', description: 'some-description-new')
|
|
48
|
+
|
|
49
|
+
project.name # => 'some-project-new'
|
|
50
|
+
project.description # => 'some-description-new'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Convenience Class
|
|
54
|
+
|
|
55
|
+
Instead of including modules you can also just use the Dry::Struct::WithSetters class which inherits from Dry::Struct and includes both modules. Note that you'll need to explicitly require it:
|
|
56
|
+
|
|
57
|
+
```ruby
|
|
58
|
+
require 'dry/struct/with_setters'
|
|
59
|
+
|
|
60
|
+
module Types
|
|
61
|
+
include Dry::Types.module
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class Project < Dry::Struct::WithSetters
|
|
65
|
+
attribute :name, Types::String
|
|
66
|
+
end
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Hint: You can also require directly via your Gemfile:
|
|
70
|
+
|
|
71
|
+
```ruby
|
|
72
|
+
gem 'dry-struct-setters', require: 'dry/struct/with_setters'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
Add this line to your application's Gemfile:
|
|
78
|
+
|
|
79
|
+
```ruby
|
|
80
|
+
gem 'dry-struct-setters'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
And then execute:
|
|
84
|
+
|
|
85
|
+
$ bundle
|
|
86
|
+
|
|
87
|
+
Or install it yourself as:
|
|
88
|
+
|
|
89
|
+
$ gem install dry-struct-setters
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
94
|
+
|
|
95
|
+
## Contributing
|
|
96
|
+
|
|
97
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/tbuehlmann/dry-struct-setters.
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/rspec
ADDED
data/bin/setup
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative 'lib/dry/struct/setters/version'
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |spec|
|
|
4
|
+
spec.name = 'dry-struct-setters'
|
|
5
|
+
spec.version = Dry::Struct::Setters::VERSION
|
|
6
|
+
spec.authors = ['Tobias Bühlmann']
|
|
7
|
+
spec.email = ['tobias@xn--bhlmann-n2a.de']
|
|
8
|
+
spec.licenses = ['MIT']
|
|
9
|
+
|
|
10
|
+
spec.summary = 'Setter methods for Dry::Struct subclasses'
|
|
11
|
+
spec.description = 'This gem adds the ability to add setter methods to otherwise setter-method-less Dry::Struct subclasses.'
|
|
12
|
+
spec.homepage = 'https://github.com/tbuehlmann/dry-struct-setters'
|
|
13
|
+
|
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
15
|
+
f.match(%r{^(test|spec|features)/})
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
spec.bindir = 'exe'
|
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
20
|
+
spec.require_paths = ['lib']
|
|
21
|
+
|
|
22
|
+
spec.required_ruby_version = '>= 2.1'
|
|
23
|
+
|
|
24
|
+
spec.add_runtime_dependency 'dry-struct', '>= 0.3.0'
|
|
25
|
+
|
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
|
27
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
|
28
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.6'
|
|
30
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'dry/struct'
|
|
4
|
+
|
|
5
|
+
require 'dry/struct/setters/mass_assignment'
|
|
6
|
+
require 'dry/struct/setters/version'
|
|
7
|
+
|
|
8
|
+
module Dry
|
|
9
|
+
class Struct
|
|
10
|
+
module Setters
|
|
11
|
+
def self.included(struct)
|
|
12
|
+
struct.extend(ClassMethods)
|
|
13
|
+
|
|
14
|
+
struct.schema.each do |attribute, type|
|
|
15
|
+
Dry::Struct::Setters.define_setter_for(struct: struct, attribute: attribute, type: type)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module ClassMethods
|
|
20
|
+
def attributes(new_schema)
|
|
21
|
+
super.tap do
|
|
22
|
+
new_schema.each do |attribute, type|
|
|
23
|
+
Dry::Struct::Setters.define_setter_for(struct: self, attribute: attribute, type: type)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.define_setter_for(struct:, attribute:, type:)
|
|
30
|
+
setter = "#{attribute}=".to_sym
|
|
31
|
+
|
|
32
|
+
struct.class_eval do
|
|
33
|
+
unless instance_methods.include?(setter)
|
|
34
|
+
define_method(setter) do |value|
|
|
35
|
+
instance_variable_set("@#{attribute}", type.call(value))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
setter
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dry
|
|
4
|
+
class Struct
|
|
5
|
+
module Setters
|
|
6
|
+
module MassAssignment
|
|
7
|
+
def assign_attributes(attributes = {})
|
|
8
|
+
attributes.each do |attribute, value|
|
|
9
|
+
public_send("#{attribute}=", value)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dry-struct-setters
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Tobias Bühlmann
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2017-06-17 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: dry-struct
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 0.3.0
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 0.3.0
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: bundler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.15'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.15'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: pry
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.10'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.10'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rake
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '12.0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '12.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '3.6'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '3.6'
|
|
83
|
+
description: This gem adds the ability to add setter methods to otherwise setter-method-less
|
|
84
|
+
Dry::Struct subclasses.
|
|
85
|
+
email:
|
|
86
|
+
- tobias@xn--bhlmann-n2a.de
|
|
87
|
+
executables: []
|
|
88
|
+
extensions: []
|
|
89
|
+
extra_rdoc_files: []
|
|
90
|
+
files:
|
|
91
|
+
- ".gitignore"
|
|
92
|
+
- ".rspec"
|
|
93
|
+
- ".travis.yml"
|
|
94
|
+
- Gemfile
|
|
95
|
+
- README.md
|
|
96
|
+
- Rakefile
|
|
97
|
+
- bin/console
|
|
98
|
+
- bin/rspec
|
|
99
|
+
- bin/setup
|
|
100
|
+
- dry-struct-setters.gemspec
|
|
101
|
+
- lib/dry/struct/setters.rb
|
|
102
|
+
- lib/dry/struct/setters/mass_assignment.rb
|
|
103
|
+
- lib/dry/struct/setters/version.rb
|
|
104
|
+
- lib/dry/struct/with_setters.rb
|
|
105
|
+
homepage: https://github.com/tbuehlmann/dry-struct-setters
|
|
106
|
+
licenses:
|
|
107
|
+
- MIT
|
|
108
|
+
metadata: {}
|
|
109
|
+
post_install_message:
|
|
110
|
+
rdoc_options: []
|
|
111
|
+
require_paths:
|
|
112
|
+
- lib
|
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '2.1'
|
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - ">="
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '0'
|
|
123
|
+
requirements: []
|
|
124
|
+
rubyforge_project:
|
|
125
|
+
rubygems_version: 2.6.11
|
|
126
|
+
signing_key:
|
|
127
|
+
specification_version: 4
|
|
128
|
+
summary: Setter methods for Dry::Struct subclasses
|
|
129
|
+
test_files: []
|