tbpgr_utils 0.0.135 → 0.0.136
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/README.md +37 -1
- data/lib/attr_enumerable/attr_enumerable_helper.rb +38 -0
- data/lib/attr_enumerable/each_attr.rb +14 -0
- data/lib/attr_enumerable/each_attr_with_index.rb +14 -0
- data/lib/attr_enumerable.rb +2 -24
- data/lib/tbpgr_utils/version.rb +1 -1
- data/spec/{attr_enumerable_spec.rb → attr_enumerable/each_attr_spec.rb} +4 -4
- data/spec/attr_enumerable/each_attr_with_index_spec.rb +81 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a04fd972d51e9a1cca40f5ca22e5ce60c791fafb
|
4
|
+
data.tar.gz: 5058986a81274eda20e8daeb224c164308086256
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 963693f1d332754521be42cb9e0f28d507baa47b80eaf7ac5ec45c8885b3ebd494da3d50a3bfca46cb5e4fd5bae837d4cef96d1efbe76072a2d282f43f851437
|
7
|
+
data.tar.gz: 033f99cf39352ac6a032052eeb3299912cf05bf8997fa71298f972009ee81eaf0e15568f9832d5d888eda511148c49f1732bc366b1d99f5f61411a763acc8be9
|
data/README.md
CHANGED
@@ -60,7 +60,8 @@ Or install it yourself as:
|
|
60
60
|
|[TbpgrUtils Array#together_slice](#arraytogether_sliceor-tslice) |together version of Array#slice. together_slice has alias :tslice |
|
61
61
|
|[TbpgrUtils Array#together_with_index](#arraytogether_with_index) |loop all arrays by block with index |
|
62
62
|
|[TbpgrUtils Array#uniq_size](#arrayuniq_size) |return uniq size |
|
63
|
-
|[AttrEnumerable
|
63
|
+
|[AttrEnumerable.each_attr](#attrenumerableeach_attr) |define each_xxx. it call Class attributes(collection)'s attribute iterator |
|
64
|
+
|[AttrEnumerable.each_attr_with_index](#attrenumerableeach_attr_with_index) |define each_xxx_with_index. it call Class attributes(collection)'s attribute iterator with index |
|
64
65
|
|[AttributesHashable.to_hash](#attributeshashableto_hash) |define to_hash method for get instance_values |
|
65
66
|
|[AttributesInitializable::ClassMethods.attr_accessor_init](#attributesinitializableclassmethodsattr_accessor_init) |generate attr_accessor + initializer |
|
66
67
|
|[AttributesInitializable::ClassMethods.attr_reader_init](#attributesinitializableclassmethodsattr_reader_init) |generate attr_reader + initializer |
|
@@ -1101,6 +1102,40 @@ require 'tbpgr_utils'
|
|
1101
1102
|
|
1102
1103
|
[back to list](#list)
|
1103
1104
|
|
1105
|
+
### AttrEnumerable.each_attr_with_index
|
1106
|
+
~~~ruby
|
1107
|
+
require 'attr_enumerable'
|
1108
|
+
class Person
|
1109
|
+
attr_reader :name, :age
|
1110
|
+
def initialize(name, age)
|
1111
|
+
@name, @age = name, age
|
1112
|
+
end
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
class Persons
|
1116
|
+
attr_reader :persons
|
1117
|
+
include AttrEnumerable
|
1118
|
+
def initialize(persons = [])
|
1119
|
+
@persons = persons
|
1120
|
+
end
|
1121
|
+
|
1122
|
+
def <<(person)
|
1123
|
+
@persons << person
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
persons = Persons.new([Person.new("tanaka", 84), Person.new("suzuki", 103)])
|
1128
|
+
persons.each_name_with_index do |name, i|
|
1129
|
+
puts "#{name}:#{i}" # => "tanaka:0", "suzuki:1"
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
persons.each_age_with_index do |age, i|
|
1133
|
+
puts "#{age.to_s}:#{i}" # => "84:0", "103:0"
|
1134
|
+
end
|
1135
|
+
~~~
|
1136
|
+
|
1137
|
+
[back to list](#list)
|
1138
|
+
|
1104
1139
|
### AttrEnumerable.each_attr
|
1105
1140
|
~~~ruby
|
1106
1141
|
require 'attr_enumerable'
|
@@ -3837,6 +3872,7 @@ if you are Sublime Text2 user, you can use snippet for TbpgrUtils.
|
|
3837
3872
|
https://github.com/tbpgr/tbpgr_utils_snippets
|
3838
3873
|
|
3839
3874
|
## History
|
3875
|
+
* version 0.0.136 : add AttrEnumerable.each_attr_with_index
|
3840
3876
|
* version 0.0.135 : add AttrEnumerable.each_attr
|
3841
3877
|
* version 0.0.134 : add Integer#reverse_each_digit
|
3842
3878
|
* version 0.0.133 : add Integer#each_digit_with_index
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
# AttrEnumerable
|
5
|
+
module AttrEnumerable
|
6
|
+
ATTR_METHODS = [
|
7
|
+
{ regexp: /^each_(.*)_with_index$/, call_method: :each_attr_with_index },
|
8
|
+
{ regexp: /^each_(.*)$/, call_method: :each_attr }
|
9
|
+
]
|
10
|
+
|
11
|
+
# call attr enumerable method.
|
12
|
+
def method_missing(method_name, *args, &block)
|
13
|
+
attr_method = detect(method_name)
|
14
|
+
send(attr_method[:call_method], attr_method[:attribute], &block)
|
15
|
+
rescue
|
16
|
+
super(method_name, *args, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def detect(method_name)
|
21
|
+
ATTR_METHODS.each do |attr_method|
|
22
|
+
regexp = attr_method[:regexp]
|
23
|
+
if method_name.to_s =~ regexp
|
24
|
+
attribute = method_name.to_s.scan(regexp).first.first
|
25
|
+
return { call_method: attr_method[:call_method], attribute: attribute }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
fail NoMethodError, "method is not exists #{method_name}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def include_attr?(element, attribute)
|
32
|
+
element.instance_variables.include? :"@#{attribute}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def collection
|
36
|
+
instance_variable_get("@#{self.class.name.underscore}")
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'active_support/inflector'
|
3
|
+
require 'attr_enumerable/attr_enumerable_helper'
|
4
|
+
|
5
|
+
# AttrEnumerable
|
6
|
+
module AttrEnumerable
|
7
|
+
private
|
8
|
+
def each_attr(attribute, &block)
|
9
|
+
collection.each do |element|
|
10
|
+
super(method_name, *args) unless include_attr?(element, attribute)
|
11
|
+
yield element.send(attribute)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'active_support/inflector'
|
3
|
+
require 'attr_enumerable/attr_enumerable_helper'
|
4
|
+
|
5
|
+
# AttrEnumerable
|
6
|
+
module AttrEnumerable
|
7
|
+
private
|
8
|
+
def each_attr_with_index(attribute, &block)
|
9
|
+
collection.each_with_index do |element, index|
|
10
|
+
super(method_name, *args) unless include_attr?(element, attribute)
|
11
|
+
yield element.send(attribute), index
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/attr_enumerable.rb
CHANGED
@@ -1,29 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require 'active_support/inflector'
|
3
2
|
|
4
3
|
# AttrEnumerable
|
5
4
|
module AttrEnumerable
|
6
|
-
|
7
|
-
|
8
|
-
# xxx is attribute name.
|
9
|
-
# Class XxxxYyyys must have attributes xxxx_yyyys.
|
10
|
-
# xxxx_yyyys is collection of Class XxxxYyyy.
|
11
|
-
# XxxxYyyy has attributes.
|
12
|
-
def method_missing(method_name, *args, &block)
|
13
|
-
if method_name =~ /each_/
|
14
|
-
attribute = method_name.to_s.scan(/each_(.*)/).first.first
|
15
|
-
each_attr(attribute, &block)
|
16
|
-
else
|
17
|
-
super(method_name, *args, &block)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
def each_attr(attribute, &block)
|
23
|
-
collection = self.instance_variable_get("@#{self.class.name.underscore}")
|
24
|
-
collection.each do |element|
|
25
|
-
super(method_name, *args) unless element.instance_variables.include? :"@#{attribute}"
|
26
|
-
yield element.send(attribute)
|
27
|
-
end
|
28
|
-
end
|
5
|
+
require 'attr_enumerable/each_attr'
|
6
|
+
require 'attr_enumerable/each_attr_with_index'
|
29
7
|
end
|
data/lib/tbpgr_utils/version.rb
CHANGED
@@ -29,8 +29,8 @@ describe AttrEnumerable do
|
|
29
29
|
case_title: 'name case',
|
30
30
|
klass: AttrEnumerablePersons.new(
|
31
31
|
[
|
32
|
-
AttrEnumerablePerson.new(
|
33
|
-
AttrEnumerablePerson.new(
|
32
|
+
AttrEnumerablePerson.new('tanaka', 84),
|
33
|
+
AttrEnumerablePerson.new('suzuki', 103)
|
34
34
|
]
|
35
35
|
),
|
36
36
|
method: :each_name,
|
@@ -41,8 +41,8 @@ describe AttrEnumerable do
|
|
41
41
|
case_title: 'age case',
|
42
42
|
klass: AttrEnumerablePersons.new(
|
43
43
|
[
|
44
|
-
AttrEnumerablePerson.new(
|
45
|
-
AttrEnumerablePerson.new(
|
44
|
+
AttrEnumerablePerson.new('tanaka', 84),
|
45
|
+
AttrEnumerablePerson.new('suzuki', 103)
|
46
46
|
]
|
47
47
|
),
|
48
48
|
method: :each_age,
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'attr_enumerable'
|
4
|
+
|
5
|
+
describe AttrEnumerable do
|
6
|
+
context :each_attr_with_index do
|
7
|
+
class EachAttrWithIndexPerson
|
8
|
+
attr_reader :name, :age
|
9
|
+
def initialize(name, age)
|
10
|
+
@name, @age = name, age
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class EachAttrWithIndexPersons
|
15
|
+
attr_reader :each_attr_with_index_persons
|
16
|
+
include AttrEnumerable
|
17
|
+
def initialize(persons = [])
|
18
|
+
@each_attr_with_index_persons = persons
|
19
|
+
end
|
20
|
+
|
21
|
+
def <<(person)
|
22
|
+
@each_attr_with_index_persons << person
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
cases = [
|
27
|
+
{
|
28
|
+
case_no: 1,
|
29
|
+
case_title: 'name case',
|
30
|
+
klass: EachAttrWithIndexPersons.new(
|
31
|
+
[
|
32
|
+
EachAttrWithIndexPerson.new('tanaka', 84),
|
33
|
+
EachAttrWithIndexPerson.new('suzuki', 103)
|
34
|
+
]
|
35
|
+
),
|
36
|
+
method: :each_name_with_index,
|
37
|
+
expected: ['tanaka:0', 'suzuki:1']
|
38
|
+
},
|
39
|
+
{
|
40
|
+
case_no: 2,
|
41
|
+
case_title: 'age case',
|
42
|
+
klass: EachAttrWithIndexPersons.new(
|
43
|
+
[
|
44
|
+
EachAttrWithIndexPerson.new('tanaka', 84),
|
45
|
+
EachAttrWithIndexPerson.new('suzuki', 103)
|
46
|
+
]
|
47
|
+
),
|
48
|
+
method: :each_age_with_index,
|
49
|
+
expected: ['84:0', '103:1']
|
50
|
+
},
|
51
|
+
]
|
52
|
+
|
53
|
+
cases.each do |c|
|
54
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
55
|
+
begin
|
56
|
+
case_before c
|
57
|
+
|
58
|
+
# -- given --
|
59
|
+
# nothing
|
60
|
+
|
61
|
+
# -- when --
|
62
|
+
ret = []
|
63
|
+
c[:klass].send c[:method] { |attribute, index| ret << attribute.to_s + ":#{index}" }
|
64
|
+
|
65
|
+
# -- then --
|
66
|
+
expect(ret).to eq(c[:expected])
|
67
|
+
ensure
|
68
|
+
case_after c
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def case_before(c)
|
73
|
+
# implement each case before
|
74
|
+
end
|
75
|
+
|
76
|
+
def case_after(c)
|
77
|
+
# implement each case after
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tbpgr_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.136
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tbpgr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -97,6 +97,9 @@ files:
|
|
97
97
|
- README.md
|
98
98
|
- Rakefile
|
99
99
|
- lib/attr_enumerable.rb
|
100
|
+
- lib/attr_enumerable/attr_enumerable_helper.rb
|
101
|
+
- lib/attr_enumerable/each_attr.rb
|
102
|
+
- lib/attr_enumerable/each_attr_with_index.rb
|
100
103
|
- lib/attributes_hashable.rb
|
101
104
|
- lib/attributes_initializable.rb
|
102
105
|
- lib/end_erb.rb
|
@@ -253,7 +256,8 @@ files:
|
|
253
256
|
- lib/test_toolbox.rb
|
254
257
|
- lib/test_toolbox/kernel.rb
|
255
258
|
- rubocop-todo.yml
|
256
|
-
- spec/
|
259
|
+
- spec/attr_enumerable/each_attr_spec.rb
|
260
|
+
- spec/attr_enumerable/each_attr_with_index_spec.rb
|
257
261
|
- spec/attributes_hashable_spec.rb
|
258
262
|
- spec/attributes_initializable_spec.rb
|
259
263
|
- spec/eval_helper/attr_accessor_init_code_spec.rb
|
@@ -417,7 +421,8 @@ signing_key:
|
|
417
421
|
specification_version: 4
|
418
422
|
summary: Utilities
|
419
423
|
test_files:
|
420
|
-
- spec/
|
424
|
+
- spec/attr_enumerable/each_attr_spec.rb
|
425
|
+
- spec/attr_enumerable/each_attr_with_index_spec.rb
|
421
426
|
- spec/attributes_hashable_spec.rb
|
422
427
|
- spec/attributes_initializable_spec.rb
|
423
428
|
- spec/eval_helper/attr_accessor_init_code_spec.rb
|