poefy 0.5.1
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 +7 -0
- data/.gitignore +74 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/LICENSE +13 -0
- data/README.md +522 -0
- data/Rakefile +6 -0
- data/bin/poefy +205 -0
- data/data/emily_dickinson.txt +9942 -0
- data/data/english_as_she_is_spoke.txt +647 -0
- data/data/shakespeare_sonnets.txt +2618 -0
- data/data/spec_test_tiny.txt +12 -0
- data/data/st_therese_of_lisieux.txt +3700 -0
- data/data/whitman_leaves.txt +17815 -0
- data/lib/poefy/conditional_satisfaction.rb +208 -0
- data/lib/poefy/database.rb +252 -0
- data/lib/poefy/generation.rb +268 -0
- data/lib/poefy/handle_error.rb +27 -0
- data/lib/poefy/poefy_gen_base.rb +124 -0
- data/lib/poefy/poetic_forms.rb +330 -0
- data/lib/poefy/self.rb +21 -0
- data/lib/poefy/string_manipulation.rb +81 -0
- data/lib/poefy/version.rb +29 -0
- data/lib/poefy.rb +49 -0
- data/poefy.gemspec +33 -0
- data/spec/poefy_spec.rb +464 -0
- data/spec/spec_helper.rb +9 -0
- metadata +175 -0
data/spec/poefy_spec.rb
ADDED
@@ -0,0 +1,464 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Encoding: UTF-8
|
3
|
+
|
4
|
+
################################################################################
|
5
|
+
|
6
|
+
describe Poefy::PoefyGen do
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
@root = File.expand_path('../../', __FILE__)
|
10
|
+
end
|
11
|
+
after(:all) do
|
12
|
+
db_file = "#{@root}/data/spec_test_tiny.db"
|
13
|
+
File.delete(db_file) if File.exists?(db_file)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "using tiny dataset spec_test_tiny.db / spec_test_tiny.txt" do
|
17
|
+
|
18
|
+
file_txt = "spec_test_tiny.txt"
|
19
|
+
file_db = "spec_test_tiny.db"
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
@poefy = Poefy::PoefyGen.new(file_db, { proper: false })
|
23
|
+
end
|
24
|
+
after(:each) do
|
25
|
+
@poefy.close
|
26
|
+
end
|
27
|
+
it "initialised object not nil" do
|
28
|
+
expect(@poefy).to_not be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#make_database( '#{@root}/data/#{file_txt}', true )" do
|
32
|
+
it "should make the database '#{@root}/data/#{file_db}" do
|
33
|
+
db_file = "#{@root}/data/#{file_db}"
|
34
|
+
File.delete(db_file) if File.exists?(db_file)
|
35
|
+
@poefy.make_database "#{@root}/data/#{file_txt}", true
|
36
|
+
expect(@poefy.db.exists?).to be true
|
37
|
+
expect(File.exists?(db_file)).to be true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe ":rhyme option" do
|
42
|
+
|
43
|
+
describe "should return nil" do
|
44
|
+
it "({ })" do
|
45
|
+
poem = @poefy.poem
|
46
|
+
expect(poem).to be_nil
|
47
|
+
end
|
48
|
+
it "({ rhyme: nil })" do
|
49
|
+
poem = @poefy.poem ({ rhyme: nil })
|
50
|
+
expect(poem).to be_nil
|
51
|
+
end
|
52
|
+
it "({ rhyme: ' ' })" do
|
53
|
+
poem = @poefy.poem ({ rhyme: ' ' })
|
54
|
+
expect(poem).to be_nil
|
55
|
+
end
|
56
|
+
it "({ rhyme: '' })" do
|
57
|
+
poem = @poefy.poem ({ rhyme: '' })
|
58
|
+
expect(poem).to be_nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "should return correct number of lines" do
|
63
|
+
rhymes = %w{a b z A aa ab zz AA AB AA1 A1 B1 Z1 AB1 A1A1A1A1B1B1B1B1B1}
|
64
|
+
rhymes += ['A1A1A1 A1A1A1 B1B1B1B1B1B1','a b c a b c']
|
65
|
+
rhymes += [' abc','abc ',' abc ']
|
66
|
+
rhymes += ['n aaa n','n aXXXa N1']
|
67
|
+
rhymes.each do |i|
|
68
|
+
it "({ rhyme: '#{i}' })" do
|
69
|
+
poem = @poefy.poem ({ rhyme: i })
|
70
|
+
expect(poem.count).to be i.gsub(/[0-9]/,'').length
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "should accept characters other than number" do
|
76
|
+
rhymes = %w{. , : .. ., ,, :: (()) @ ~ <<>< A1A1A1...a;}
|
77
|
+
rhymes.each do |i|
|
78
|
+
it "({ rhyme: '#{i}' })" do
|
79
|
+
poem = @poefy.poem ({ rhyme: i })
|
80
|
+
expect(poem.count).to be i.gsub(/[0-9]/,'').length
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "should be nil if can't parse rhyme string" do
|
86
|
+
rhymes = %w{a1 b1 ab1 Ab1 AAAAABb1 1 1111 1122 11221 ;;::1. }
|
87
|
+
rhymes += ['AA Bb1','11 11','11 1 1','..1.']
|
88
|
+
rhymes.each do |i|
|
89
|
+
it "({ rhyme: '#{i}' })" do
|
90
|
+
poem = @poefy.poem ({ rhyme: i })
|
91
|
+
expect(poem).to be_nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "should be nil if can't complete rhyme string" do
|
97
|
+
rhymes = %w{aaaaaa abcd aaaaabbbbb}
|
98
|
+
rhymes.each do |i|
|
99
|
+
it "({ rhyme: '#{i}' })" do
|
100
|
+
poem = @poefy.poem ({ rhyme: i })
|
101
|
+
expect(poem).to be_nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "should correctly repeat uppercase lines" do
|
107
|
+
lines = 200
|
108
|
+
it "({ rhyme: 'A' * #{lines} })" do
|
109
|
+
poem = @poefy.poem ({ rhyme: 'A' * lines })
|
110
|
+
expect(poem.count).to be lines
|
111
|
+
expect(poem.uniq.count).to be 1
|
112
|
+
end
|
113
|
+
it "({ rhyme: ('A'..'C').to_a.map { |i| i * #{lines} }.join })" do
|
114
|
+
rhyme = ('A'..'C').to_a.map { |i| i * lines }.join
|
115
|
+
poem = @poefy.poem ({ rhyme: rhyme })
|
116
|
+
expect(poem.count).to be lines * 3
|
117
|
+
expect(poem.uniq.count).to be 3
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "should be nil if can't complete repeating rhyme string" do
|
122
|
+
lines = 200
|
123
|
+
it "({ rhyme: ('A'..'D').to_a.map { |i| i * #{lines} }.join })" do
|
124
|
+
rhyme = ('A'..'D').to_a.map { |i| i * lines }.join
|
125
|
+
poem = @poefy.poem ({ rhyme: rhyme })
|
126
|
+
expect(poem).to be_nil
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
describe ":form option" do
|
133
|
+
|
134
|
+
describe "should return correct number of lines" do
|
135
|
+
it "({ form: :default })" do
|
136
|
+
poem = @poefy.poem ({ form: :default })
|
137
|
+
expect(poem.count).to be 1
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "should be nil if given a named form it can't fulfil" do
|
142
|
+
it "({ form: 'sonnet' })" do
|
143
|
+
poem = @poefy.poem ({ form: 'sonnet' })
|
144
|
+
expect(poem).to be_nil
|
145
|
+
end
|
146
|
+
it "({ form: :villanelle })" do
|
147
|
+
poem = @poefy.poem ({ form: :villanelle })
|
148
|
+
expect(poem).to be_nil
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "should be nil if given a junk named form" do
|
153
|
+
it "({ form: 'sonnet_junk' })" do
|
154
|
+
poem = @poefy.poem ({ form: 'sonnet_junk' })
|
155
|
+
expect(poem).to be_nil
|
156
|
+
end
|
157
|
+
it "({ form: :not_a_form })" do
|
158
|
+
poem = @poefy.poem ({ form: :not_a_form })
|
159
|
+
expect(poem).to be_nil
|
160
|
+
end
|
161
|
+
it "({ form: :not_a_form, indent: '0010' })" do
|
162
|
+
poem = @poefy.poem ({ form: :not_a_form, indent: '0010' })
|
163
|
+
expect(poem).to be_nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "should be valid if given a junk named form, and a rhyme" do
|
168
|
+
it "({ form: :not_a_form, rhyme: 'abcb' })" do
|
169
|
+
poem = @poefy.poem ({ form: :not_a_form, rhyme: 'abcb' })
|
170
|
+
expect(poem.count).to be 4
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe "should overwrite a named form if another option is specified" do
|
175
|
+
it "({ form: 'default', rhyme: 'ab' })" do
|
176
|
+
poem = @poefy.poem ({ form: 'default', rhyme: 'ab' })
|
177
|
+
expect(poem.count).to be 2
|
178
|
+
end
|
179
|
+
it "({ form: :villanelle, rhyme: 'abcb' })" do
|
180
|
+
poem = @poefy.poem ({ form: :villanelle, rhyme: 'abcb' })
|
181
|
+
expect(poem.count).to be 4
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
##############################################################################
|
188
|
+
|
189
|
+
describe "using dataset shakespeare.db / shakespeare_sonnets.txt" do
|
190
|
+
|
191
|
+
file_txt = "shakespeare_sonnets.txt"
|
192
|
+
file_db = "shakespeare.db"
|
193
|
+
|
194
|
+
# All the Shakespeare lines are pentameter, so some forms should fail.
|
195
|
+
forms = Poefy::PoeticForms::POETIC_FORMS
|
196
|
+
forms_fail = [:limerick, :haiku, :common, :ballad]
|
197
|
+
forms_pass = forms.keys - forms_fail
|
198
|
+
|
199
|
+
before(:each) do
|
200
|
+
@poefy = Poefy::PoefyGen.new(file_db, { proper: false })
|
201
|
+
end
|
202
|
+
|
203
|
+
it "initialised object not nil" do
|
204
|
+
expect(@poefy).to_not be_nil
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#make_database( '#{@root}/data/#{file_txt}', true )" do
|
208
|
+
it "should make the database '#{@root}/data/#{file_db}" do
|
209
|
+
db_file = "#{@root}/data/#{file_db}"
|
210
|
+
# File.delete(db_file) if File.exists?(db_file)
|
211
|
+
input = `sed '/[a-z]/!d' #{@root}/data/#{file_txt}`
|
212
|
+
@poefy.make_database input
|
213
|
+
expect(@poefy.db.exists?).to be true
|
214
|
+
expect(File.exists?(db_file)).to be true
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "using form string" do
|
219
|
+
describe "should return correct number of lines" do
|
220
|
+
|
221
|
+
# Make sure each form's lines match the expected output.
|
222
|
+
# Generate a few to be sure.
|
223
|
+
forms_pass.each do |form|
|
224
|
+
it "({ form: #{form} })" do
|
225
|
+
10.times do
|
226
|
+
poem = @poefy.poem ({ form: form })
|
227
|
+
expect(poem.count).to satisfy do |c|
|
228
|
+
[*forms[form][:rhyme]].map do |r|
|
229
|
+
r.gsub(/[0-9]/,'').length
|
230
|
+
end.include?(c)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "should fail to be created" do
|
238
|
+
forms_fail.each do |form|
|
239
|
+
it "({ form: #{form} })" do
|
240
|
+
4.times do
|
241
|
+
poem = @poefy.poem ({ form: form })
|
242
|
+
expect(poem).to be_nil
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
##############################################################################
|
251
|
+
|
252
|
+
describe "using dataset whitman.db / whitman_leaves.txt" do
|
253
|
+
|
254
|
+
file_txt = "whitman_leaves.txt"
|
255
|
+
file_db = "whitman.db"
|
256
|
+
|
257
|
+
# There's a good mix of syllable count, so all forms should pass.
|
258
|
+
forms = Poefy::PoeticForms::POETIC_FORMS
|
259
|
+
forms_pass = forms.keys
|
260
|
+
|
261
|
+
before(:each) do
|
262
|
+
@poefy = Poefy::PoefyGen.new(file_db, { proper: false })
|
263
|
+
end
|
264
|
+
|
265
|
+
it "initialised object not nil" do
|
266
|
+
expect(@poefy).to_not be_nil
|
267
|
+
end
|
268
|
+
|
269
|
+
describe "#make_database( '#{@root}/data/#{file_txt}', true )" do
|
270
|
+
it "should make the database '#{@root}/data/#{file_db}" do
|
271
|
+
db_file = "#{@root}/data/#{file_db}"
|
272
|
+
# File.delete(db_file) if File.exists?(db_file)
|
273
|
+
input = `sed '/[a-z]/!d' #{@root}/data/#{file_txt}`
|
274
|
+
@poefy.make_database input
|
275
|
+
expect(@poefy.db.exists?).to be true
|
276
|
+
expect(File.exists?(db_file)).to be true
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe "using form string" do
|
281
|
+
describe "should return correct number of lines" do
|
282
|
+
|
283
|
+
# Make sure each form's lines match the expected output.
|
284
|
+
# Generate a few to be sure.
|
285
|
+
forms_pass.each do |form|
|
286
|
+
it "({ form: #{form} })" do
|
287
|
+
10.times do
|
288
|
+
poem = @poefy.poem ({ form: form })
|
289
|
+
expect(poem.count).to satisfy do |c|
|
290
|
+
[*forms[form][:rhyme]].map do |r|
|
291
|
+
r.gsub(/[0-9]/,'').length
|
292
|
+
end.include?(c)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
describe "using syllable string" do
|
301
|
+
|
302
|
+
it "({ rhyme: 'abcb defe', syllable: '[8,6,8,6,0,8,6,8,6]' })" do
|
303
|
+
options = {
|
304
|
+
rhyme: 'abcb defe',
|
305
|
+
syllable: '[8,6,8,6,0,8,6,8,6]'
|
306
|
+
}
|
307
|
+
poem = @poefy.poem (options)
|
308
|
+
expect(poem.count).to be options[:rhyme].length
|
309
|
+
end
|
310
|
+
|
311
|
+
it "({ rhyme: 'abcb defe', syllable: '[8,6,8,6,8,6,8,6]' })" do
|
312
|
+
options = {
|
313
|
+
rhyme: 'abcb defe',
|
314
|
+
syllable: '[8,6,8,6,8,6,8,6]'
|
315
|
+
}
|
316
|
+
poem = @poefy.poem (options)
|
317
|
+
expect(poem.count).to be options[:rhyme].length
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
##############################################################################
|
323
|
+
|
324
|
+
describe "#transform_string_syllable" do
|
325
|
+
|
326
|
+
# Singleton which includes the method.
|
327
|
+
# Make the private methods public.
|
328
|
+
let(:obj) do
|
329
|
+
class Sing
|
330
|
+
include Poefy::PoeticForms
|
331
|
+
include Poefy::StringManipulation
|
332
|
+
public *private_instance_methods
|
333
|
+
end.new
|
334
|
+
end
|
335
|
+
describe "using rhyme string 'aabba'" do
|
336
|
+
input_and_output = [
|
337
|
+
['10',
|
338
|
+
{1=>10,2=>10,3=>10,4=>10,5=>10}],
|
339
|
+
['9,10,11',
|
340
|
+
{1=>[9,10,11],2=>[9,10,11],3=>[9,10,11],4=>[9,10,11],5=>[9,10,11]}],
|
341
|
+
['[8,8,5,5,8]',
|
342
|
+
{1=>8,2=>8,3=>5,4=>5,5=>8}],
|
343
|
+
['[[8,9],[8,9],[4,5,6],[4,5,6],[8,9]]',
|
344
|
+
{1=>[8,9],2=>[8,9],3=>[4,5,6],4=>[4,5,6],5=>[8,9]}],
|
345
|
+
['{1:8,2:8,3:5,4:5,5:8}',
|
346
|
+
{1=>8,2=>8,3=>5,4=>5,5=>8}],
|
347
|
+
['{1:8,2:8,3:5,5:8}',
|
348
|
+
{1=>8,2=>8,3=>5,4=>0,5=>8}],
|
349
|
+
['{0:99,1:8,2:8,3:5,5:8}',
|
350
|
+
{1=>8,2=>8,3=>5,4=>99,5=>8}],
|
351
|
+
['{1:[8,9],2:[8,9],3:[4,5,6],4:[4,5,6],5:[8,9]}',
|
352
|
+
{1=>[8,9],2=>[8,9],3=>[4,5,6],4=>[4,5,6],5=>[8,9]}],
|
353
|
+
['{1:[8,9],2:[8,9],3:[4,5,6],5:[8,9]}',
|
354
|
+
{1=>[8,9],2=>[8,9],3=>[4,5,6],4=>0,5=>[8,9]}],
|
355
|
+
['{0:99,1:[8,9],2:[8,9],3:[4,5,6],5:[8,9]}',
|
356
|
+
{1=>[8,9],2=>[8,9],3=>[4,5,6],4=>99,5=>[8,9]}],
|
357
|
+
['{0:[8,9],3:[4,5,6],4:[4,5,6]}',
|
358
|
+
{1=>[8,9],2=>[8,9],3=>[4,5,6],4=>[4,5,6],5=>[8,9]}],
|
359
|
+
['{1:8,5:8}',
|
360
|
+
{1=>8,2=>0,3=>0,4=>0,5=>8}],
|
361
|
+
['{1:8,2:8,3:5,-2:5,-1:8}',
|
362
|
+
{1=>8,2=>8,3=>5,4=>5,5=>8}]
|
363
|
+
]
|
364
|
+
input_and_output.each do |pair|
|
365
|
+
it "syllable: #{pair.first}" do
|
366
|
+
rhyme = obj.tokenise_rhyme('aabba')
|
367
|
+
out = obj.transform_string_syllable(pair.first, 'aabba')
|
368
|
+
again = obj.transform_string_syllable(out, 'aabba')
|
369
|
+
expect(out).to eq pair.last
|
370
|
+
expect(again).to eq out
|
371
|
+
expect(again).to eq pair.last
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
##############################################################################
|
378
|
+
|
379
|
+
describe "#transform_string_regex" do
|
380
|
+
|
381
|
+
# Singleton which includes the method.
|
382
|
+
# Make the private methods public.
|
383
|
+
let(:obj) do
|
384
|
+
class Sing
|
385
|
+
include Poefy::PoeticForms
|
386
|
+
include Poefy::StringManipulation
|
387
|
+
public *private_instance_methods
|
388
|
+
end.new
|
389
|
+
end
|
390
|
+
|
391
|
+
describe "using rhyme string 'aabba'" do
|
392
|
+
input_and_output = [
|
393
|
+
['^[^e]*$',
|
394
|
+
{
|
395
|
+
1=>/^[^e]*$/,
|
396
|
+
2=>/^[^e]*$/,
|
397
|
+
3=>/^[^e]*$/,
|
398
|
+
4=>/^[^e]*$/,
|
399
|
+
5=>/^[^e]*$/
|
400
|
+
}],
|
401
|
+
['[/(?=^[A-Z])(?=^[^eE]*$)/,/^[^eE]*$/,/^[^eE]*$/,/^[^eE]*$/,/^[^eE]*$/]',
|
402
|
+
{
|
403
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
404
|
+
2=>/^[^eE]*$/,
|
405
|
+
3=>/^[^eE]*$/,
|
406
|
+
4=>/^[^eE]*$/,
|
407
|
+
5=>/^[^eE]*$/
|
408
|
+
}],
|
409
|
+
['{1=>/(?=^[A-Z])(?=^[^eE]*$)/,2=>/^[^eE]*$/,3=>/^[^eE]*$/,4=>/^[^eE]*$/,5=>/^[^eE]*$/}',
|
410
|
+
{
|
411
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
412
|
+
2=>/^[^eE]*$/,
|
413
|
+
3=>/^[^eE]*$/,
|
414
|
+
4=>/^[^eE]*$/,
|
415
|
+
5=>/^[^eE]*$/
|
416
|
+
}],
|
417
|
+
['{0=>/^[^eE]*$/,1=>/(?=^[A-Z])(?=^[^eE]*$)/}',
|
418
|
+
{
|
419
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
420
|
+
2=>/^[^eE]*$/,
|
421
|
+
3=>/^[^eE]*$/,
|
422
|
+
4=>/^[^eE]*$/,
|
423
|
+
5=>/^[^eE]*$/
|
424
|
+
}],
|
425
|
+
['{1=>/(?=^[A-Z])(?=^[^eE]*$)/,2=>/^[^eE]*$/,3=>/^[^eE]*$/,5=>/^[^eE]*$/}',
|
426
|
+
{
|
427
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
428
|
+
2=>/^[^eE]*$/,
|
429
|
+
3=>/^[^eE]*$/,
|
430
|
+
4=>nil,
|
431
|
+
5=>/^[^eE]*$/
|
432
|
+
}],
|
433
|
+
['{1=>/(?=^[A-Z])(?=^[^eE]*$)/,4=>/^[^eE]*$/}',
|
434
|
+
{
|
435
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
436
|
+
2=>nil,
|
437
|
+
3=>nil,
|
438
|
+
4=>/^[^eE]*$/,
|
439
|
+
5=>nil
|
440
|
+
}],
|
441
|
+
['{1=>/(?=^[A-Z])(?=^[^eE]*$)/,2=>/^[^eE]*$/,3=>/^[^eE]*$/,-1=>/^[^eE]*$/,-2=>/^[^eE]*$/}',
|
442
|
+
{
|
443
|
+
1=>/(?=^[A-Z])(?=^[^eE]*$)/,
|
444
|
+
2=>/^[^eE]*$/,
|
445
|
+
3=>/^[^eE]*$/,
|
446
|
+
4=>/^[^eE]*$/,
|
447
|
+
5=>/^[^eE]*$/
|
448
|
+
}]
|
449
|
+
]
|
450
|
+
input_and_output.each do |pair|
|
451
|
+
it "regex: #{pair.first}" do
|
452
|
+
out = obj.transform_string_regex(pair.first, 'aabba')
|
453
|
+
again = obj.transform_string_regex(out, 'aabba')
|
454
|
+
expect(out).to eq pair.last
|
455
|
+
expect(again).to eq out
|
456
|
+
expect(again).to eq pair.last
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
end
|
463
|
+
|
464
|
+
################################################################################
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: poefy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Paul Thompson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sqlite3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.3.13
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '1.3'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.3.13
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: ruby_rhymes
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0.1'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.1.2
|
85
|
+
type: :runtime
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.1'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.1.2
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: wordfilter
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0.2'
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.2.6
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0.2'
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 0.2.6
|
115
|
+
description: Create poems from an input text file, by generating and querying a SQLite
|
116
|
+
database describing each line. Poems are created using a template to select lines
|
117
|
+
from the database, according to closing rhyme, syllable count, and regex matching.
|
118
|
+
email:
|
119
|
+
- nossidge@gmail.com
|
120
|
+
executables:
|
121
|
+
- poefy
|
122
|
+
extensions: []
|
123
|
+
extra_rdoc_files: []
|
124
|
+
files:
|
125
|
+
- ".gitignore"
|
126
|
+
- ".rspec"
|
127
|
+
- Gemfile
|
128
|
+
- LICENSE
|
129
|
+
- README.md
|
130
|
+
- Rakefile
|
131
|
+
- bin/poefy
|
132
|
+
- data/emily_dickinson.txt
|
133
|
+
- data/english_as_she_is_spoke.txt
|
134
|
+
- data/shakespeare_sonnets.txt
|
135
|
+
- data/spec_test_tiny.txt
|
136
|
+
- data/st_therese_of_lisieux.txt
|
137
|
+
- data/whitman_leaves.txt
|
138
|
+
- lib/poefy.rb
|
139
|
+
- lib/poefy/conditional_satisfaction.rb
|
140
|
+
- lib/poefy/database.rb
|
141
|
+
- lib/poefy/generation.rb
|
142
|
+
- lib/poefy/handle_error.rb
|
143
|
+
- lib/poefy/poefy_gen_base.rb
|
144
|
+
- lib/poefy/poetic_forms.rb
|
145
|
+
- lib/poefy/self.rb
|
146
|
+
- lib/poefy/string_manipulation.rb
|
147
|
+
- lib/poefy/version.rb
|
148
|
+
- poefy.gemspec
|
149
|
+
- spec/poefy_spec.rb
|
150
|
+
- spec/spec_helper.rb
|
151
|
+
homepage: https://github.com/nossidge/poefy
|
152
|
+
licenses:
|
153
|
+
- GPL-3.0
|
154
|
+
metadata: {}
|
155
|
+
post_install_message:
|
156
|
+
rdoc_options: []
|
157
|
+
require_paths:
|
158
|
+
- lib
|
159
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
requirements: []
|
170
|
+
rubyforge_project:
|
171
|
+
rubygems_version: 2.6.11
|
172
|
+
signing_key:
|
173
|
+
specification_version: 4
|
174
|
+
summary: Create rhyming poetry by rearranging lines of text
|
175
|
+
test_files: []
|