attr_pow 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/.semver +5 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +134 -0
- data/LICENSE.txt +20 -0
- data/README.org +164 -0
- data/Rakefile +51 -0
- data/attr_pow.gemspec +99 -0
- data/examples/hooks.rb +28 -0
- data/lib/attr_pow.rb +129 -0
- data/spec/attr_pow_spec.rb +17 -0
- data/spec/spec_helper.rb +14 -0
- metadata +285 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ff24535e335f5339430339f64f857cf53cd84914
|
4
|
+
data.tar.gz: 8b762e6dfa289d233a8277695d27a42513bf29c3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 35a3e923b6cec3e7aa890a5241d88a3a4f807367d13b47aa7896fcee8b434d581bb06aa772405e181e61761b5e6ebbc2c400289db2efe104eaccb8b1526a1e7a
|
7
|
+
data.tar.gz: c65bd7a001a42a33eefbaea5bd46261389ded1fedc2da203df55f0aaca60e0cdc7441a23fbf19bf12dd43ae844a37d6f3e2b5864459b74f58a9ac173853ed75d
|
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.1
|
data/.semver
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gem "semver2", "~> 3"
|
4
|
+
gem "queue_ding", "~> 0"
|
5
|
+
gem "deep_dive", "~> 0"
|
6
|
+
|
7
|
+
group :development do
|
8
|
+
gem "awesome_print", "~> 1"
|
9
|
+
gem "rspec", "~> 3"
|
10
|
+
gem "yard", "~> 0"
|
11
|
+
gem "rdoc", "~> 3"
|
12
|
+
gem "bundler", "~> 1"
|
13
|
+
gem "juwelier", "~> 2"
|
14
|
+
gem "simplecov", ">= 0"
|
15
|
+
gem "pry", "~> 0"
|
16
|
+
gem "pry-byebug", "~> 3"
|
17
|
+
gem "pry-doc", "~> 0"
|
18
|
+
gem "pry-remote", "~> 0"
|
19
|
+
gem "pry-rescue", "~> 1"
|
20
|
+
gem "pry-stack_explorer", "~> 0"
|
21
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.4.0)
|
5
|
+
aquarium (0.5.1)
|
6
|
+
awesome_print (1.7.0)
|
7
|
+
binding_of_caller (0.7.2)
|
8
|
+
debug_inspector (>= 0.0.1)
|
9
|
+
builder (3.2.3)
|
10
|
+
byebug (9.0.6)
|
11
|
+
coderay (1.1.1)
|
12
|
+
debug_inspector (0.0.3)
|
13
|
+
deep_dive (0.3.4)
|
14
|
+
descendants_tracker (0.0.4)
|
15
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
16
|
+
diff-lcs (1.3)
|
17
|
+
docile (1.1.5)
|
18
|
+
faraday (0.9.2)
|
19
|
+
multipart-post (>= 1.2, < 3)
|
20
|
+
git (1.3.0)
|
21
|
+
github_api (0.17.0)
|
22
|
+
addressable (~> 2.4.0)
|
23
|
+
descendants_tracker (~> 0.0.4)
|
24
|
+
faraday (~> 0.8, < 0.10)
|
25
|
+
hashie (>= 3.4)
|
26
|
+
mime-types (>= 1.16, < 3.0)
|
27
|
+
oauth2 (~> 1.0)
|
28
|
+
hashie (3.5.5)
|
29
|
+
highline (1.7.8)
|
30
|
+
interception (0.5)
|
31
|
+
json (1.8.6)
|
32
|
+
juwelier (2.4.1)
|
33
|
+
builder
|
34
|
+
bundler (>= 1.13)
|
35
|
+
git (>= 1.2.5)
|
36
|
+
github_api
|
37
|
+
highline (>= 1.6.15)
|
38
|
+
kamelcase (~> 0)
|
39
|
+
nokogiri (>= 1.5.10)
|
40
|
+
psych (~> 2.2)
|
41
|
+
rake
|
42
|
+
rdoc
|
43
|
+
semver2
|
44
|
+
jwt (1.5.6)
|
45
|
+
kamelcase (0.0.0)
|
46
|
+
semver2 (~> 3)
|
47
|
+
method_source (0.8.2)
|
48
|
+
mime-types (2.99.3)
|
49
|
+
mini_portile2 (2.1.0)
|
50
|
+
multi_json (1.12.1)
|
51
|
+
multi_xml (0.6.0)
|
52
|
+
multipart-post (2.0.0)
|
53
|
+
nokogiri (1.7.2)
|
54
|
+
mini_portile2 (~> 2.1.0)
|
55
|
+
oauth2 (1.3.1)
|
56
|
+
faraday (>= 0.8, < 0.12)
|
57
|
+
jwt (~> 1.0)
|
58
|
+
multi_json (~> 1.3)
|
59
|
+
multi_xml (~> 0.5)
|
60
|
+
rack (>= 1.2, < 3)
|
61
|
+
pry (0.10.4)
|
62
|
+
coderay (~> 1.1.0)
|
63
|
+
method_source (~> 0.8.1)
|
64
|
+
slop (~> 3.4)
|
65
|
+
pry-byebug (3.4.2)
|
66
|
+
byebug (~> 9.0)
|
67
|
+
pry (~> 0.10)
|
68
|
+
pry-doc (0.10.0)
|
69
|
+
pry (~> 0.9)
|
70
|
+
yard (~> 0.9)
|
71
|
+
pry-remote (0.1.8)
|
72
|
+
pry (~> 0.9)
|
73
|
+
slop (~> 3.0)
|
74
|
+
pry-rescue (1.4.5)
|
75
|
+
interception (>= 0.5)
|
76
|
+
pry
|
77
|
+
pry-stack_explorer (0.4.9.2)
|
78
|
+
binding_of_caller (>= 0.7)
|
79
|
+
pry (>= 0.9.11)
|
80
|
+
psych (2.2.4)
|
81
|
+
queue_ding (0.1.3)
|
82
|
+
aquarium (~> 0)
|
83
|
+
semver (~> 1)
|
84
|
+
rack (2.0.2)
|
85
|
+
rake (12.0.0)
|
86
|
+
rdoc (3.12.2)
|
87
|
+
json (~> 1.4)
|
88
|
+
rspec (3.6.0)
|
89
|
+
rspec-core (~> 3.6.0)
|
90
|
+
rspec-expectations (~> 3.6.0)
|
91
|
+
rspec-mocks (~> 3.6.0)
|
92
|
+
rspec-core (3.6.0)
|
93
|
+
rspec-support (~> 3.6.0)
|
94
|
+
rspec-expectations (3.6.0)
|
95
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
96
|
+
rspec-support (~> 3.6.0)
|
97
|
+
rspec-mocks (3.6.0)
|
98
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
99
|
+
rspec-support (~> 3.6.0)
|
100
|
+
rspec-support (3.6.0)
|
101
|
+
semver (1.0.1)
|
102
|
+
semver2 (3.4.2)
|
103
|
+
simplecov (0.14.1)
|
104
|
+
docile (~> 1.1.0)
|
105
|
+
json (>= 1.8, < 3)
|
106
|
+
simplecov-html (~> 0.10.0)
|
107
|
+
simplecov-html (0.10.0)
|
108
|
+
slop (3.6.0)
|
109
|
+
thread_safe (0.3.6)
|
110
|
+
yard (0.9.9)
|
111
|
+
|
112
|
+
PLATFORMS
|
113
|
+
ruby
|
114
|
+
|
115
|
+
DEPENDENCIES
|
116
|
+
awesome_print (~> 1)
|
117
|
+
bundler (~> 1)
|
118
|
+
deep_dive (~> 0)
|
119
|
+
juwelier (~> 2)
|
120
|
+
pry (~> 0)
|
121
|
+
pry-byebug (~> 3)
|
122
|
+
pry-doc (~> 0)
|
123
|
+
pry-remote (~> 0)
|
124
|
+
pry-rescue (~> 1)
|
125
|
+
pry-stack_explorer (~> 0)
|
126
|
+
queue_ding (~> 0)
|
127
|
+
rdoc (~> 3)
|
128
|
+
rspec (~> 3)
|
129
|
+
semver2 (~> 3)
|
130
|
+
simplecov
|
131
|
+
yard (~> 0)
|
132
|
+
|
133
|
+
BUNDLED WITH
|
134
|
+
1.14.6
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2017 Fred Mitchell
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.org
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
* attr_pow - put POWer in your attributes!!! :TOC_5_gh:
|
2
|
+
- [[#synopsis][Synopsis]]
|
3
|
+
- [[#motivation][Motivation]]
|
4
|
+
- [[#usage--documentation][Usage & Documentation]]
|
5
|
+
- [[#hooks][Hooks]]
|
6
|
+
- [[#clonability][Clonability]]
|
7
|
+
- [[#queues][Queues]]
|
8
|
+
- [[#release-notes][Release Notes]]
|
9
|
+
- [[#contributing-to-attr_pow][Contributing to attr_pow]]
|
10
|
+
- [[#copyright][Copyright]]
|
11
|
+
|
12
|
+
** Synopsis
|
13
|
+
attr_pow gives you POWerful attributes. You may sepecify defaults,
|
14
|
+
use attr_pow for hooks, and even define clonability and queuability.
|
15
|
+
Cloability works in concert with deep_dive.
|
16
|
+
Queuability works in concert with queue_ding.
|
17
|
+
|
18
|
+
** Motivation
|
19
|
+
attr_pow is directly derived from the internal attr_neat
|
20
|
+
attribute system we created for RubyNEAT. I've been meaning
|
21
|
+
to extract this as a seperate gem for a long time.
|
22
|
+
|
23
|
+
** Usage & Documentation
|
24
|
+
At its simplest, you may use attr_pow almost the same
|
25
|
+
as you use attr_accessor, with the understanding you only#
|
26
|
+
specify one attribute per line, for example,
|
27
|
+
#+begin_src ruby
|
28
|
+
require 'attr_pow'
|
29
|
+
...
|
30
|
+
class Foobar
|
31
|
+
attr_pow :foo
|
32
|
+
attr_pow :bar
|
33
|
+
...
|
34
|
+
#+end_src
|
35
|
+
|
36
|
+
And now, to eliminate the typical bolierplate code you normally
|
37
|
+
would have to do to initalize your attributes,
|
38
|
+
#+begin_src ruby
|
39
|
+
require 'attr_pow'
|
40
|
+
...
|
41
|
+
class Foobar
|
42
|
+
attr_pow :foo, default: 20
|
43
|
+
attr_pow :bar, default: "Hello World!"
|
44
|
+
...
|
45
|
+
#+end_src
|
46
|
+
|
47
|
+
You made need nothing more than that, but you can go further.
|
48
|
+
|
49
|
+
*** Hooks
|
50
|
+
Defaultable attributes of neat attributes.
|
51
|
+
|
52
|
+
If hooks: true is given, two hook functions are created:
|
53
|
+
- <sym>_add()
|
54
|
+
add a hook
|
55
|
+
- <sym>_set()
|
56
|
+
set a hook, overwriting all other hooks set or added.
|
57
|
+
- <sym>_clear -- clear all hooks
|
58
|
+
- <sym>_none? -- return true if no hooks are defined.
|
59
|
+
- <sym>_one? -- return true if exactly one hook is defined.
|
60
|
+
- <sym>_hook() -- for passing unnamed parameters to a singular hook.
|
61
|
+
- <sym>_np_hook() -- for passing unnamed parameters to a singular hook.
|
62
|
+
- <sym>_hook_itself() -- for getting the proc reference to the hook.
|
63
|
+
- <sym>_hooks() -- for passing unnamed parameters.
|
64
|
+
- <sym>_np_hooks() -- for passing a named parameter list.
|
65
|
+
|
66
|
+
For *_hook(), the function returns the single result.
|
67
|
+
|
68
|
+
For *_hooks(), the hook function return an array of results
|
69
|
+
from all the actual registered hooks called.
|
70
|
+
|
71
|
+
Example:
|
72
|
+
#+begin_src ruby
|
73
|
+
require 'attr_pow'
|
74
|
+
require 'pp'
|
75
|
+
|
76
|
+
class Foobar
|
77
|
+
attr_pow :hooker, hooks: true
|
78
|
+
|
79
|
+
def johns &block
|
80
|
+
hooker_add &block
|
81
|
+
end
|
82
|
+
|
83
|
+
def deliver_service stype
|
84
|
+
results = hooker_hooks(stype)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
fb = Foobar.new
|
89
|
+
fb.johns do |stype|
|
90
|
+
puts "Bob: #{stype} received"
|
91
|
+
"bob_#{stype}"
|
92
|
+
end
|
93
|
+
|
94
|
+
fb.johns do |stype|
|
95
|
+
puts "James: #{stype} received"
|
96
|
+
"james_#{stype}"
|
97
|
+
end
|
98
|
+
|
99
|
+
pp fb.deliver_service :back_rub
|
100
|
+
pp fb.deliver_service :kiss
|
101
|
+
#+end_src
|
102
|
+
|
103
|
+
Find and run this example in [[./examples/hooks.rb][hooks.rb]]
|
104
|
+
|
105
|
+
*** Clonability
|
106
|
+
Please see the documentation at [[https://github.com/flajann2/deep_dive][Deep Dive]]. Basically,
|
107
|
+
to mark your attributes as cloneable or not:
|
108
|
+
#+begin_src ruby
|
109
|
+
require 'attr_pow'
|
110
|
+
...
|
111
|
+
class Foobar
|
112
|
+
attr_pow :foo, default: 20, cloneable: true
|
113
|
+
attr_pow :bar, default: "Hello World!", cloneable: false
|
114
|
+
...
|
115
|
+
#+end_src
|
116
|
+
|
117
|
+
And so, in using Deep Dive to clone your objects, you can mark
|
118
|
+
so attributes to be cloned, were a copy will be made, or not to be,
|
119
|
+
where a reference to that object will be done instead.
|
120
|
+
|
121
|
+
Where this is useful is in the case of a complicated object
|
122
|
+
composition where some of the objects may represent external
|
123
|
+
resources you would not want to clone, such as file handles
|
124
|
+
and database objects. Or even references to "god" objects.
|
125
|
+
|
126
|
+
"god" objects are considered a bad practice, but sometimes
|
127
|
+
the need does arise. Or you may have inherited legacy code.
|
128
|
+
in either case,
|
129
|
+
|
130
|
+
*** Queues
|
131
|
+
If you mark your attribute with queue: true, a QDing queue
|
132
|
+
will automatically be created. Please see [[https://github.com/flajann2/queue_ding][QueueDing]] for more
|
133
|
+
details.
|
134
|
+
|
135
|
+
Example:
|
136
|
+
#+begin_src ruby
|
137
|
+
require 'attr_pow'
|
138
|
+
...
|
139
|
+
class Foobar
|
140
|
+
attr_pow :queit, queue: true
|
141
|
+
...
|
142
|
+
#+end_src
|
143
|
+
|
144
|
+
** Release Notes
|
145
|
+
| Version | Date | Description |
|
146
|
+
|---------+------------+-------------------------------------------|
|
147
|
+
| 0.0.1 | 2017-05-13 | Initial Release, extraction from RubyNEAT |
|
148
|
+
|
149
|
+
** Contributing to attr_pow
|
150
|
+
I am always open to your input. Please raise issues on this project
|
151
|
+
on GitHub. If you wish to add power to attr_pow:
|
152
|
+
|
153
|
+
- Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
154
|
+
- Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
155
|
+
- Fork the project.
|
156
|
+
- Start a feature/bugfix branch.
|
157
|
+
- Commit and push until you are happy with your contribution.
|
158
|
+
- Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
159
|
+
- Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
160
|
+
|
161
|
+
** Copyright
|
162
|
+
|
163
|
+
Copyright (c) 2017 Fred Mitchell. See LICENSE.txt for
|
164
|
+
further details.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'semver'
|
15
|
+
|
16
|
+
def s_version
|
17
|
+
SemVer.find.format "%M.%m.%p%s"
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'juwelier'
|
21
|
+
|
22
|
+
Juwelier::Tasks.new do |gem|
|
23
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
24
|
+
gem.name = "attr_pow"
|
25
|
+
gem.homepage = "http://github.com/flajann2/attr_pow"
|
26
|
+
gem.license = "MIT"
|
27
|
+
gem.summary = %Q{smart attributes -- defaults, hooks, cloneability, queues! POW!!!}
|
28
|
+
gem.description = %Q{attr_pow gives you smart attributes. You may sepecify defaults,
|
29
|
+
use attr_pow for hooks, and even define clonability and queuability.}
|
30
|
+
gem.email = "fred.mitchell@gmx.de"
|
31
|
+
gem.authors = ["Fred Mitchell"]
|
32
|
+
gem.version = s_version
|
33
|
+
end
|
34
|
+
|
35
|
+
Juwelier::RubygemsDotOrgTasks.new
|
36
|
+
require 'rspec/core'
|
37
|
+
require 'rspec/core/rake_task'
|
38
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
39
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Code coverage detail"
|
43
|
+
task :simplecov do
|
44
|
+
ENV['COVERAGE'] = "true"
|
45
|
+
Rake::Task['spec'].execute
|
46
|
+
end
|
47
|
+
|
48
|
+
task :default => :spec
|
49
|
+
|
50
|
+
require 'yard'
|
51
|
+
YARD::Rake::YardocTask.new
|
data/attr_pow.gemspec
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# Generated by juwelier
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: attr_pow 0.0.1 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "attr_pow".freeze
|
9
|
+
s.version = "0.0.1"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Fred Mitchell".freeze]
|
14
|
+
s.date = "2017-05-13"
|
15
|
+
s.description = "attr_pow gives you smart attributes. You may sepecify defaults,\n use attr_pow for hooks, and even define clonability and queuability.".freeze
|
16
|
+
s.email = "fred.mitchell@gmx.de".freeze
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.org"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".rspec",
|
24
|
+
".ruby-version",
|
25
|
+
".semver",
|
26
|
+
"Gemfile",
|
27
|
+
"Gemfile.lock",
|
28
|
+
"LICENSE.txt",
|
29
|
+
"README.org",
|
30
|
+
"Rakefile",
|
31
|
+
"attr_pow.gemspec",
|
32
|
+
"examples/hooks.rb",
|
33
|
+
"lib/attr_pow.rb",
|
34
|
+
"spec/attr_pow_spec.rb",
|
35
|
+
"spec/spec_helper.rb"
|
36
|
+
]
|
37
|
+
s.homepage = "http://github.com/flajann2/attr_pow".freeze
|
38
|
+
s.licenses = ["MIT".freeze]
|
39
|
+
s.rubygems_version = "2.6.11".freeze
|
40
|
+
s.summary = "smart attributes -- defaults, hooks, cloneability, queues! POW!!!".freeze
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
s.specification_version = 4
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<semver2>.freeze, ["~> 3"])
|
47
|
+
s.add_runtime_dependency(%q<queue_ding>.freeze, ["~> 0"])
|
48
|
+
s.add_runtime_dependency(%q<deep_dive>.freeze, ["~> 0"])
|
49
|
+
s.add_development_dependency(%q<awesome_print>.freeze, ["~> 1"])
|
50
|
+
s.add_development_dependency(%q<rspec>.freeze, ["~> 3"])
|
51
|
+
s.add_development_dependency(%q<yard>.freeze, ["~> 0"])
|
52
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3"])
|
53
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 1"])
|
54
|
+
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2"])
|
55
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<pry>.freeze, ["~> 0"])
|
57
|
+
s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3"])
|
58
|
+
s.add_development_dependency(%q<pry-doc>.freeze, ["~> 0"])
|
59
|
+
s.add_development_dependency(%q<pry-remote>.freeze, ["~> 0"])
|
60
|
+
s.add_development_dependency(%q<pry-rescue>.freeze, ["~> 1"])
|
61
|
+
s.add_development_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
|
62
|
+
else
|
63
|
+
s.add_dependency(%q<semver2>.freeze, ["~> 3"])
|
64
|
+
s.add_dependency(%q<queue_ding>.freeze, ["~> 0"])
|
65
|
+
s.add_dependency(%q<deep_dive>.freeze, ["~> 0"])
|
66
|
+
s.add_dependency(%q<awesome_print>.freeze, ["~> 1"])
|
67
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3"])
|
68
|
+
s.add_dependency(%q<yard>.freeze, ["~> 0"])
|
69
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 3"])
|
70
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1"])
|
71
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2"])
|
72
|
+
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
73
|
+
s.add_dependency(%q<pry>.freeze, ["~> 0"])
|
74
|
+
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3"])
|
75
|
+
s.add_dependency(%q<pry-doc>.freeze, ["~> 0"])
|
76
|
+
s.add_dependency(%q<pry-remote>.freeze, ["~> 0"])
|
77
|
+
s.add_dependency(%q<pry-rescue>.freeze, ["~> 1"])
|
78
|
+
s.add_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
|
79
|
+
end
|
80
|
+
else
|
81
|
+
s.add_dependency(%q<semver2>.freeze, ["~> 3"])
|
82
|
+
s.add_dependency(%q<queue_ding>.freeze, ["~> 0"])
|
83
|
+
s.add_dependency(%q<deep_dive>.freeze, ["~> 0"])
|
84
|
+
s.add_dependency(%q<awesome_print>.freeze, ["~> 1"])
|
85
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3"])
|
86
|
+
s.add_dependency(%q<yard>.freeze, ["~> 0"])
|
87
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 3"])
|
88
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1"])
|
89
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2"])
|
90
|
+
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
91
|
+
s.add_dependency(%q<pry>.freeze, ["~> 0"])
|
92
|
+
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3"])
|
93
|
+
s.add_dependency(%q<pry-doc>.freeze, ["~> 0"])
|
94
|
+
s.add_dependency(%q<pry-remote>.freeze, ["~> 0"])
|
95
|
+
s.add_dependency(%q<pry-rescue>.freeze, ["~> 1"])
|
96
|
+
s.add_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
data/examples/hooks.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'attr_pow'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
class Foobar
|
5
|
+
attr_pow :hooker, hooks: true
|
6
|
+
|
7
|
+
def johns &block
|
8
|
+
hooker_add &block
|
9
|
+
end
|
10
|
+
|
11
|
+
def deliver_service stype
|
12
|
+
results = hooker_hooks(stype)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
fb = Foobar.new
|
17
|
+
fb.johns do |stype|
|
18
|
+
puts "Bob: #{stype} received"
|
19
|
+
"bob_#{stype}"
|
20
|
+
end
|
21
|
+
|
22
|
+
fb.johns do |stype|
|
23
|
+
puts "James: #{stype} received"
|
24
|
+
"james_#{stype}"
|
25
|
+
end
|
26
|
+
|
27
|
+
pp fb.deliver_service :back_rub
|
28
|
+
pp fb.deliver_service :kiss
|
data/lib/attr_pow.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class AttrPowException < Exception ; end
|
4
|
+
class Module
|
5
|
+
# Defaultable attributes of neat attributes.
|
6
|
+
#
|
7
|
+
# If hooks: true is given, two hook functions are
|
8
|
+
# created:
|
9
|
+
## <sym>_add() -- add a hook
|
10
|
+
## <sym>_set() -- set a hook, overwriting all other hooks set or added.
|
11
|
+
## <sym>_clear -- clear all hooks
|
12
|
+
## <sym>_none? -- return true if no hooks are defined.
|
13
|
+
## <sym>_one? -- return true if exactly one hook is defined.
|
14
|
+
## <sym>_hook() -- for passing unnamed parameters to a singular hook.
|
15
|
+
## <sym>_np_hook() -- for passing unnamed parameters to a singular hook.
|
16
|
+
## <sym>_hook_itself() -- for getting the proc reference to the hook.
|
17
|
+
## <sym>_hooks() -- for passing unnamed parameters.
|
18
|
+
## <sym>_np_hooks() -- for passing a named parameter list.
|
19
|
+
#
|
20
|
+
# For *_hook(), the function returns the single result.
|
21
|
+
# For *_hooks(), the hook function return an array of results
|
22
|
+
# from all the actual registered hooks called.
|
23
|
+
def attr_pow (sym,
|
24
|
+
default: nil,
|
25
|
+
cloneable: nil,
|
26
|
+
hooks: false,
|
27
|
+
queue: false)
|
28
|
+
svar = "@#{sym}"
|
29
|
+
|
30
|
+
# Guess what clonable should be.
|
31
|
+
# This is meant to cover "90%" of the cases.
|
32
|
+
cloneable = case
|
33
|
+
when default.nil?
|
34
|
+
false
|
35
|
+
when default.kind_of?(Numeric)
|
36
|
+
false
|
37
|
+
else
|
38
|
+
true
|
39
|
+
end if cloneable.nil?
|
40
|
+
|
41
|
+
# Sanity checks
|
42
|
+
raise AttrPowException("Both hooks and queue cannot both be set for #{sym}.") if hooks and queue
|
43
|
+
raise AttrPowException("Defaults cannot be defined for hooks and queues for #{sym}.") if (hooks or queue) and not default.nil?
|
44
|
+
|
45
|
+
if hooks
|
46
|
+
default = []
|
47
|
+
cloneable = true
|
48
|
+
hook_setup sym
|
49
|
+
end
|
50
|
+
|
51
|
+
if queue
|
52
|
+
default = QDing.new
|
53
|
+
cloneable = true
|
54
|
+
queue_setup sym
|
55
|
+
end
|
56
|
+
|
57
|
+
define_method("#{sym}=") do |v|
|
58
|
+
instance_variable_set(svar, v)
|
59
|
+
end unless hooks or queue
|
60
|
+
|
61
|
+
# TODO: Enhance this getter method for performance.
|
62
|
+
define_method(sym) do
|
63
|
+
instance_variable_set(svar,
|
64
|
+
instance_variable_get(svar) ||
|
65
|
+
((cloneable) ? default.clone
|
66
|
+
: default))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def hook_setup(sym)
|
72
|
+
define_method("#{sym}_add") do |&hook|
|
73
|
+
send(sym) << hook
|
74
|
+
end
|
75
|
+
|
76
|
+
define_method("#{sym}_set") do |&hook|
|
77
|
+
send(sym).clear
|
78
|
+
send(sym) << hook
|
79
|
+
end
|
80
|
+
|
81
|
+
define_method("#{sym}_clear") do
|
82
|
+
send(sym).clear
|
83
|
+
end
|
84
|
+
|
85
|
+
define_method("#{sym}_none?") do
|
86
|
+
send(sym).empty?
|
87
|
+
end
|
88
|
+
|
89
|
+
define_method("#{sym}_one?") do
|
90
|
+
send(sym).size == 1
|
91
|
+
end
|
92
|
+
|
93
|
+
# hooks with named parameters
|
94
|
+
define_method("#{sym}_np_hooks") do | **hparams |
|
95
|
+
send(sym).map{|funct| funct.(**hparams)}
|
96
|
+
end
|
97
|
+
|
98
|
+
# hooks with traditional parameters
|
99
|
+
define_method("#{sym}_hooks") do |*params|
|
100
|
+
send(sym).map{|funct| funct.(*params)}
|
101
|
+
end
|
102
|
+
|
103
|
+
# TODO: DRY up the following functions, which does size checking in exactly the same way.
|
104
|
+
# Single hook with named parameters
|
105
|
+
define_method("#{sym}_np_hook") do | **hparams |
|
106
|
+
sz = send(sym).size
|
107
|
+
raise AttrPowException.new("#{sym}_np_hook must have exactly one hook (#{sz})") unless sz == 1
|
108
|
+
send(sym).map{|funct| funct.(**hparams)}.first
|
109
|
+
end
|
110
|
+
|
111
|
+
# Single hook with traditional parameters
|
112
|
+
define_method("#{sym}_hook") do |*params|
|
113
|
+
sz = send(sym).size
|
114
|
+
raise AttrPowException.new("#{sym}_hook must have exactly one hook (#{sz})") unless sz == 1
|
115
|
+
send(sym).map{|funct| funct.(*params)}.first
|
116
|
+
end
|
117
|
+
|
118
|
+
# Get the singular hook function
|
119
|
+
define_method("#{sym}_hook_itself") do
|
120
|
+
sz = send(sym).size
|
121
|
+
raise AttrPowException.new("#{sym}_hook_itself must have exactly one hook (#{sz})") unless sz == 1
|
122
|
+
send(sym).first
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def queue_setup(sym)
|
127
|
+
# Add boilerplate code for queues here.
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require 'awesome_print'
|
3
|
+
require 'attr_pow'
|
4
|
+
|
5
|
+
describe Module do
|
6
|
+
attr_pow :foo, default: 20
|
7
|
+
attr_pow :bar, default: 'stringy affair'
|
8
|
+
attr_pow :hook_func, hooks: true
|
9
|
+
|
10
|
+
it "default & basic functionality" do
|
11
|
+
expect(foo).to eq(20)
|
12
|
+
expect(bar).to eq('stringy affair')
|
13
|
+
end
|
14
|
+
|
15
|
+
it "hooks"
|
16
|
+
it "queues"
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.expect_with :rspec do |expectations|
|
3
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
4
|
+
end
|
5
|
+
|
6
|
+
config.mock_with :rspec do |mocks|
|
7
|
+
mocks.verify_partial_doubles = true
|
8
|
+
end
|
9
|
+
|
10
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
11
|
+
config.profile_examples = 10
|
12
|
+
config.order = :random
|
13
|
+
Kernel.srand config.seed
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,285 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: attr_pow
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fred Mitchell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: semver2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: queue_ding
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: deep_dive
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: awesome_print
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1'
|
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'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rdoc
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: bundler
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: juwelier
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pry
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: pry-byebug
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '3'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: pry-doc
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: pry-remote
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: pry-rescue
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '1'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '1'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: pry-stack_explorer
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - "~>"
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
237
|
+
description: |-
|
238
|
+
attr_pow gives you smart attributes. You may sepecify defaults,
|
239
|
+
use attr_pow for hooks, and even define clonability and queuability.
|
240
|
+
email: fred.mitchell@gmx.de
|
241
|
+
executables: []
|
242
|
+
extensions: []
|
243
|
+
extra_rdoc_files:
|
244
|
+
- LICENSE.txt
|
245
|
+
- README.org
|
246
|
+
files:
|
247
|
+
- ".document"
|
248
|
+
- ".rspec"
|
249
|
+
- ".ruby-version"
|
250
|
+
- ".semver"
|
251
|
+
- Gemfile
|
252
|
+
- Gemfile.lock
|
253
|
+
- LICENSE.txt
|
254
|
+
- README.org
|
255
|
+
- Rakefile
|
256
|
+
- attr_pow.gemspec
|
257
|
+
- examples/hooks.rb
|
258
|
+
- lib/attr_pow.rb
|
259
|
+
- spec/attr_pow_spec.rb
|
260
|
+
- spec/spec_helper.rb
|
261
|
+
homepage: http://github.com/flajann2/attr_pow
|
262
|
+
licenses:
|
263
|
+
- MIT
|
264
|
+
metadata: {}
|
265
|
+
post_install_message:
|
266
|
+
rdoc_options: []
|
267
|
+
require_paths:
|
268
|
+
- lib
|
269
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
270
|
+
requirements:
|
271
|
+
- - ">="
|
272
|
+
- !ruby/object:Gem::Version
|
273
|
+
version: '0'
|
274
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
279
|
+
requirements: []
|
280
|
+
rubyforge_project:
|
281
|
+
rubygems_version: 2.6.11
|
282
|
+
signing_key:
|
283
|
+
specification_version: 4
|
284
|
+
summary: smart attributes -- defaults, hooks, cloneability, queues! POW!!!
|
285
|
+
test_files: []
|