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 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