attire 0.1.1 → 0.1.2

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: a8c396ea5af36aa2c91ef57a595a1bd5932960e3
4
- data.tar.gz: e344b21c4a14beca79f37b226d6c55dcb97dcd9e
3
+ metadata.gz: 6534d8adf28c8358c5da8bec3a8b98191335a640
4
+ data.tar.gz: 6a82d12b2d96b8644de663e072741dc6d41832f6
5
5
  SHA512:
6
- metadata.gz: b0be6c4e1eeaf27283c92a7b73f8ce949ae5c6ee1134c2cc7ae50e52a52830d75a01a96206ea5ccad19b4dce93e716a82c96f50b91c28d776abf25bec9ae22f9
7
- data.tar.gz: b84369c42d537c55b79d2585461e57007ae736dff4fd71926a0ee64db0b7543f05bbc82c26889af9437fe4633dd74919bd64b1c95a7a9e8dc9c94758307efac1
6
+ metadata.gz: 1c49f34f6c80ab98424ecb603222d5dd0e97e7762e0fc7be6a50ba590eeef4dbf3d1a27f42de6d89152957e873bc0e00aef19e07c37cbd3fd0afed086f26dd03
7
+ data.tar.gz: 41cb44dddd2db57edda7e5a7fbc720beb65f9175bab7362b22024169a9024669e602c30b0bd3b85837c2ae59eb5f69e9253e0f43d2691e70d5166df8cc6be949
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Attire
2
2
 
3
+ [![Build Status](https://travis-ci.org/mushishi78/attire.svg?branch=master)](https://travis-ci.org/mushishi78/attire)
3
4
  [![Gem Version](https://badge.fury.io/rb/attire.svg)](http://badge.fury.io/rb/attire)
4
5
 
5
6
  Convenience methods to remove some boiler plate in defining classes. Inspired by [attr_extras](https://github.com/barsoom/attr_extras).
@@ -23,10 +24,10 @@ private
23
24
  attr_reader :foo, :bar, :fizz, :pop
24
25
  ```
25
26
 
26
- Splat arguments and blocks can also be defined:
27
+ Optional, splat and blocks arguments can also be defined:
27
28
 
28
29
  ``` ruby
29
- attr_init :'*args', :'&block'
30
+ attr_init :'opts = {}', :'*args', :'&block'
30
31
  ```
31
32
 
32
33
  If a block is provided, it will be evaluated after initialization:
@@ -13,6 +13,7 @@ module Attire
13
13
  def apply
14
14
  type_check
15
15
  extract_splat_and_block_names
16
+ optional_arguments_check
16
17
  instance_initialize = initializer.method(:instance_initialize)
17
18
 
18
19
  klass.send(:define_method, :initialize) do |*values, &value_block|
@@ -27,8 +28,8 @@ module Attire
27
28
  attr_reader :klass, :names, :splat_name, :block_name, :after_initialize
28
29
 
29
30
  def type_check
30
- return if names.all? { |n| [Symbol, Hash].include?(n.class) }
31
- fail ArgumentError, 'Must be Symbol or Hash.'
31
+ return if names.all? { |n| [Symbol, String, Hash].include?(n.class) }
32
+ fail ArgumentError, 'Must be Symbol, String or Hash.'
32
33
  end
33
34
 
34
35
  def extract_splat_and_block_names
@@ -49,7 +50,11 @@ module Attire
49
50
  end
50
51
 
51
52
  def getter_names
52
- getter_names = names.map { |arg| arg.respond_to?(:keys) ? arg.keys : arg }
53
+ getter_names = names.map do |arg|
54
+ next arg.keys if arg.respond_to?(:keys)
55
+ next optional_name(arg) if optional?(arg)
56
+ arg
57
+ end
53
58
  getter_names += [splat_name, block_name]
54
59
  getter_names.flatten.compact
55
60
  end
@@ -70,5 +75,20 @@ module Attire
70
75
  return if names.none? { |n| n.to_s.start_with?('&', '*') }
71
76
  fail ArgumentError, 'Splat and Block arguments must be last'
72
77
  end
78
+
79
+ def optional_arguments_check
80
+ start = names.find_index { |n| optional?(n) }
81
+ return unless start
82
+ return if names[start..-1].all? { |n| n.is_a?(Hash) || optional?(n) }
83
+ fail ArgumentError, 'Required arguments must come before optional'
84
+ end
85
+
86
+ def optional?(name)
87
+ name.to_s.include?('=')
88
+ end
89
+
90
+ def optional_name(name)
91
+ name.to_s.split('=')[0].strip
92
+ end
73
93
  end
74
94
  end
@@ -21,7 +21,9 @@ module Attire
21
21
 
22
22
  def set_ivars
23
23
  names.zip(values).each do |name, value|
24
- name.is_a?(Symbol) ? set_ivar(name, value) : set_hash(name, value)
24
+ next set_hash(name, value) if name.is_a?(Hash)
25
+ next set_optional(name, value) if optional?(name)
26
+ set_ivar(name, value)
25
27
  end
26
28
  set_splat
27
29
  set_block
@@ -35,6 +37,12 @@ module Attire
35
37
  end
36
38
  end
37
39
 
40
+ def set_optional(name, value)
41
+ name, default = name.to_s.split('=').map(&:strip)
42
+ value = eval(default) if value.nil?
43
+ set_ivar(name, value)
44
+ end
45
+
38
46
  def set_splat
39
47
  return unless splat_name
40
48
  value_splat = values[names.length..values.length] || []
@@ -60,7 +68,10 @@ module Attire
60
68
  end
61
69
 
62
70
  def min_arity
63
- names.last.is_a?(Hash) ? names.length - 1 : names.length
71
+ last_required = names.reverse_each.find_index do |n|
72
+ !(optional?(n) || n.is_a?(Hash))
73
+ end
74
+ last_required ? names.length - last_required : 0
64
75
  end
65
76
 
66
77
  def max_arity
@@ -70,5 +81,9 @@ module Attire
70
81
  def arity_range
71
82
  @arity_range ||= (min_arity..max_arity)
72
83
  end
84
+
85
+ def optional?(name)
86
+ name.to_s.include?('=')
87
+ end
73
88
  end
74
89
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max White
@@ -14,20 +14,20 @@ dependencies:
14
14
  name: rspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.1'
20
- - - '>='
20
+ - - ">="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 3.1.0
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '3.1'
30
- - - '>='
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 3.1.0
33
33
  description:
@@ -51,17 +51,17 @@ require_paths:
51
51
  - lib
52
52
  required_ruby_version: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - '>='
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  required_rubygems_version: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  requirements: []
63
63
  rubyforge_project:
64
- rubygems_version: 2.4.1
64
+ rubygems_version: 2.2.2
65
65
  signing_key:
66
66
  specification_version: 4
67
67
  summary: Convenience methods to remove some boiler plate in defining classes.