mug 0.3.1 → 0.4.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: d07407afa937cc922025564e10c1dfd2a16535f2
4
- data.tar.gz: 0391bcb1f0b93e59e852cf3bc1ba8eee0bc95e9d
3
+ metadata.gz: 17f7a48a6bfa945c6760d07cca504c9d368414b6
4
+ data.tar.gz: 3e6f798ad9030e7d8de51d805ea22092bed9af96
5
5
  SHA512:
6
- metadata.gz: 0f8cea3e467019cdb61879a1d8bb87770e88f1796f2db4a93b692e092b3352a58438d81044ee59d9f8730512a8a85a4120c6f48141ee54713067f38e7f57fcd2
7
- data.tar.gz: d7b36788bd623f2528a59b50929a940327ee656dbb8ad8f57c3a500f3b20738c5c1e7529a257121d388b7ae1735bd91b1b27a6e1adff2a8963ecd18a5511f1a4
6
+ metadata.gz: b35026ab417cc017594e49fdbcb042ec9319cf5918026ba57ffb5b5f208b4e8a7222f9e99cdb8ffd09951d4985df7a913420d0ce64e0a6b441a7c6add7b2f55a
7
+ data.tar.gz: 210d8afdc5f5ac618eb25fe5a0e79a92dc09e124c761448d4e224f0ae4068038782ef9528b8d4372799211f7513adc949e21fdb1c7a06bec03aa9dc548fe34a1
data/lib/mug.rb CHANGED
@@ -12,6 +12,8 @@ require_relative 'mug/hash/operations'
12
12
  require_relative 'mug/iterator/for'
13
13
  require_relative 'mug/iterator/method'
14
14
  require_relative 'mug/loop-with'
15
+ require_relative 'mug/matchdata/each'
16
+ require_relative 'mug/matchdata/hash'
15
17
  require_relative 'mug/maybe'
16
18
  require_relative 'mug/negativity'
17
19
  require_relative 'mug/rexproc'
@@ -0,0 +1,2 @@
1
+ require_relative 'matchdata/each'
2
+ require_relative 'matchdata/hash'
@@ -0,0 +1,65 @@
1
+
2
+ class MatchData
3
+
4
+ # Iterates over each capture group in the MatchData object,
5
+ # including +$&+ (the entire matched string), yielding the
6
+ # captured string.
7
+ def each &b
8
+ return enum_for(:each) unless block_given?
9
+ to_a.each{|v| yield v }
10
+ end
11
+
12
+ # Iterates over each capture group in the MatchData object,
13
+ # yielding the capture position and captured string.
14
+ #
15
+ # The capture positions are either all Strings or all Integers,
16
+ # depending on whether the original Regexp had named capture
17
+ # groups or not.
18
+ def each_capture &b
19
+ return enum_for(:each_capture) unless block_given?
20
+ if names.empty?
21
+ captures.each_with_index{|v,i| yield i+1, v }
22
+ else
23
+ names.each{|n| yield n, self[n] }
24
+ end
25
+ end
26
+
27
+ # Iterates over each named capture group in the MatchData object,
28
+ # yielding the capture name and string.
29
+ def each_named_capture &b
30
+ return enum_for(:each_named_capture) unless block_given?
31
+ names.each{|n| yield n, self[n] }
32
+ end
33
+
34
+ # Iterates over each positional capture group in the MatchData object,
35
+ # yielding the capture position and string.
36
+ #
37
+ # If +include_names+ is given and true, treats named captures
38
+ # as positional captures.
39
+ #
40
+ # WARNING: if mixing named and positional captures, no positional
41
+ # captures will be available using this method!
42
+ def each_positional_capture include_names: false, &b
43
+ return enum_for(:each_positional_capture, include_names: include_names) unless block_given?
44
+ return unless names.empty? || include_names
45
+ captures.each_with_index{|v,i| yield i+1, v }
46
+ end
47
+
48
+ end
49
+
50
+ =begin
51
+ Copyright (c) 2016, Matthew Kerwin <matthew@kerwin.net.au>
52
+
53
+ Permission to use, copy, modify, and/or distribute this software for any
54
+ purpose with or without fee is hereby granted, provided that the above
55
+ copyright notice and this permission notice appear in all copies.
56
+
57
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
58
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
59
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
60
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
61
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
62
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
63
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
64
+ =end
65
+
@@ -0,0 +1,51 @@
1
+
2
+ class MatchData
3
+
4
+ # Returns a Hash object of capture position => captured string.
5
+ #
6
+ # The capture positions are either all Strings or all Integers,
7
+ # depending on whether the original Regexp had named capture
8
+ # groups or not.
9
+ def to_h
10
+ if names.empty?
11
+ Hash[ captures.each_with_index.map{|v,i| [i+1, v] } ]
12
+ else
13
+ Hash[ names.map{|n| [n, self[n]] } ]
14
+ end
15
+ end
16
+
17
+ # Returns a Hash object of capture name => captured string.
18
+ def named_captures
19
+ Hash[ names.map{|n| [n, self[n]] } ]
20
+ end
21
+
22
+ # Returns a Hash object of capture position => captured string.
23
+ #
24
+ # If +include_names+ is given and true, treats named captures
25
+ # as positional captures.
26
+ #
27
+ # WARNING: if mixing named and positional captures, no positional
28
+ # captures will be available using this method!
29
+ def positional_captures include_names: false
30
+ return {} unless names.empty? || include_names
31
+ Hash[ captures.each_with_index.map{|v,i| [i+1, v] } ]
32
+ end
33
+
34
+ end
35
+
36
+ =begin
37
+ Copyright (c) 2016, Matthew Kerwin <matthew@kerwin.net.au>
38
+
39
+ Permission to use, copy, modify, and/or distribute this software for any
40
+ purpose with or without fee is hereby granted, provided that the above
41
+ copyright notice and this permission notice appear in all copies.
42
+
43
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
44
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
45
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
46
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
47
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
48
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
49
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
50
+ =end
51
+
@@ -0,0 +1,57 @@
1
+ require 'test/unit'
2
+ $VERBOSE = true
3
+
4
+ require_relative '../lib/mug/matchdata/each'
5
+ class Test_matchdata_each < Test::Unit::TestCase
6
+ def test__matchdata__each
7
+ str = 'a12b'
8
+ [
9
+ [/( \d)( \d)/x.match(str), %w[ 12 1 2 ]],
10
+ [/(?<x>\d)(?<y>\d)/x.match(str), %w[ 12 1 2 ]],
11
+ [/( \d)(?<y>\d)/x.match(str), %w[ 12 2 ]], # ):
12
+ ].each do |m, x|
13
+ assert_equal( x, m.each.to_a )
14
+ end
15
+ end
16
+ def test__matchdata__each_capture
17
+ str = 'a12b'
18
+ [
19
+ [/( \d)( \d)/x.match(str), [[ 1 ,'1'],[ 2 ,'2']]],
20
+ [/(?<x>\d)(?<y>\d)/x.match(str), [['x','1'],['y','2']]],
21
+ [/( \d)(?<y>\d)/x.match(str), [ ['y','2']]], # ):
22
+ ].each do |m, x|
23
+ assert_equal( x, m.each_capture.to_a )
24
+ end
25
+ end
26
+ def test__matchdata__each_named_capture
27
+ str = 'a12b'
28
+ [
29
+ [/( \d)( \d)/x.match(str), [ ]],
30
+ [/(?<x>\d)(?<y>\d)/x.match(str), [['x','1'],['y','2']]],
31
+ [/( \d)(?<y>\d)/x.match(str), [ ['y','2']]],
32
+ ].each do |m, x|
33
+ assert_equal( x, m.each_named_capture.to_a )
34
+ end
35
+ end
36
+ def test__matchdata__each_positional_capture
37
+ str = 'a12b'
38
+ [
39
+ [/( \d)( \d)/x.match(str), [[ 1, '1'],[ 2 ,'2']]],
40
+ [/(?<x>\d)(?<y>\d)/x.match(str), [ ]],
41
+ [/( \d)(?<y>\d)/x.match(str), [ ]], # D:
42
+ ].each do |m, x|
43
+ assert_equal( x, m.each_positional_capture.to_a )
44
+ end
45
+ end
46
+ def test__matchdata__each_positional_capture2
47
+ str = 'a12b'
48
+ [
49
+ [/( \d)( \d)/x.match(str), [[ 1, '1'],[ 2 ,'2']]],
50
+ [/(?<x>\d)(?<y>\d)/x.match(str), [[ 1, '1'],[ 2 ,'2']]],
51
+ [/( \d)(?<y>\d)/x.match(str), [[ 1, '2']]], # ):
52
+ ].each do |m, x|
53
+ assert_equal( x, m.each_positional_capture(include_names: true).to_a )
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1,47 @@
1
+ require 'test/unit'
2
+ $VERBOSE = true
3
+
4
+ require_relative '../lib/mug/matchdata/hash'
5
+ class Test_matchdata_hash < Test::Unit::TestCase
6
+ def test__matchdata__to_h
7
+ str = 'a12b'
8
+ [
9
+ [/( \d)( \d)/x.match(str), { 1 =>'1', 2 =>'2'}],
10
+ [/(?<x>\d)(?<y>\d)/x.match(str), {'x'=>'1', 'y'=>'2'}],
11
+ [/( \d)(?<y>\d)/x.match(str), { 'y'=>'2'}], # ):
12
+ ].each do |m, x|
13
+ assert_equal( x, m.to_h )
14
+ end
15
+ end
16
+ def test__matchdata__named_captures
17
+ str = 'a12b'
18
+ [
19
+ [/( \d)( \d)/x.match(str), { }],
20
+ [/(?<x>\d)(?<y>\d)/x.match(str), {'x'=>'1', 'y'=>'2'}],
21
+ [/( \d)(?<y>\d)/x.match(str), { 'y'=>'2'}],
22
+ ].each do |m, x|
23
+ assert_equal( x, m.named_captures )
24
+ end
25
+ end
26
+ def test__matchdata__positional_captures
27
+ str = 'a12b'
28
+ [
29
+ [/( \d)( \d)/x.match(str), { 1 =>'1', 2 =>'2'}],
30
+ [/(?<x>\d)(?<y>\d)/x.match(str), { }],
31
+ [/( \d)(?<y>\d)/x.match(str), { }], # D:
32
+ ].each do |m, x|
33
+ assert_equal( x, m.positional_captures )
34
+ end
35
+ end
36
+ def test__matchdata__positional_captures2
37
+ str = 'a12b'
38
+ [
39
+ [/( \d)( \d)/x.match(str), { 1 =>'1', 2 =>'2'}],
40
+ [/(?<x>\d)(?<y>\d)/x.match(str), { 1 =>'1', 2 =>'2'}],
41
+ [/( \d)(?<y>\d)/x.match(str), { 1 =>'2'}], # ):
42
+ ].each do |m, x|
43
+ assert_equal( x, m.positional_captures(include_names: true) )
44
+ end
45
+ end
46
+ end
47
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Kerwin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-16 00:00:00.000000000 Z
11
+ date: 2016-01-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  == MUG: Matty's Ultimate Gem
@@ -42,6 +42,9 @@ files:
42
42
  - lib/mug/iterator/method.rb
43
43
  - lib/mug/iterator_c.rb
44
44
  - lib/mug/loop-with.rb
45
+ - lib/mug/matchdata.rb
46
+ - lib/mug/matchdata/each.rb
47
+ - lib/mug/matchdata/hash.rb
45
48
  - lib/mug/maybe.rb
46
49
  - lib/mug/negativity.rb
47
50
  - lib/mug/rexproc.rb
@@ -62,6 +65,8 @@ files:
62
65
  - test/test-iterator-for.rb
63
66
  - test/test-iterator-method.rb
64
67
  - test/test-loop-with.rb
68
+ - test/test-matchdata_each.rb
69
+ - test/test-matchdata_hash.rb
65
70
  - test/test-maybe.rb
66
71
  - test/test-negativity.rb
67
72
  - test/test-rexproc.rb
@@ -88,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
93
  version: '0'
89
94
  requirements: []
90
95
  rubyforge_project:
91
- rubygems_version: 2.4.5
96
+ rubygems_version: 2.5.1
92
97
  signing_key:
93
98
  specification_version: 4
94
99
  summary: 'MUG: Matty''s Ultimate Gem'
@@ -96,6 +101,8 @@ test_files:
96
101
  - test/test-clamp.rb
97
102
  - test/test-rexproc.rb
98
103
  - test/test-tau.rb
104
+ - test/test-matchdata_each.rb
105
+ - test/test-matchdata_hash.rb
99
106
  - test/test-array-extend.rb
100
107
  - test/test-iterator-for.rb
101
108
  - test/test-top.rb