attire 1.0.0 → 1.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 +4 -4
- data/lib/attire.rb +1 -1
- data/lib/attire/attr_init.rb +15 -29
- data/lib/attire/attr_init/arguments.rb +2 -4
- data/lib/attire/attr_init/arguments_checker.rb +2 -2
- data/lib/attire/attr_init/instance_methods.rb +37 -0
- data/lib/attire/core_ext/duplicable.rb +25 -9
- metadata +3 -3
- data/lib/attire/attr_init/initializer.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a422961944b405505f20ccd99b7cf098378f18bf
|
4
|
+
data.tar.gz: 84b4261dca389bb26a7b52ad9f0981c2425dfafd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22c26d505363455eafd750f6c385201d1eab0133f9b178f3b98c79fe31d504f8b2aa23d5aff4ceb512c8e3f8ba3596670dc6a3f2f4b6f4aa658a9a21cd0e5edc
|
7
|
+
data.tar.gz: 10ab969e34aff9b34188334d70d1dd8976fcb25ed5ea7e21aa0a437f139b0a70826dcdb14333b99046314c2afd60c456a0a16b0f16ba01abc8eb555ff9fff9e8
|
data/lib/attire.rb
CHANGED
data/lib/attire/attr_init.rb
CHANGED
@@ -1,37 +1,23 @@
|
|
1
|
+
require 'attire/attr_init/arguments_checker'
|
1
2
|
require 'attire/attr_init/arguments'
|
2
|
-
require 'attire/attr_init/
|
3
|
+
require 'attire/attr_init/values_matcher'
|
4
|
+
require 'attire/attr_init/instance_methods'
|
3
5
|
|
4
6
|
module Attire
|
5
7
|
module AttrInit
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
define_getters(klass, arguments)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def define_initializer(klass, initializer)
|
17
|
-
klass.send(:define_method, :initialize) do |*values, &value_block|
|
18
|
-
initializer.instance_initialize(self, values, value_block)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def define_getters(klass, arguments)
|
23
|
-
names = arguments.getter_names
|
24
|
-
names.each { |n| define_getter(klass, n, arguments.defaults[n]) }
|
25
|
-
klass.send(:private, *names)
|
26
|
-
end
|
8
|
+
def self.new(args, after_block)
|
9
|
+
ArgumentsChecker.check(args)
|
10
|
+
arguments = Arguments.new(args)
|
11
|
+
values_matcher = ValuesMatcher.new(arguments)
|
12
|
+
getters, defaults = arguments.getters, arguments.defaults
|
27
13
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
14
|
+
Module.new do
|
15
|
+
include InstanceMethods
|
16
|
+
define_method(:_arguments) { arguments }
|
17
|
+
define_method(:_after_block) { after_block }
|
18
|
+
define_method(:_values_matcher) { values_matcher }
|
19
|
+
getters.each { |n| define_method(n) { _get_attribute(n, defaults[n]) } }
|
20
|
+
private(*getters)
|
35
21
|
end
|
36
22
|
end
|
37
23
|
end
|
@@ -1,20 +1,18 @@
|
|
1
1
|
require 'attire/core_ext/duplicable'
|
2
|
-
require_relative 'arguments_checker'
|
3
2
|
|
4
3
|
module Attire
|
5
4
|
module AttrInit
|
6
5
|
class Arguments
|
7
6
|
def initialize(arguments)
|
8
|
-
ArgumentsChecker.check(arguments)
|
9
7
|
@block = last_argument_with_prefix(arguments, '&')
|
10
8
|
@splat = last_argument_with_prefix(arguments, '*')
|
11
9
|
@names, @defaults = [], {}
|
12
10
|
arguments.each { |arg| extract_argument(arg) }
|
13
11
|
@arity_range = (min_arity..max_arity)
|
14
|
-
@
|
12
|
+
@getters = (names.flatten + [splat, block]).compact
|
15
13
|
end
|
16
14
|
|
17
|
-
attr_reader :names, :splat, :block, :defaults, :arity_range, :
|
15
|
+
attr_reader :names, :splat, :block, :defaults, :arity_range, :getters
|
18
16
|
|
19
17
|
private
|
20
18
|
|
@@ -35,8 +35,8 @@ module Attire
|
|
35
35
|
def splat_check
|
36
36
|
return unless splat?
|
37
37
|
return if i == (@has_block ? 1 : 0)
|
38
|
-
|
39
|
-
|
38
|
+
msg = 'Splat arguments must come after required and optional arguments'
|
39
|
+
fail ArgumentError, msg
|
40
40
|
end
|
41
41
|
|
42
42
|
def required_after_optional_check
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Attire
|
2
|
+
module AttrInit
|
3
|
+
module InstanceMethods
|
4
|
+
def initialize(*values, &value_block)
|
5
|
+
_arity_check(values)
|
6
|
+
_match(values, value_block).each { |k, v| instance_variable_set("@#{k}", v) }
|
7
|
+
instance_exec(&_after_block) if _after_block
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def _arity_check(values)
|
13
|
+
return if _arity_range.include?(values.length)
|
14
|
+
msg = "wrong number of arguments (#{values.length} for #{_arity_range})"
|
15
|
+
fail ArgumentError, msg
|
16
|
+
end
|
17
|
+
|
18
|
+
def _get_attribute(name, default)
|
19
|
+
value = instance_variable_get("@#{name}")
|
20
|
+
return value unless value.nil? && !default.nil?
|
21
|
+
instance_variable_set("@#{name}", _duped_default(default))
|
22
|
+
end
|
23
|
+
|
24
|
+
def _duped_default(default)
|
25
|
+
default.duplicable? ? default.dup : default
|
26
|
+
end
|
27
|
+
|
28
|
+
def _match(*args)
|
29
|
+
_values_matcher.match(*args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def _arity_range
|
33
|
+
_arguments.arity_range
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,32 +1,48 @@
|
|
1
1
|
class Object
|
2
|
-
def duplicable
|
2
|
+
def duplicable?
|
3
|
+
true
|
4
|
+
end
|
3
5
|
end
|
4
6
|
|
5
7
|
class NilClass
|
6
|
-
def duplicable
|
8
|
+
def duplicable?
|
9
|
+
false
|
10
|
+
end
|
7
11
|
end
|
8
12
|
|
9
13
|
class FalseClass
|
10
|
-
def duplicable
|
14
|
+
def duplicable?
|
15
|
+
false
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
19
|
class TrueClass
|
14
|
-
def duplicable
|
20
|
+
def duplicable?
|
21
|
+
false
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
class Symbol
|
18
|
-
def duplicable
|
26
|
+
def duplicable?
|
27
|
+
false
|
28
|
+
end
|
19
29
|
end
|
20
30
|
|
21
31
|
class Numeric
|
22
|
-
def duplicable
|
32
|
+
def duplicable?
|
33
|
+
false
|
34
|
+
end
|
23
35
|
end
|
24
36
|
|
25
37
|
require 'bigdecimal'
|
26
38
|
class BigDecimal
|
27
|
-
def duplicable
|
39
|
+
def duplicable?
|
40
|
+
true
|
41
|
+
end
|
28
42
|
end
|
29
43
|
|
30
44
|
class Method
|
31
|
-
def duplicable
|
32
|
-
|
45
|
+
def duplicable?
|
46
|
+
false
|
47
|
+
end
|
48
|
+
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: 1.
|
4
|
+
version: 1.1.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-03-
|
11
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -42,7 +42,7 @@ files:
|
|
42
42
|
- lib/attire/attr_init.rb
|
43
43
|
- lib/attire/attr_init/arguments.rb
|
44
44
|
- lib/attire/attr_init/arguments_checker.rb
|
45
|
-
- lib/attire/attr_init/
|
45
|
+
- lib/attire/attr_init/instance_methods.rb
|
46
46
|
- lib/attire/attr_init/values_matcher.rb
|
47
47
|
- lib/attire/core_ext/duplicable.rb
|
48
48
|
homepage: https://github.com/mushishi78/attire
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require_relative 'values_matcher'
|
2
|
-
|
3
|
-
module Attire
|
4
|
-
module AttrInit
|
5
|
-
class Initializer
|
6
|
-
def initialize(arguments, after_initialize, opts = {})
|
7
|
-
@values_matcher = opts[:values_matcher] || ValuesMatcher.new(arguments)
|
8
|
-
@arity_range = arguments.arity_range
|
9
|
-
@after_initialize = after_initialize
|
10
|
-
end
|
11
|
-
|
12
|
-
def instance_initialize(instance, values, value_block)
|
13
|
-
arity_check(values)
|
14
|
-
values_matcher.match(values, value_block).each do |k, v|
|
15
|
-
instance.instance_variable_set("@#{k}", v)
|
16
|
-
end
|
17
|
-
instance.instance_exec(&after_initialize) if after_initialize
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_reader :values_matcher, :arity_range, :after_initialize
|
23
|
-
|
24
|
-
def arity_check(values)
|
25
|
-
return if arity_range.include?(values.length)
|
26
|
-
fail ArgumentError, "wrong number of arguments (#{values.length} for #{arity_range})"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|