attire 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|