poefy 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|