quality_extensions 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/quality_extensions/enumerable/grep_indexes.rb +66 -0
- data/lib/quality_extensions/enumerable/grep_plus_offset.rb +81 -0
- data/lib/quality_extensions/enumerable/select_while.rb +66 -1
- data/lib/quality_extensions/symbol/match.rb +3 -5
- data/lib/quality_extensions/version.rb +1 -1
- metadata +21 -30
@@ -0,0 +1,66 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2012, Tyler Rick
|
4
|
+
# License:: Ruby License
|
5
|
+
# Submit to Facets?:: Yes
|
6
|
+
# Developer notes::
|
7
|
+
# History::
|
8
|
+
#++
|
9
|
+
|
10
|
+
|
11
|
+
module Enumerable
|
12
|
+
# Returns the indexes of the elements that match +regexp+.
|
13
|
+
#
|
14
|
+
# %w[a ab abc].grep_indexes(/a$/) => [0]
|
15
|
+
# %w[a ab abc].grep_indexes(/b/) => [1, 2]
|
16
|
+
#
|
17
|
+
def grep_indexes(regexp)
|
18
|
+
indexes = []
|
19
|
+
each_with_index {|el, i|
|
20
|
+
indexes << i if el =~ regexp
|
21
|
+
}
|
22
|
+
indexes
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# _____ _
|
27
|
+
# |_ _|__ ___| |_
|
28
|
+
# | |/ _ \/ __| __|
|
29
|
+
# | | __/\__ \ |_
|
30
|
+
# |_|\___||___/\__|
|
31
|
+
#
|
32
|
+
=begin test
|
33
|
+
require 'rspec/autorun'
|
34
|
+
|
35
|
+
describe 'Enumerable#grep_indexes' do
|
36
|
+
|
37
|
+
describe %w[a ab abc] do
|
38
|
+
it { subject.grep_indexes(/a$/).should == [0 ] }
|
39
|
+
it { subject.grep_indexes(/a/). should == [0, 1, 2] }
|
40
|
+
it { subject.grep_indexes(/b/). should == [ 1, 2] }
|
41
|
+
it { subject.grep_indexes(/c/). should == [ 2] }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe [
|
45
|
+
"gems/ruby-debug-base19x-0.11.30.pre10/lib/ruby-debug-base.rb:55:in `at_line'",
|
46
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:52:in `rescue in synchronize'",
|
47
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:44:in `synchronize'",
|
48
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/finders.rb:29:in `find'",
|
49
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/element.rb:177:in `block in find'",
|
50
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:45:in `synchronize'",
|
51
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/element.rb:177:in `find'",
|
52
|
+
"features/step_definitions/web_steps.rb:163:in `select'",
|
53
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/session.rb:291:in `select'",
|
54
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/dsl.rb:43:in `select'",
|
55
|
+
"features/step_definitions/javascript_steps.rb:87:in `block (2 levels) in <top (required)>'",
|
56
|
+
] do
|
57
|
+
it do
|
58
|
+
subject.grep(/in `synchronize'/).should == [
|
59
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:44:in `synchronize'",
|
60
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:45:in `synchronize'",
|
61
|
+
]
|
62
|
+
end
|
63
|
+
it { subject.grep_indexes(/in `synchronize'/).should == [2, 5] }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
=end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2012, Tyler Rick
|
4
|
+
# License:: Ruby License
|
5
|
+
# Submit to Facets?:: Yes
|
6
|
+
# Developer notes::
|
7
|
+
# History::
|
8
|
+
#++
|
9
|
+
|
10
|
+
|
11
|
+
require 'facets/enumerable/map_send'
|
12
|
+
require 'facets/kernel/require_relative'
|
13
|
+
require_relative 'grep_indexes'
|
14
|
+
|
15
|
+
module Enumerable
|
16
|
+
# For each element that matches +regexp+ return the element that is +offset+ elements forward.
|
17
|
+
#
|
18
|
+
# Examples:
|
19
|
+
#
|
20
|
+
# %w[1 2 3].grep_plus_offset(/1/, -1) => [nil]
|
21
|
+
# %w[1 2 3].grep_plus_offset(/1/, 0) => ['1']
|
22
|
+
# %w[1 2 3].grep_plus_offset(/1/, 1) => ['2']
|
23
|
+
# %w[1 2 3].grep_plus_offset(/1/, 2) => ['3']
|
24
|
+
# %w[1 2 3].grep_plus_offset(/1/, 3) => [nil]
|
25
|
+
#
|
26
|
+
# caller(0).grep_plus_offset(/in `synchronize'/, 1) => the line that *called* synchronize
|
27
|
+
#
|
28
|
+
def grep_plus_offset(regexp, offset, wrap_around = false)
|
29
|
+
indexes = grep_indexes(regexp).map_send(:+, offset)
|
30
|
+
# If any indexes are negative, replace with (maximum index + 1) so that values_at will return
|
31
|
+
# nil for that element (instead of returning an element from the end -- values_at(-1) returns
|
32
|
+
# the last element, for example), the same as how providing a positive that results in an offset
|
33
|
+
# > maximum_index (length - 1) results in a nil being returned for that index.
|
34
|
+
indexes.map! {|_| _ < 0 ? length : _ } unless wrap_around
|
35
|
+
values_at *indexes
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
# _____ _
|
41
|
+
# |_ _|__ ___| |_
|
42
|
+
# | |/ _ \/ __| __|
|
43
|
+
# | | __/\__ \ |_
|
44
|
+
# |_|\___||___/\__|
|
45
|
+
#
|
46
|
+
=begin test
|
47
|
+
require 'rspec/autorun'
|
48
|
+
|
49
|
+
describe 'Enumerable#grep_indexes' do
|
50
|
+
|
51
|
+
describe %w[1 2 3] do
|
52
|
+
it { subject.grep_plus_offset(/1/, -1, true).should == ['3'] }
|
53
|
+
it { subject.grep_plus_offset(/1/, -1).should == [nil] }
|
54
|
+
it { subject.grep_plus_offset(/1/, 0).should == ['1'] }
|
55
|
+
it { subject.grep_plus_offset(/1/, 1).should == ['2'] }
|
56
|
+
it { subject.grep_plus_offset(/1/, 2).should == ['3'] }
|
57
|
+
it { subject.grep_plus_offset(/1/, 3).should == [nil] }
|
58
|
+
end
|
59
|
+
|
60
|
+
describe [
|
61
|
+
"gems/ruby-debug-base19x-0.11.30.pre10/lib/ruby-debug-base.rb:55:in `at_line'",
|
62
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:52:in `rescue in synchronize'",
|
63
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:44:in `synchronize'",
|
64
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/finders.rb:29:in `find'",
|
65
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/element.rb:177:in `block in find'",
|
66
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/base.rb:45:in `synchronize'",
|
67
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/element.rb:177:in `find'",
|
68
|
+
"features/step_definitions/web_steps.rb:163:in `select'",
|
69
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/session.rb:291:in `select'",
|
70
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/dsl.rb:43:in `select'",
|
71
|
+
"features/step_definitions/javascript_steps.rb:87:in `block (2 levels) in <top (required)>'",
|
72
|
+
] do
|
73
|
+
it do
|
74
|
+
subject.grep_plus_offset(/in `synchronize'/, 1).should == [
|
75
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/finders.rb:29:in `find'",
|
76
|
+
"bundler/gems/capybara-555008c74751/lib/capybara/node/element.rb:177:in `find'",
|
77
|
+
]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
=end
|
@@ -203,6 +203,40 @@ module Enumerable
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
end
|
206
|
+
|
207
|
+
|
208
|
+
# Returns all elements of +enum+ starting at the first element for which +block+ is truthy, and continuing until the end.
|
209
|
+
#
|
210
|
+
# Examples:
|
211
|
+
#
|
212
|
+
# (0..3).select_from {|v| v == 1} # => [1, 2, 3]
|
213
|
+
# (0..3).select_from(false) {|v| v == 1} # => [2, 3]
|
214
|
+
#
|
215
|
+
# {'a'=>1, 'b'=>2, 'c'=>3, 'd'=>1}.select_from {|k, v| v == 2} ) # => {"b"=>2, "c"=>3, "d"=>1}
|
216
|
+
# {'a'=>1, 'b'=>2, 'c'=>3, 'd'=>1}.select_from(false) {|k, v| v == 2} ) # => {"c"=>3, "d"=>1}
|
217
|
+
#
|
218
|
+
# Compare to Array#from in ActiveSupport.
|
219
|
+
# (maybe should rename to #from?)
|
220
|
+
#
|
221
|
+
def select_from(inclusive = true)
|
222
|
+
return self unless block_given?
|
223
|
+
|
224
|
+
selecting = false
|
225
|
+
select do |*args|
|
226
|
+
# Once we hit the first truthy result, selecting will be true to the end
|
227
|
+
select_this_el = !!yield(*args)
|
228
|
+
this_is_first_true = !selecting && select_this_el
|
229
|
+
selecting = selecting || select_this_el
|
230
|
+
if inclusive
|
231
|
+
selecting
|
232
|
+
else
|
233
|
+
selecting && !this_is_first_true
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
alias_method :select_all_starting_with, :select_from
|
238
|
+
alias_method :reject_until, :select_from
|
239
|
+
|
206
240
|
end
|
207
241
|
|
208
242
|
|
@@ -394,6 +428,37 @@ class SelectUntilLastTest < Test::Unit::TestCase
|
|
394
428
|
end
|
395
429
|
|
396
430
|
end
|
397
|
-
=end
|
398
431
|
|
432
|
+
class SelectFromTest < Test::Unit::TestCase
|
433
|
+
def test_simplest_case
|
434
|
+
assert_equal [1], [1].select_from {|v| v == 1}
|
435
|
+
assert_equal [], [1].select_from(false) {|v| v == 1} # if exclusive, we won't even return the one and only element
|
436
|
+
end
|
399
437
|
|
438
|
+
# So basic we could have just used select {|v| v >= 2}
|
439
|
+
def test_basic_usage
|
440
|
+
assert_equal [2, 3, 4], [1, 2, 3, 4].select_from {|v| v == 2}
|
441
|
+
assert_equal [ 3, 4], [1, 2, 3, 4].select_from(false) {|v| v == 2}
|
442
|
+
end
|
443
|
+
|
444
|
+
def test_with_duplicate_values
|
445
|
+
assert_equal [2, 1, 2], [1, 2, 1, 2].select_from {|v| v == 2}
|
446
|
+
assert_equal [ 1, 2], [1, 2, 1, 2].select_from(false) {|v| v == 2}
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
# This was an idea -- probably a bad idea...
|
451
|
+
#class SelectFromUntilTest < Test::Unit::TestCase
|
452
|
+
# def test_simplest_case
|
453
|
+
# assert_equal [1], [1].select_from_until {|v| v == 1, v == 1}
|
454
|
+
# assert_equal [], [1].select_from_until(false) {|v| v == 1, v == 1} # if exclusive, we won't even return the one and only element
|
455
|
+
# end
|
456
|
+
#
|
457
|
+
# def test_basic_usage
|
458
|
+
# # So basic we could have just used:
|
459
|
+
# assert_equal [2, 3, 4], [1, 2, 3, 4].select {|v| (2..4).include? v}
|
460
|
+
# assert_equal [2, 3, 4], [1, 2, 3, 4].select_from_until {|v| v == 2, v == 4}
|
461
|
+
# assert_equal [ 3, 4], [1, 2, 3, 4].select_from_until(false) {|v| v == 2, v == 4}
|
462
|
+
# end
|
463
|
+
#end
|
464
|
+
=end
|
@@ -11,11 +11,9 @@ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
|
11
11
|
require 'rubygems'
|
12
12
|
require 'facets/module/alias_method_chain'
|
13
13
|
|
14
|
-
unless
|
14
|
+
unless :a =~ /a/
|
15
15
|
|
16
16
|
class Symbol
|
17
|
-
HasSymbolSupport = true
|
18
|
-
|
19
17
|
def match(regexp)
|
20
18
|
to_s.match(regexp)
|
21
19
|
end
|
@@ -92,10 +90,10 @@ module Enumerable
|
|
92
90
|
}.grep_without_regexp_support_for_symbols(pattern, &block)
|
93
91
|
end
|
94
92
|
alias_method_chain :grep, :regexp_support_for_symbols
|
95
|
-
|
93
|
+
|
96
94
|
end
|
97
95
|
|
98
|
-
end # unless
|
96
|
+
end # unless :a =~ /a/
|
99
97
|
|
100
98
|
# _____ _
|
101
99
|
# |_ _|__ ___| |_
|
metadata
CHANGED
@@ -1,30 +1,24 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: quality_extensions
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.1
|
4
5
|
prerelease:
|
5
|
-
version: 1.3.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Tyler Rick
|
9
9
|
- and others
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
date: 2011-02-13 00:00:00 -08:00
|
15
|
-
default_executable:
|
13
|
+
date: 2012-06-08 00:00:00.000000000 Z
|
16
14
|
dependencies: []
|
17
|
-
|
18
15
|
description: A collection of reusable Ruby methods which are not (yet) in Facets.
|
19
|
-
email:
|
16
|
+
email:
|
20
17
|
- github.com@tylerrick.com
|
21
18
|
executables: []
|
22
|
-
|
23
19
|
extensions: []
|
24
|
-
|
25
20
|
extra_rdoc_files: []
|
26
|
-
|
27
|
-
files:
|
21
|
+
files:
|
28
22
|
- .gitignore
|
29
23
|
- Gemfile
|
30
24
|
- License
|
@@ -154,6 +148,8 @@ files:
|
|
154
148
|
- lib/quality_extensions/dir/each_child.rb
|
155
149
|
- lib/quality_extensions/enumerable/all_same.rb
|
156
150
|
- lib/quality_extensions/enumerable/every.rb
|
151
|
+
- lib/quality_extensions/enumerable/grep_indexes.rb
|
152
|
+
- lib/quality_extensions/enumerable/grep_plus_offset.rb
|
157
153
|
- lib/quality_extensions/enumerable/grep_with_index.rb
|
158
154
|
- lib/quality_extensions/enumerable/grepv.rb
|
159
155
|
- lib/quality_extensions/enumerable/group_by_and_map.rb
|
@@ -281,33 +277,28 @@ files:
|
|
281
277
|
- lib/quality_extensions/version.rb
|
282
278
|
- quality_extensions.gemspec
|
283
279
|
- test/all.rb
|
284
|
-
has_rdoc: true
|
285
280
|
homepage: http://github.com/TylerRick/quality_extensions
|
286
281
|
licenses: []
|
287
|
-
|
288
282
|
post_install_message:
|
289
283
|
rdoc_options: []
|
290
|
-
|
291
|
-
require_paths:
|
284
|
+
require_paths:
|
292
285
|
- lib
|
293
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
286
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
294
287
|
none: false
|
295
|
-
requirements:
|
296
|
-
- -
|
297
|
-
- !ruby/object:Gem::Version
|
298
|
-
version:
|
299
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
288
|
+
requirements:
|
289
|
+
- - ! '>='
|
290
|
+
- !ruby/object:Gem::Version
|
291
|
+
version: '0'
|
292
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
300
293
|
none: false
|
301
|
-
requirements:
|
302
|
-
- -
|
303
|
-
- !ruby/object:Gem::Version
|
304
|
-
version:
|
294
|
+
requirements:
|
295
|
+
- - ! '>='
|
296
|
+
- !ruby/object:Gem::Version
|
297
|
+
version: '0'
|
305
298
|
requirements: []
|
306
|
-
|
307
299
|
rubyforge_project: quality_extensions
|
308
|
-
rubygems_version: 1.
|
300
|
+
rubygems_version: 1.8.15
|
309
301
|
signing_key:
|
310
302
|
specification_version: 3
|
311
303
|
summary: A collection of reusable Ruby methods which are not (yet) in Facets.
|
312
304
|
test_files: []
|
313
|
-
|