elliottcable-stringray 2 → 3
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.
- data/.manifest +5 -2
- data/README.markdown +59 -0
- data/{Rakefile → Rakefile.rb} +47 -24
- data/lib/stringray.rb +147 -51
- data/lib/stringray/core_ext.rb +1 -0
- data/lib/stringray/core_ext/kernel.rb +6 -0
- data/lib/stringray/core_ext/spec/rake/verify_rcov.rb +23 -0
- data/spec/stringray_spec.rb +138 -69
- data/stringray.gemspec +43 -0
- metadata +51 -11
- data/README.mkdn +0 -41
data/.manifest
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
StringRay
|
2
|
+
=========
|
3
|
+
|
4
|
+
**StringRay** exposes a powerful method to split a `String` into an `Array` of
|
5
|
+
words, and further allows you to include `Enumerable`, thus exposing many of the most useful `Array` methods on your `String`s.
|
6
|
+
|
7
|
+
Links
|
8
|
+
-----
|
9
|
+
|
10
|
+
* [source (GitHub)](http://github.com/elliottcable/stringray "GitHub source repository")
|
11
|
+
* [wiki (Google Code)](http://code.google.com/p/stringray/w/list "Google Code wiki")
|
12
|
+
* [issues (Google Code)](http://code.google.com/p/stringray/issues "Google Code issues")
|
13
|
+
* [Gitorious mirror](http://gitorious.org/projects/stringray "Gitorious source repository")
|
14
|
+
* [RubyForge mirror](http://rubyforge.org/projects/stringray/ "RubyForge project")
|
15
|
+
* [repo.or.cz mirror](http://repo.or.cz/w/stringray.git "repo.or.cz source repository")
|
16
|
+
|
17
|
+
|
18
|
+
Usage
|
19
|
+
-----
|
20
|
+
|
21
|
+
class String; include StringRay; end
|
22
|
+
|
23
|
+
"Oi! I'm a string, do something fun with me!".enumerate do |word|
|
24
|
+
p word
|
25
|
+
end
|
26
|
+
|
27
|
+
class String; make_enumerable!; end
|
28
|
+
"Who, what, when, where, why? The questions these are.".map do |word|
|
29
|
+
word << word[0].chr
|
30
|
+
end
|
31
|
+
|
32
|
+
Getting
|
33
|
+
-------
|
34
|
+
|
35
|
+
The authoritative source for this project is available at
|
36
|
+
<http://github.com/elliottcable/stringray>. You can clone your own copy with
|
37
|
+
the following command:
|
38
|
+
|
39
|
+
git clone git://github.com/elliottcable/stringray.git
|
40
|
+
|
41
|
+
If you want to make changes to the codebase, you need to fork your own GitHub
|
42
|
+
repository for said changes. Send a pullrequest to [elliottcable](http://github.com/elliottcable "elliottcable on GitHub")
|
43
|
+
when you've got something ready for the master branch that you think should be
|
44
|
+
merged.
|
45
|
+
|
46
|
+
Requirements
|
47
|
+
------------
|
48
|
+
|
49
|
+
To use StringRay, you need... nothing!
|
50
|
+
|
51
|
+
Contributing
|
52
|
+
------------
|
53
|
+
|
54
|
+
To develop and contribute to StringRay, you need...
|
55
|
+
|
56
|
+
* `gem install rake`
|
57
|
+
* `gem install rspec`
|
58
|
+
* `gem install rcov`
|
59
|
+
* `gem install echoe`
|
data/{Rakefile → Rakefile.rb}
RENAMED
@@ -2,48 +2,42 @@
|
|
2
2
|
require 'stringray'
|
3
3
|
require 'extlib/string' # String#/, because I'm a lazy fuck.
|
4
4
|
require 'rake'
|
5
|
-
require '
|
5
|
+
require 'yard'
|
6
|
+
require 'yard/rake/yardoc_task'
|
6
7
|
require 'spec/rake/spectask'
|
7
8
|
require 'spec/rake/verify_rcov'
|
9
|
+
require 'stringray/core_ext/spec/rake/verify_rcov'
|
8
10
|
|
9
11
|
begin
|
10
12
|
require 'echoe'
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
task :package => :'package:package'
|
15
|
+
task :install => :'package:install'
|
16
|
+
task :manifest => :'package:manifest'
|
17
|
+
namespace :package do
|
18
|
+
Echoe.new('stringray', StringRay::Version) do |g|
|
19
|
+
g.project = 'stringray'
|
15
20
|
g.author = ['elliottcable']
|
16
21
|
g.email = ['StringRay@elliottcable.com']
|
17
22
|
g.summary = 'Combining many of the benefits of Arrays and Strings, StringRay allows you to treat a String as an Array of words in many cases.'
|
18
23
|
g.url = 'http://github.com/elliottcable/stringray'
|
19
24
|
g.dependencies = []
|
25
|
+
g.development_dependencies = ['elliottcable-echoe >= 3.0.2', 'rspec', 'rcov', 'yard']
|
20
26
|
g.manifest_name = '.manifest'
|
21
|
-
g.
|
27
|
+
g.retain_gemspec = true
|
28
|
+
g.rakefile_name = 'Rakefile.rb'
|
29
|
+
g.ignore_pattern = /(^\.git$|^\.yardoc$|^meta\/|\.gemspec$)/
|
22
30
|
end
|
23
31
|
|
24
32
|
desc 'tests packaged files to ensure they are all present'
|
25
33
|
task :verify => :package do
|
26
34
|
# An error message will be displayed if files are missing
|
27
|
-
if system %(ruby -e "require 'rubygems'; require 'pkg/
|
35
|
+
if system %(ruby -e "require 'rubygems'; require 'pkg/stringray-#{StringRay::VERSION}/lib/stringray'")
|
28
36
|
puts "\nThe library files are present"
|
29
37
|
end
|
30
38
|
end
|
31
|
-
|
32
|
-
task :copy_gemspec => [:package] do
|
33
|
-
pkg = Dir['pkg/*'].select {|dir| File.directory? dir}.last
|
34
|
-
mv File.join(pkg, pkg.gsub(/^pkg\//,'').gsub(/\-\d+$/,'.gemspec')), './'
|
35
|
-
end
|
36
|
-
|
37
|
-
desc 'builds a gemspec as GitHub wants it'
|
38
|
-
task :gemspec => [:package, :copy_gemspec, :clobber_package]
|
39
|
-
|
40
|
-
# desc 'Run specs, clean tree, update manifest, run coverage, and install gem!'
|
41
|
-
desc 'Clean tree, update manifest, and install gem!'
|
42
|
-
task :magic => [:clean, :manifest, :install]
|
43
39
|
end
|
44
40
|
|
45
|
-
task :manifest => [:'echoe:manifest']
|
46
|
-
|
47
41
|
rescue LoadError => boom
|
48
42
|
puts "You are missing a dependency required for meta-operations on this gem."
|
49
43
|
puts "#{boom.to_s.capitalize}."
|
@@ -57,6 +51,7 @@ ensure
|
|
57
51
|
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
58
52
|
t.libs = ['lib']
|
59
53
|
t.rcov = true
|
54
|
+
t.rcov_opts = ['--exclude-only', '".*"', '--include-file', '^lib']
|
60
55
|
t.rcov_dir = 'meta' / 'coverage'
|
61
56
|
end
|
62
57
|
|
@@ -70,8 +65,9 @@ ensure
|
|
70
65
|
end
|
71
66
|
|
72
67
|
RCov::VerifyTask.new(:verify) do |t|
|
73
|
-
t.threshold =
|
68
|
+
t.threshold = 98.7
|
74
69
|
t.index_html = 'meta' / 'coverage' / 'index.html'
|
70
|
+
t.require_exact_threshold = false
|
75
71
|
end
|
76
72
|
|
77
73
|
task :open do
|
@@ -79,15 +75,42 @@ ensure
|
|
79
75
|
end
|
80
76
|
end
|
81
77
|
|
78
|
+
namespace :yard do
|
79
|
+
YARD::Rake::YardocTask.new :generate do |t|
|
80
|
+
t.files = ['lib/**/*.rb']
|
81
|
+
t.options = ['--output-dir', "meta/documentation", '--readme', 'README.markdown']
|
82
|
+
end
|
83
|
+
|
84
|
+
YARD::Rake::YardocTask.new :dot_yardoc do |t|
|
85
|
+
t.files = ['lib/**/*.rb']
|
86
|
+
t.options = ['--no-output', '--readme', 'README.markdown']
|
87
|
+
end
|
88
|
+
|
89
|
+
task :open do
|
90
|
+
system 'open ' + 'meta' / 'documentation' / 'index.html' if PLATFORM['darwin']
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
82
94
|
namespace :git do
|
83
95
|
task :status do
|
84
96
|
`git status`
|
85
97
|
end
|
98
|
+
|
99
|
+
task :commit => [:'echoe:manifest', :'yard:dot_yardoc'] do
|
100
|
+
`git commit`
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
task :clobber => [:'echoe:clobber_package', :'echoe:clobber_docs', :'echoe:clobber_coverage'] do
|
105
|
+
rm_f 'meta'
|
86
106
|
end
|
87
107
|
|
88
108
|
desc 'Check everything over before commiting'
|
89
|
-
task :aok => [:'
|
109
|
+
task :aok => [:'yard:generate', :'yard:open',
|
110
|
+
:'package:manifest', :'package:package',
|
111
|
+
:'rcov:run', :'rcov:verify', :'rcov:open',
|
112
|
+
:'git:status']
|
90
113
|
|
91
114
|
# desc 'Task run during continuous integration' # Invisible
|
92
|
-
task :
|
93
|
-
end
|
115
|
+
task :ci => [:'yard:generate', :'rcov:plain', :'rcov:verify']
|
116
|
+
end
|
data/lib/stringray.rb
CHANGED
@@ -1,120 +1,199 @@
|
|
1
|
+
require 'stringray/core_ext'
|
2
|
+
|
1
3
|
module StringRay
|
2
|
-
|
4
|
+
Version = 3
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
6
|
+
@@whitespace = nil
|
7
|
+
@@delemiters = nil
|
8
|
+
|
9
|
+
##
|
10
|
+
# @see #enumerate
|
11
|
+
# Controls how +#enumerate+ deals with whitespace.
|
12
|
+
#
|
13
|
+
# @param [Symbol] whitespace How to handle whitespace - :attach_before,
|
14
|
+
# :standalone, or :attach_after
|
15
|
+
def self.whitespace= whitespace
|
16
|
+
@@whitespace = whitespace
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.whitespace
|
20
|
+
@@whitespace ||= :attach_before
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# @see #enumerate
|
25
|
+
# Controls how +#enumerate+ deals with delemiters.
|
26
|
+
#
|
27
|
+
# @param [Symbol] delemiters How to handle delemiters - :attach_before,
|
28
|
+
# :standalone, or :attach_after
|
29
|
+
def self.delemiters= delemiters
|
30
|
+
@@delemiters = delemiters
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.delemiters
|
34
|
+
@@delemiters ||= :attach_before
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Splits a string into an array of +StringRay+ container objects (+Word+,
|
39
|
+
# +Whitespace+, and +Delimiter+).
|
40
|
+
#
|
41
|
+
# @yield [element] Allows each 'element' of the string to be operated on
|
42
|
+
# after it is processed
|
43
|
+
# @yieldparam [Word, Whitespace, Delimiter] element The last processed
|
44
|
+
# string 'element'
|
45
|
+
# @return [Array[Word, Whitespace, Delimiter]] An array of +StringRay+
|
46
|
+
# container objects
|
47
|
+
# @since 2
|
48
|
+
def to_stray
|
7
49
|
ray = []
|
50
|
+
new_element = lambda do |element|
|
51
|
+
yield ray.last if block_given? unless ray.empty?
|
52
|
+
ray << element
|
53
|
+
end
|
8
54
|
|
9
|
-
self.
|
10
|
-
char = byte.chr
|
11
|
-
|
55
|
+
self.scan(/./um) do |char|
|
12
56
|
if Delimiter::Characters.include? char
|
13
|
-
|
57
|
+
new_element[Delimiter.new(char)]
|
14
58
|
|
15
59
|
elsif Whitespace::Characters.include? char
|
16
60
|
if ray.last.is_a? Whitespace
|
17
61
|
ray.last << char
|
18
62
|
else
|
19
|
-
|
63
|
+
new_element[Whitespace.new(char)]
|
20
64
|
end
|
21
65
|
|
22
66
|
else
|
23
67
|
if ray.last.is_a? Word
|
24
68
|
ray.last << char
|
25
69
|
else
|
26
|
-
|
70
|
+
new_element[Word.new(char)]
|
27
71
|
end
|
28
72
|
|
29
73
|
end
|
30
74
|
end
|
31
75
|
|
32
|
-
|
76
|
+
if block_given?
|
77
|
+
yield ray.last
|
78
|
+
self
|
79
|
+
else
|
80
|
+
ray
|
81
|
+
end
|
33
82
|
end
|
34
83
|
|
35
|
-
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
84
|
+
##
|
85
|
+
# @see #to_stray
|
86
|
+
# @see #whitespace
|
87
|
+
# @see #delemiters
|
88
|
+
# Enumerates a string, similar to +#to_stray+, but returning an array of
|
89
|
+
# plain +String+s instead of container objects.
|
90
|
+
#
|
91
|
+
# @param [Hash] options A hash of options
|
92
|
+
# @yield [word] Allows each word in the string to be operated on after it is
|
93
|
+
# processed
|
94
|
+
# @yieldparam [String] word The last processed word
|
95
|
+
# @return [Array[String]] An array of words
|
96
|
+
# @since 1
|
97
|
+
def enumerate options = {}, &block
|
45
98
|
mapped = []
|
46
99
|
attach_before_next = []
|
47
100
|
|
48
|
-
|
49
|
-
case
|
101
|
+
self.to_stray do |element|
|
102
|
+
case element
|
50
103
|
when Delimiter
|
51
|
-
case
|
104
|
+
case options[:delemiters] || StringRay::delemiters
|
52
105
|
when :standalone
|
53
|
-
mapped << [
|
106
|
+
mapped << [element]
|
54
107
|
when :attach_after
|
55
|
-
attach_before_next <<
|
108
|
+
attach_before_next << element
|
56
109
|
else
|
57
110
|
if attach_before_next.empty?
|
58
111
|
if mapped.last
|
59
|
-
mapped.last <<
|
112
|
+
mapped.last << element
|
60
113
|
else
|
61
|
-
attach_before_next <<
|
114
|
+
attach_before_next << element
|
62
115
|
end
|
63
116
|
else
|
64
|
-
attach_before_next <<
|
117
|
+
attach_before_next << element
|
65
118
|
end
|
66
119
|
end
|
67
120
|
|
68
121
|
when Whitespace
|
69
|
-
case
|
122
|
+
case options[:whitespace] || StringRay::whitespace
|
70
123
|
when :standalone
|
71
|
-
mapped << [
|
124
|
+
mapped << [element]
|
72
125
|
when :attach_after
|
73
|
-
attach_before_next <<
|
126
|
+
attach_before_next << element
|
74
127
|
else
|
75
128
|
if attach_before_next.empty?
|
76
129
|
if mapped.last
|
77
|
-
mapped.last <<
|
130
|
+
mapped.last << element
|
78
131
|
else
|
79
|
-
attach_before_next <<
|
132
|
+
attach_before_next << element
|
80
133
|
end
|
81
134
|
else
|
82
|
-
attach_before_next <<
|
135
|
+
attach_before_next << element
|
83
136
|
end
|
84
137
|
end
|
85
138
|
|
86
139
|
when Word
|
87
140
|
if not attach_before_next.empty?
|
88
|
-
mapped << [attach_before_next,
|
141
|
+
mapped << [attach_before_next, element].flatten
|
89
142
|
attach_before_next = []
|
90
143
|
else
|
91
|
-
mapped << [
|
144
|
+
mapped << [element]
|
92
145
|
end
|
93
146
|
|
94
147
|
end
|
95
148
|
end
|
96
|
-
(mapped.last << attach_before_next).flatten! if not attach_before_next.empty?
|
97
149
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
150
|
+
if not attach_before_next.empty?
|
151
|
+
mapped << [Word.new] unless mapped.last
|
152
|
+
(mapped.last << attach_before_next).flatten!
|
153
|
+
end
|
154
|
+
|
155
|
+
mapped.map do |arr|
|
156
|
+
string = arr.map{|w|w.to_s}.join
|
157
|
+
yield string if block_given?
|
158
|
+
string
|
102
159
|
end
|
103
160
|
end
|
104
161
|
|
162
|
+
# @deprecated
|
163
|
+
alias_method :each_word, :enumerate
|
164
|
+
|
165
|
+
# @see StringRay::Word.new
|
166
|
+
def Word word; Word.new word; end
|
167
|
+
|
168
|
+
##
|
169
|
+
# A wrapper class for strings that are 'words' in and of themselves,
|
170
|
+
# composed of 'word characters'.
|
105
171
|
class Word < String
|
106
172
|
def inspect
|
107
173
|
"(#{self})"
|
108
174
|
end
|
109
175
|
end
|
110
176
|
|
177
|
+
# @see StringRay::Whitespace.new
|
178
|
+
def Whitespace whitespace; Whitespace.new whitespace; end
|
179
|
+
|
180
|
+
##
|
181
|
+
# A wrapper class for strings that are 'whitespace' composed of 'whitespace
|
182
|
+
# characters'.
|
111
183
|
class Whitespace < String
|
112
184
|
Characters = [" ", "\t", "\n"]
|
185
|
+
|
113
186
|
def inspect
|
114
187
|
"#{self}"
|
115
188
|
end
|
116
189
|
end
|
117
190
|
|
191
|
+
# @see StringRay::Delimiter.new
|
192
|
+
def Delimiter delimiter; Delimiter.new delimiter; end
|
193
|
+
|
194
|
+
##
|
195
|
+
# A wrapper class for strings that are 'delimiters' composed of 'delimiter
|
196
|
+
# characters'.
|
118
197
|
class Delimiter < String
|
119
198
|
Characters = ['-', ',', '.', '?', '!', ':', ';', '/', '\\', '|']
|
120
199
|
|
@@ -123,14 +202,31 @@ module StringRay
|
|
123
202
|
end
|
124
203
|
end
|
125
204
|
|
126
|
-
# This
|
127
|
-
# to
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
205
|
+
# This is mixed into any class including +StringRay+. It exposes
|
206
|
+
# +::make_enumerable!+ to said class.
|
207
|
+
module Extendables
|
208
|
+
|
209
|
+
##
|
210
|
+
# This overrides +String#each+ with +StringRay#enumerate+, thus allowing
|
211
|
+
# us to include +Enumerable+. Be careful, this breaks lots of existing
|
212
|
+
# code which depends on the old methodology of +String#each+! The
|
213
|
+
# overridden +String#each+ functionality will be exposed as
|
214
|
+
# +String#each_at+.
|
215
|
+
def make_enumerable!
|
216
|
+
self.class_eval do
|
217
|
+
if RUBY_VERSION <= "1.9"
|
218
|
+
Kernel::warn "overriding String#each with StringRay#enumerate; this may break old libaries!"
|
219
|
+
alias_method :each_at, :each
|
220
|
+
end
|
221
|
+
alias_method :each, :enumerate
|
222
|
+
|
223
|
+
include Enumerable
|
224
|
+
end
|
134
225
|
end
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
def self.included klass
|
230
|
+
klass.send :extend, Extendables
|
135
231
|
end
|
136
|
-
end
|
232
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'stringray/core_ext/kernel'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class RCov::VerifyTask
|
2
|
+
|
3
|
+
# For now, it appears that StringRay's habit of fucking with #each, also
|
4
|
+
# screws with RCov generation. RSpec's verification task's fragile code
|
5
|
+
# doesn't like that... so let's fix it.
|
6
|
+
def define
|
7
|
+
desc "Verify that rcov coverage is at least #{threshold}%"
|
8
|
+
task @name do
|
9
|
+
total_coverage = nil
|
10
|
+
|
11
|
+
File.open(index_html).each_line do |line|
|
12
|
+
if line =~ /<tt\s+class='coverage_total'>\s*(\d+\.\d+)%\s*<\/tt>/
|
13
|
+
total_coverage = $1.to_s.to_f
|
14
|
+
break
|
15
|
+
end
|
16
|
+
end
|
17
|
+
puts "Coverage: #{total_coverage}% (threshold: #{threshold}%)" if verbose
|
18
|
+
raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
|
19
|
+
raise "Coverage has increased above the threshold of #{threshold}% to #{total_coverage}%. You should update your threshold value." if (total_coverage > threshold) and require_exact_threshold
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/spec/stringray_spec.rb
CHANGED
@@ -1,108 +1,177 @@
|
|
1
1
|
($:.unshift File.expand_path(File.join( File.dirname(__FILE__), '..', 'lib' ))).uniq!
|
2
2
|
require 'stringray'
|
3
3
|
|
4
|
+
# Some shortcusts, because the author is a lazy typist...
|
5
|
+
def Word word; StringRay::Word.new word; end
|
6
|
+
def Whitespace whitespace; StringRay::Whitespace.new whitespace; end
|
7
|
+
def Delimiter delimiter; StringRay::Delimiter.new delimiter; end
|
8
|
+
Space = Whitespace ' '
|
9
|
+
Period = Delimiter '.'
|
10
|
+
|
4
11
|
describe 'a String including StringRay' do
|
5
12
|
before :all do
|
6
|
-
String
|
13
|
+
class String
|
14
|
+
include StringRay
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#to_stray" do
|
19
|
+
it "should return a multi-dimensional array of container elements" do
|
20
|
+
string = 'This is a string.'
|
21
|
+
string.to_stray.should ==
|
22
|
+
[Word('This'), Space, Word('is'), Space, Word('a'), Space, Word('string'), Period]
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should yield each text element if passed a block" do
|
26
|
+
string = 'This is a string.'
|
27
|
+
|
28
|
+
yielded = []
|
29
|
+
string.to_stray do |element|
|
30
|
+
yielded << element
|
31
|
+
end
|
32
|
+
|
33
|
+
yielded.should ==
|
34
|
+
[Word('This'), Space, Word('is'), Space, Word('a'), Space, Word('string'), Period]
|
35
|
+
end
|
7
36
|
end
|
8
37
|
|
9
38
|
describe '#enumerate' do
|
10
39
|
it 'should split a string into an array' do
|
11
|
-
string = '
|
12
|
-
|
13
|
-
|
14
|
-
['The ','time ','has ','come ','to ','talk ','of ',
|
15
|
-
'many ','things - ','of ','sailing ','ships ','and ','sealing ',
|
16
|
-
'wax, ','of ','cabbages ','and ','kings!']
|
40
|
+
string = 'This is a string'
|
41
|
+
string.enumerate.should ==
|
42
|
+
['This ','is ','a ','string']
|
17
43
|
end
|
18
44
|
|
19
45
|
it 'should correctly treat commas and lists' do
|
20
|
-
string = '
|
21
|
-
string.
|
22
|
-
['
|
46
|
+
string = 'Commas, commas, commas'
|
47
|
+
string.enumerate.should ==
|
48
|
+
['Commas, ','commas, ','commas']
|
23
49
|
end
|
24
50
|
|
25
|
-
it 'should correctly treat periods and end-of-
|
26
|
-
string = '
|
27
|
-
string.
|
28
|
-
['
|
51
|
+
it 'should correctly treat periods and end-of-sentence demarcators' do
|
52
|
+
string = 'Punctuation. Cool right? Yah!'
|
53
|
+
string.enumerate.should ==
|
54
|
+
['Punctuation. ','Cool ','right? ','Yah!']
|
29
55
|
end
|
30
56
|
|
31
57
|
it 'should correctly treat dahses' do
|
32
|
-
string = 'I have - uh - dashes
|
33
|
-
string.
|
34
|
-
['I ','have - ','uh - ','dashes
|
58
|
+
string = 'I have - uh - dashes'
|
59
|
+
string.enumerate.should ==
|
60
|
+
['I ','have - ','uh - ','dashes']
|
35
61
|
end
|
36
62
|
|
37
63
|
it 'should correctly treat ellipses' do
|
38
|
-
string = 'Where are we... going
|
39
|
-
string.
|
40
|
-
['Where ','are ','we... ','going
|
64
|
+
string = 'Where... are we... going'
|
65
|
+
string.enumerate.should ==
|
66
|
+
['Where... ','are ','we... ','going']
|
41
67
|
end
|
42
68
|
|
43
69
|
it 'should correctly treat a delimated word' do
|
44
|
-
string = '
|
45
|
-
string.
|
46
|
-
['
|
70
|
+
string = 'Pneumono-ultra-microscopic-silico-volcano-koniosis'
|
71
|
+
string.enumerate.should ==
|
72
|
+
['Pneumono-','ultra-','microscopic-','silico-','volcano-','koniosis']
|
47
73
|
end
|
48
74
|
|
49
75
|
it 'should correctly treat inline line returns' do
|
50
|
-
string = "
|
51
|
-
string.
|
52
|
-
["
|
76
|
+
string = "Line\nreturns\nyay"
|
77
|
+
string.enumerate.should ==
|
78
|
+
["Line\n","returns\n","yay"]
|
53
79
|
end
|
54
80
|
|
55
81
|
it 'should correctly treat prefacing line returns and whitespace' do
|
56
|
-
string = "\n
|
57
|
-
string.
|
58
|
-
["\n
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe '#each_word' do
|
63
|
-
it 'should be able to attach delimeters to the beginning of the next word' do
|
64
|
-
string = 'The time has come to talk of many things - of sailing ' +
|
65
|
-
'ships and sealing wax, of cabbages and kings!'
|
66
|
-
array = []
|
67
|
-
string.each(:delemiters => :attach_after) {|i| array << i }
|
68
|
-
array.should == ['The ','time ','has ','come ','to ','talk ','of ',
|
69
|
-
'many ','things ','- of ','sailing ','ships ','and ','sealing ',
|
70
|
-
'wax',', of ','cabbages ','and ','kings!']
|
82
|
+
string = "\n\t # Code\n\n"
|
83
|
+
string.enumerate.should ==
|
84
|
+
["\n\t # ","Code\n\n"]
|
71
85
|
end
|
72
86
|
|
73
|
-
|
74
|
-
|
75
|
-
'
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
87
|
+
describe '(method options hash)' do
|
88
|
+
it 'should be able to attach delimeters to the beginning of the next word' do
|
89
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
90
|
+
'ships and sealing wax, of cabbages and kings!'
|
91
|
+
string.enumerate(:delemiters => :attach_after).should ==
|
92
|
+
['The ','time ','has ','come ','to ','talk ','of ',
|
93
|
+
'many ','things ','- of ','sailing ','ships ','and ','sealing ',
|
94
|
+
'wax',', of ','cabbages ','and ','kings!']
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should be able to let delimeters stand alone' do
|
98
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
99
|
+
'ships and sealing wax, of cabbages and kings!'
|
100
|
+
string.enumerate(:delemiters => :standalone).should ==
|
101
|
+
['The ','time ','has ','come ','to ','talk ','of ',
|
102
|
+
'many ','things ','- ', 'of ','sailing ','ships ','and ','sealing ',
|
103
|
+
'wax',', ','of ','cabbages ','and ','kings','!']
|
104
|
+
end
|
82
105
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
106
|
+
it 'should be able to attach whitespace to the beginning of the next word' do
|
107
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
108
|
+
'ships and sealing wax, of cabbages and kings!'
|
109
|
+
string.enumerate(:whitespace => :attach_after).should ==
|
110
|
+
['The',' time',' has',' come',' to',' talk',' of',
|
111
|
+
' many',' things',' - of',' sailing',' ships',' and',' sealing',
|
112
|
+
' wax,',' of',' cabbages',' and',' kings!']
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should be able to let whitespace stand alone' do
|
116
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
117
|
+
'ships and sealing wax, of cabbages and kings!'
|
118
|
+
string.enumerate(:whitespace => :standalone).should ==
|
119
|
+
['The',' ','time',' ','has',' ','come',' ','to',' ','talk',' ','of',
|
120
|
+
' ','many',' ','things',' -',' ','of',' ','sailing',' ','ships',' ','and',' ','sealing',
|
121
|
+
' ','wax,',' ','of',' ','cabbages',' ','and',' ','kings!']
|
122
|
+
end
|
91
123
|
end
|
92
124
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
125
|
+
describe '(class setter methods)' do
|
126
|
+
before :each do
|
127
|
+
StringRay::whitespace = nil
|
128
|
+
StringRay::delemiters = nil
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should allow delemiter handling to be set through a class method' do
|
132
|
+
StringRay::whitespace = :attach_after
|
133
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
134
|
+
'ships and sealing wax, of cabbages and kings!'
|
135
|
+
string.enumerate.should ==
|
136
|
+
['The',' time',' has',' come',' to',' talk',' of',
|
137
|
+
' many',' things',' - of',' sailing',' ships',' and',' sealing',
|
138
|
+
' wax,',' of',' cabbages',' and',' kings!']
|
139
|
+
|
140
|
+
StringRay::whitespace = :standalone
|
141
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
142
|
+
'ships and sealing wax, of cabbages and kings!'
|
143
|
+
string.enumerate.should ==
|
144
|
+
['The',' ','time',' ','has',' ','come',' ','to',' ','talk',' ','of',
|
145
|
+
' ','many',' ','things',' -',' ','of',' ','sailing',' ','ships',' ','and',' ','sealing',
|
146
|
+
' ','wax,',' ','of',' ','cabbages',' ','and',' ','kings!']
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should allow whitespace handling to be set through a class method' do
|
150
|
+
StringRay::whitespace = :attach_after
|
151
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
152
|
+
'ships and sealing wax, of cabbages and kings!'
|
153
|
+
string.enumerate.should ==
|
154
|
+
['The',' time',' has',' come',' to',' talk',' of',
|
155
|
+
' many',' things',' - of',' sailing',' ships',' and',' sealing',
|
156
|
+
' wax,',' of',' cabbages',' and',' kings!']
|
157
|
+
|
158
|
+
StringRay::whitespace = :standalone
|
159
|
+
string = 'The time has come to talk of many things - of sailing ' +
|
160
|
+
'ships and sealing wax, of cabbages and kings!'
|
161
|
+
string.enumerate.should ==
|
162
|
+
['The',' ','time',' ','has',' ','come',' ','to',' ','talk',' ','of',
|
163
|
+
' ','many',' ','things',' -',' ','of',' ','sailing',' ','ships',' ','and',' ','sealing',
|
164
|
+
' ','wax,',' ','of',' ','cabbages',' ','and',' ','kings!']
|
165
|
+
end
|
101
166
|
end
|
102
167
|
end
|
103
168
|
|
104
|
-
|
105
|
-
|
106
|
-
|
169
|
+
it 'should be capable of making String enumerable' do
|
170
|
+
class ExtendedString < String
|
171
|
+
include StringRay
|
172
|
+
make_enumerable!
|
173
|
+
end
|
174
|
+
|
175
|
+
ExtendedString.ancestors.should be_include(Enumerable)
|
107
176
|
end
|
108
177
|
end
|
data/stringray.gemspec
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{stringray}
|
5
|
+
s.version = "3"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["elliottcable"]
|
9
|
+
s.date = %q{2009-06-11}
|
10
|
+
s.description = %q{Combining many of the benefits of Arrays and Strings, StringRay allows you to treat a String as an Array of words in many cases.}
|
11
|
+
s.email = ["StringRay@elliottcable.com"]
|
12
|
+
s.extra_rdoc_files = ["lib/stringray.rb", "lib/stringray/core_ext.rb", "lib/stringray/core_ext/kernel.rb", "lib/stringray/core_ext/spec/rake/verify_rcov.rb", "README.markdown"]
|
13
|
+
s.files = ["lib/stringray.rb", "lib/stringray/core_ext.rb", "lib/stringray/core_ext/kernel.rb", "lib/stringray/core_ext/spec/rake/verify_rcov.rb", "spec/stringray_spec.rb", "README.markdown", "Rakefile.rb", ".manifest", "stringray.gemspec"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/elliottcable/stringray}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Stringray", "--main", "README.markdown"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{stringray}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Combining many of the benefits of Arrays and Strings, StringRay allows you to treat a String as an Array of words in many cases.}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_development_dependency(%q<elliottcable-echoe>, [">= 0", "= 3.0.2"])
|
28
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<elliottcable-echoe>, [">= 0", "= 3.0.2"])
|
33
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
34
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
35
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
s.add_dependency(%q<elliottcable-echoe>, [">= 0", "= 3.0.2"])
|
39
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
40
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
41
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
42
|
+
end
|
43
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,52 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elliottcable-stringray
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "
|
4
|
+
version: "3"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- elliottcable
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-11 00:00:00 -07:00
|
12
13
|
default_executable:
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: echoe
|
16
|
+
name: elliottcable-echoe
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
- - "="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.2
|
27
|
+
version:
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rspec
|
30
|
+
type: :development
|
31
|
+
version_requirement:
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: "0"
|
37
|
+
version:
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rcov
|
40
|
+
type: :development
|
41
|
+
version_requirement:
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: yard
|
16
50
|
type: :development
|
17
51
|
version_requirement:
|
18
52
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -30,14 +64,20 @@ extensions: []
|
|
30
64
|
|
31
65
|
extra_rdoc_files:
|
32
66
|
- lib/stringray.rb
|
33
|
-
-
|
67
|
+
- lib/stringray/core_ext.rb
|
68
|
+
- lib/stringray/core_ext/kernel.rb
|
69
|
+
- lib/stringray/core_ext/spec/rake/verify_rcov.rb
|
70
|
+
- README.markdown
|
34
71
|
files:
|
35
72
|
- lib/stringray.rb
|
36
|
-
-
|
37
|
-
-
|
73
|
+
- lib/stringray/core_ext.rb
|
74
|
+
- lib/stringray/core_ext/kernel.rb
|
75
|
+
- lib/stringray/core_ext/spec/rake/verify_rcov.rb
|
38
76
|
- spec/stringray_spec.rb
|
77
|
+
- README.markdown
|
78
|
+
- Rakefile.rb
|
39
79
|
- .manifest
|
40
|
-
-
|
80
|
+
- stringray.gemspec
|
41
81
|
has_rdoc: true
|
42
82
|
homepage: http://github.com/elliottcable/stringray
|
43
83
|
post_install_message:
|
@@ -45,9 +85,9 @@ rdoc_options:
|
|
45
85
|
- --line-numbers
|
46
86
|
- --inline-source
|
47
87
|
- --title
|
48
|
-
-
|
88
|
+
- Stringray
|
49
89
|
- --main
|
50
|
-
- README.
|
90
|
+
- README.markdown
|
51
91
|
require_paths:
|
52
92
|
- lib
|
53
93
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -58,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
98
|
version:
|
59
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
100
|
requirements:
|
61
|
-
- - "
|
101
|
+
- - ">="
|
62
102
|
- !ruby/object:Gem::Version
|
63
103
|
version: "1.2"
|
64
104
|
version:
|
data/README.mkdn
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
StringRay
|
2
|
-
=========
|
3
|
-
|
4
|
-
**StringRay** exposes a powerful method to split a `String` into an `Array` of words,
|
5
|
-
and further allows you to include `Enumerable`, thus exposing many of the
|
6
|
-
most useful `Array` methods on your `String`s.
|
7
|
-
|
8
|
-
Usage
|
9
|
-
-----
|
10
|
-
|
11
|
-
class String; include StringRay; end
|
12
|
-
|
13
|
-
"Oi! I'm a string, do something fun with me!".each do |word|
|
14
|
-
p word
|
15
|
-
end
|
16
|
-
|
17
|
-
Getting
|
18
|
-
-------
|
19
|
-
|
20
|
-
The authoritative source for this project is available at
|
21
|
-
<http://github.com/elliottcable/stringray>. You can clone your own copy with the
|
22
|
-
following command:
|
23
|
-
|
24
|
-
git clone git://github.com/elliottcable/stringray.git
|
25
|
-
|
26
|
-
If you want to make changes to the codebase, you need to fork your own GitHub
|
27
|
-
repository for said changes. Send a pullrequest to [elliottcable](http://github.com/elliottcable "elliottcable on GitHub")
|
28
|
-
when you've got something ready for the master branch that you think should be
|
29
|
-
merged.
|
30
|
-
|
31
|
-
Requirements
|
32
|
-
------------
|
33
|
-
|
34
|
-
To run git-blog, you need... nothing!
|
35
|
-
|
36
|
-
To develop and contribute to git-blog, you also need:
|
37
|
-
|
38
|
-
* `gem install rake`
|
39
|
-
* `gem install rspec`
|
40
|
-
* `gem install rcov`
|
41
|
-
* `gem install echoe`
|