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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1e1fc1f22a2213695656d10b09d2de54e340910
4
- data.tar.gz: 0e10d06cf3402de661391eb894c5127f6a9f56fe
3
+ metadata.gz: a422961944b405505f20ccd99b7cf098378f18bf
4
+ data.tar.gz: 84b4261dca389bb26a7b52ad9f0981c2425dfafd
5
5
  SHA512:
6
- metadata.gz: 8878fced254c26d7f4520bb99547d88c96b5355b79200b8e3ace0c47e03c3c1e26c64b4ecfc435184c209138ffecb1f11c38876f249f33417a03abce178f7def
7
- data.tar.gz: 76646d629df750287941eaad2e57a3884f236be29a0c77bc66eb7bd0bcc08730def009c0dbccefb66b9c0e32350cab641c07d176ee7b7e294b276f93dd427421
6
+ metadata.gz: 22c26d505363455eafd750f6c385201d1eab0133f9b178f3b98c79fe31d504f8b2aa23d5aff4ceb512c8e3f8ba3596670dc6a3f2f4b6f4aa658a9a21cd0e5edc
7
+ data.tar.gz: 10ab969e34aff9b34188334d70d1dd8976fcb25ed5ea7e21aa0a437f139b0a70826dcdb14333b99046314c2afd60c456a0a16b0f16ba01abc8eb555ff9fff9e8
data/lib/attire.rb CHANGED
@@ -10,7 +10,7 @@ module Attire
10
10
  end
11
11
 
12
12
  def attr_init(*args, &block)
13
- AttrInit.apply(self, args, block)
13
+ include AttrInit.new(args, block)
14
14
  end
15
15
 
16
16
  def attr_method(verb, *args, &block)
@@ -1,37 +1,23 @@
1
+ require 'attire/attr_init/arguments_checker'
1
2
  require 'attire/attr_init/arguments'
2
- require 'attire/attr_init/initializer'
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
- class << self
7
- def apply(klass, args, after_initialize)
8
- arguments = Arguments.new(args)
9
- initializer = Initializer.new(arguments, after_initialize)
10
- define_initializer(klass, initializer)
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
- def define_getter(klass, name, default)
29
- klass.send(:define_method, name) do
30
- value = instance_variable_get("@#{name}")
31
- return value unless value.nil? && !default.nil?
32
- default = default.duplicable? ? default.dup : default
33
- instance_variable_set("@#{name}", default)
34
- end
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
- @getter_names = (names.flatten + [splat, block]).compact
12
+ @getters = (names.flatten + [splat, block]).compact
15
13
  end
16
14
 
17
- attr_reader :names, :splat, :block, :defaults, :arity_range, :getter_names
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
- fail ArgumentError, \
39
- 'Splat arguments must come after required and optional arguments'
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?; true end
2
+ def duplicable?
3
+ true
4
+ end
3
5
  end
4
6
 
5
7
  class NilClass
6
- def duplicable?; false end
8
+ def duplicable?
9
+ false
10
+ end
7
11
  end
8
12
 
9
13
  class FalseClass
10
- def duplicable?; false end
14
+ def duplicable?
15
+ false
16
+ end
11
17
  end
12
18
 
13
19
  class TrueClass
14
- def duplicable?; false end
20
+ def duplicable?
21
+ false
22
+ end
15
23
  end
16
24
 
17
25
  class Symbol
18
- def duplicable?; false end
26
+ def duplicable?
27
+ false
28
+ end
19
29
  end
20
30
 
21
31
  class Numeric
22
- def duplicable?; false end
32
+ def duplicable?
33
+ false
34
+ end
23
35
  end
24
36
 
25
37
  require 'bigdecimal'
26
38
  class BigDecimal
27
- def duplicable?; true end
39
+ def duplicable?
40
+ true
41
+ end
28
42
  end
29
43
 
30
44
  class Method
31
- def duplicable?; false end
32
- end
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.0.0
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-02 00:00:00.000000000 Z
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/initializer.rb
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