attire 2.0.1 → 3.0.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/README.md +29 -22
- data/lib/attire.rb +32 -2
- metadata +3 -19
- data/lib/attire/initializer.rb +0 -51
- data/lib/attire/method_object.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e182d55a0029623e5a05e47f92701bbe3fd55e2
|
4
|
+
data.tar.gz: 2d209d7daf659e2bef9e5f7da389641ab0d7c99f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fa120c1f70fedb9a5a3f93173444bd054269ba6eaa9d9881b5e89b24b39aad1d33abdc25c6c1940138e8d4562a003c87fd4531c5313a9cbbe50bfbded357cf0
|
7
|
+
data.tar.gz: 8b0e10d88064358730c4ff416e5f9f90b56b6fd01a951389651ccb6e205e47528e78b6bf227226d34fec0e0dfe286138384901c4df3e799c0e8ce03a2134a5f2
|
data/README.md
CHANGED
@@ -3,43 +3,50 @@
|
|
3
3
|
[](https://travis-ci.org/mushishi78/attire)
|
4
4
|
[](http://badge.fury.io/rb/attire)
|
5
5
|
|
6
|
-
|
6
|
+
Helper to remove some boiler plate in defining classes.
|
7
7
|
|
8
|
-
|
8
|
+
## Usage
|
9
9
|
|
10
|
-
|
10
|
+
The `attire` method defines an `initialize` method where all it's parameters are stored as instance variables that can be retrieve with private getters. So a class defined like this:
|
11
11
|
|
12
|
-
|
12
|
+
```ruby
|
13
|
+
class Measurement
|
14
|
+
def initialize(value:, units: :grams)
|
15
|
+
@value = value
|
16
|
+
@units = units
|
17
|
+
end
|
13
18
|
|
14
|
-
|
15
|
-
|
19
|
+
def to_s
|
20
|
+
"#{value} (#{units})"
|
21
|
+
end
|
16
22
|
|
17
|
-
|
18
|
-
extend Attire::Initializer
|
23
|
+
private
|
19
24
|
|
20
|
-
|
21
|
-
|
22
|
-
|
25
|
+
attr_reader :value, :units
|
26
|
+
end
|
27
|
+
```
|
23
28
|
|
24
|
-
|
25
|
-
|
29
|
+
Can be shortened to:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
require 'attire'
|
33
|
+
|
34
|
+
class Measurement
|
35
|
+
attire 'value:, units: :grams'
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"#{value} (#{units})"
|
26
39
|
end
|
27
40
|
end
|
28
|
-
|
29
|
-
my_instance = MyClass.new(foo: 50)
|
30
|
-
my_instance.result # 98
|
31
41
|
```
|
32
42
|
|
33
|
-
|
43
|
+
### Method Objects
|
34
44
|
|
35
|
-
|
45
|
+
Sometimes it's useful for objects that are designed to do only a single task to have a class method that both initializes the object and executes the task. For this purpose, `attire` allows you to set the `verb` keyword like so:
|
36
46
|
|
37
47
|
``` ruby
|
38
48
|
class CheeseSpreader
|
39
|
-
|
40
|
-
|
41
|
-
def initialize(cheese, cracker: Jacobs.new)
|
42
|
-
end
|
49
|
+
attire 'cheese, cracker: Jacobs.new', verb: :spread
|
43
50
|
|
44
51
|
def spread
|
45
52
|
cracker.spreads << cheese
|
data/lib/attire.rb
CHANGED
@@ -1,2 +1,32 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Attire
|
2
|
+
def attire(param_str, method: :initialize, verb: nil, &after)
|
3
|
+
names = eval("->(#{param_str}){}").parameters.map(&:last)
|
4
|
+
def_init(param_str, method, names)
|
5
|
+
add_getters(names)
|
6
|
+
define_method(:__after) { instance_exec(&after) if after }
|
7
|
+
def_verb(verb) if verb
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def def_init(param_str, method, names)
|
13
|
+
class_eval "def #{method}(#{param_str})\n#{ivars(names)}\n__after\nend"
|
14
|
+
end
|
15
|
+
|
16
|
+
def ivars(names)
|
17
|
+
names.map { |name| "@#{name} = #{name}\n" }.join
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_getters(names)
|
21
|
+
attr_reader(*names)
|
22
|
+
private(*names)
|
23
|
+
end
|
24
|
+
|
25
|
+
def def_verb(verb)
|
26
|
+
define_singleton_method(verb) { |*a, **k, &b| new(*a, **k, &b).send(verb) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Module
|
31
|
+
include Attire
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max White
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -30,20 +30,6 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 3.1.0
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: contracts
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0'
|
40
|
-
type: :development
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
47
33
|
description:
|
48
34
|
email: mushishi78@gmail.com
|
49
35
|
executables: []
|
@@ -53,8 +39,6 @@ files:
|
|
53
39
|
- LICENSE.txt
|
54
40
|
- README.md
|
55
41
|
- lib/attire.rb
|
56
|
-
- lib/attire/initializer.rb
|
57
|
-
- lib/attire/method_object.rb
|
58
42
|
homepage: https://github.com/mushishi78/attire
|
59
43
|
licenses:
|
60
44
|
- MIT
|
@@ -78,5 +62,5 @@ rubyforge_project:
|
|
78
62
|
rubygems_version: 2.2.2
|
79
63
|
signing_key:
|
80
64
|
specification_version: 4
|
81
|
-
summary:
|
65
|
+
summary: Helper to remove some boiler plate in defining classes.
|
82
66
|
test_files: []
|
data/lib/attire/initializer.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
module Attire
|
2
|
-
module Initializer
|
3
|
-
def self.extended(base)
|
4
|
-
base.class.instance_variable_set(:@_added, false)
|
5
|
-
end
|
6
|
-
|
7
|
-
def method_added(method_name)
|
8
|
-
return super unless method_name == :initialize && !added?
|
9
|
-
|
10
|
-
self.added = true
|
11
|
-
method = instance_method(:initialize)
|
12
|
-
super
|
13
|
-
|
14
|
-
names = method.parameters.map(&:last)
|
15
|
-
add_initialize(method, names)
|
16
|
-
add_getters(names)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def added?
|
22
|
-
self.class.instance_variable_get(:@_added)
|
23
|
-
end
|
24
|
-
|
25
|
-
def added=(added)
|
26
|
-
self.class.instance_variable_set(:@_added, added)
|
27
|
-
end
|
28
|
-
|
29
|
-
def add_initialize(method, names)
|
30
|
-
initialize_line = initialize_line(method)
|
31
|
-
set_ivars = names.map { |name| "@#{name} = #{name}\n" }.join
|
32
|
-
|
33
|
-
initializer = Module.new do
|
34
|
-
class_eval "#{initialize_line}#{set_ivars}super\nend\n"
|
35
|
-
end
|
36
|
-
prepend initializer
|
37
|
-
end
|
38
|
-
|
39
|
-
def initialize_line(method)
|
40
|
-
file, endline = *method.source_location
|
41
|
-
File.readlines(file)[0..endline].reverse.each do |line|
|
42
|
-
return line if line.include?('initialize')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def add_getters(names)
|
47
|
-
attr_reader(*names)
|
48
|
-
private(*names)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
data/lib/attire/method_object.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require_relative 'initializer'
|
2
|
-
|
3
|
-
module Attire
|
4
|
-
module MethodObject
|
5
|
-
def self.new(verb)
|
6
|
-
Module.new do
|
7
|
-
define_singleton_method(:extended) { |base| base.extend Initializer }
|
8
|
-
define_method(verb) { |*a, **k, &b| new(*a, **k, &b).send(verb) }
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|