bible_passage 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bible_passage.gemspec +1 -1
- data/lib/bible_passage/book_key_translator.rb +6 -2
- data/lib/bible_passage/invalid_reference.rb +13 -0
- data/lib/bible_passage/reference.rb +49 -22
- data/lib/bible_passage.rb +1 -1
- data/spec/bible_passage/invalid_reference_spec.rb +19 -0
- data/spec/bible_passage/reference_spec.rb +54 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 951cee3c9b5418a1f865574e2d5418a7f05c91ba
|
4
|
+
data.tar.gz: 20ecf5a12df90d42d8f0e6a331b15cc2826c990e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1acfc1b1023053dd8694229b80f3751ab7bdb7442abef06ea604428f08b770efc70cc04c742d5d2c1320201b1583040d43fd56333dda70cc68abf7cacd72d09
|
7
|
+
data.tar.gz: 50c1014d263df724b2163d1b1d8fc3656f69508baf53fd744ef3840ec41369c1b8447a925afda782cddee0fde4898c0665a84a25c104bd0e5fa997305564b629
|
data/bible_passage.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'bible_passage'
|
3
3
|
s.summary = 'A simple library for parsing and rendering bible passages'
|
4
|
-
s.version = '0.
|
4
|
+
s.version = '0.2.0'
|
5
5
|
s.authors = ["Si Wilkins"]
|
6
6
|
s.email = 'si.wilkins@gmail.com'
|
7
7
|
s.homepage = 'https://github.com/siwilkins/bible_passage'
|
@@ -331,9 +331,13 @@ module BiblePassage
|
|
331
331
|
revelation: :rev,
|
332
332
|
}
|
333
333
|
|
334
|
-
def keyify(book_name)
|
335
|
-
TRANSLATIONS[normalize_input(book_name)]
|
334
|
+
def keyify(book_name, raise_errors = true)
|
335
|
+
translation = TRANSLATIONS[normalize_input(book_name)]
|
336
|
+
if translation
|
337
|
+
return translation
|
338
|
+
elsif raise_errors
|
336
339
|
raise(InvalidReferenceError.new("#{book_name} is not a valid book"))
|
340
|
+
end
|
337
341
|
end
|
338
342
|
|
339
343
|
private
|
@@ -2,6 +2,8 @@ module BiblePassage
|
|
2
2
|
|
3
3
|
class Reference
|
4
4
|
|
5
|
+
attr_reader :error
|
6
|
+
|
5
7
|
class << self
|
6
8
|
|
7
9
|
# Parsing methods are currently very complex and long.
|
@@ -10,11 +12,19 @@ module BiblePassage
|
|
10
12
|
##
|
11
13
|
# The main method used for parsing passage strings
|
12
14
|
def parse(passage, options = {})
|
15
|
+
options = {raise_errors: true}.merge(options)
|
13
16
|
translator = options.delete(:translator) || BookKeyTranslator.new
|
14
17
|
data_store = options[:data_store] ||= BookDataStore.new
|
15
18
|
match = match_passage_format(passage)
|
16
|
-
|
17
|
-
|
19
|
+
if !match
|
20
|
+
message = "#{passage} is not a valid reference"
|
21
|
+
if options[:raise_errors]
|
22
|
+
raise InvalidReferenceError.new(message)
|
23
|
+
else
|
24
|
+
return InvalidReference.new(message)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
book_key = translator.keyify(match[1], options[:raise_errors]) || (return InvalidReference.new("#{match[1]} is not a valid book"))
|
18
28
|
if data_store.number_of_chapters(book_key) == 1
|
19
29
|
ref = process_single_chapter_match(book_key, match, options)
|
20
30
|
else
|
@@ -63,6 +73,7 @@ module BiblePassage
|
|
63
73
|
end
|
64
74
|
|
65
75
|
private
|
76
|
+
|
66
77
|
def match_passage_format(passage)
|
67
78
|
passage.match(/^\s*(\d?\s*[A-Za-z\s]+)\s*(\d+)?:?(\d+)?\s*-?\s*(\d+)?:?(\d+)?\s*(,.+)?/)
|
68
79
|
end
|
@@ -99,7 +110,11 @@ module BiblePassage
|
|
99
110
|
if match[0] =~ /:/
|
100
111
|
book_name = options[:data_store].book_name(book_key)
|
101
112
|
msg = "#{book_name} doesn't have any chapters"
|
102
|
-
|
113
|
+
if options[:raise_errors]
|
114
|
+
raise InvalidReferenceError.new(msg)
|
115
|
+
else
|
116
|
+
return InvalidReference.new(msg)
|
117
|
+
end
|
103
118
|
end
|
104
119
|
new(book_key, nil, from_verse, nil, to_verse, options)
|
105
120
|
end
|
@@ -112,6 +127,7 @@ module BiblePassage
|
|
112
127
|
|
113
128
|
def initialize(book_key, from_chapter = nil, from_verse = nil,
|
114
129
|
to_chapter = nil, to_verse = nil, options = {})
|
130
|
+
@raise_errors = options.has_key?(:raise_errors) ? options[:raise_errors] : true
|
115
131
|
@data_store = options[:data_store] || BookDataStore.new
|
116
132
|
self.book_key = book_key
|
117
133
|
self.from_chapter = int_param(from_chapter)
|
@@ -135,9 +151,10 @@ module BiblePassage
|
|
135
151
|
|
136
152
|
def from_chapter=(val)
|
137
153
|
if val
|
138
|
-
|
139
|
-
"#{book} doesn't have a chapter #{val}"
|
140
|
-
|
154
|
+
if val < 1 || val > @data_store.number_of_chapters(book_key)
|
155
|
+
@error = "#{book} doesn't have a chapter #{val}"
|
156
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
157
|
+
end
|
141
158
|
@inherit_book_key = true
|
142
159
|
@from_chapter = val
|
143
160
|
end
|
@@ -148,10 +165,11 @@ module BiblePassage
|
|
148
165
|
end
|
149
166
|
|
150
167
|
def from_verse=(val)
|
151
|
-
if val
|
152
|
-
|
153
|
-
"#{book} #{from_chapter} doesn't have a verse #{val}"
|
154
|
-
|
168
|
+
if val && valid?
|
169
|
+
if val > @data_store.number_of_verses(book_key, from_chapter) || val < 1
|
170
|
+
@error = "#{book} #{from_chapter} doesn't have a verse #{val}"
|
171
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
172
|
+
end
|
155
173
|
@inherit_chapter = true
|
156
174
|
@from_verse = val
|
157
175
|
end
|
@@ -163,11 +181,14 @@ module BiblePassage
|
|
163
181
|
|
164
182
|
def to_chapter=(val)
|
165
183
|
if val
|
166
|
-
|
167
|
-
"to_chapter cannot be before from_chapter"
|
168
|
-
|
169
|
-
|
170
|
-
|
184
|
+
if val < from_chapter
|
185
|
+
@error = "to_chapter cannot be before from_chapter"
|
186
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
187
|
+
end
|
188
|
+
if val > @data_store.number_of_chapters(book_key)
|
189
|
+
@error = "#{book} doesn't have a chapter #{val}"
|
190
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
191
|
+
end
|
171
192
|
@to_chapter = val
|
172
193
|
end
|
173
194
|
end
|
@@ -177,13 +198,15 @@ module BiblePassage
|
|
177
198
|
end
|
178
199
|
|
179
200
|
def to_verse=(val)
|
180
|
-
if val
|
181
|
-
|
182
|
-
"to_verse cannot be before from_verse"
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
@
|
201
|
+
if val && valid?
|
202
|
+
if val < from_verse && single_chapter_passage?
|
203
|
+
@error = "to_verse cannot be before from_verse"
|
204
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
205
|
+
end
|
206
|
+
if val > @data_store.number_of_verses(book_key, to_chapter)
|
207
|
+
@error = "#{book} #{to_chapter} doesn't have a verse #{val}"
|
208
|
+
raise InvalidReferenceError.new(@error) if @raise_errors
|
209
|
+
end
|
187
210
|
@to_verse = val
|
188
211
|
end
|
189
212
|
end
|
@@ -230,6 +253,10 @@ module BiblePassage
|
|
230
253
|
out
|
231
254
|
end
|
232
255
|
|
256
|
+
def valid?
|
257
|
+
@error.nil?
|
258
|
+
end
|
259
|
+
|
233
260
|
private
|
234
261
|
def from_part
|
235
262
|
out = ''
|
data/lib/bible_passage.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe BiblePassage::InvalidReference do
|
4
|
+
|
5
|
+
let(:reference) { BiblePassage::InvalidReference.new("An error") }
|
6
|
+
|
7
|
+
it "is a Reference" do
|
8
|
+
expect(reference.is_a?(BiblePassage::Reference)).to eq(true)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "is invalid" do
|
12
|
+
expect(reference.valid?).to eq(false)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns the supplied message" do
|
16
|
+
expect(reference.error).to eq("An error")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -40,13 +40,13 @@ describe BiblePassage::Reference do
|
|
40
40
|
context "book_key" do
|
41
41
|
|
42
42
|
it "returns a book_key" do
|
43
|
-
allow(translator).to receive(:keyify).with("book name").
|
43
|
+
allow(translator).to receive(:keyify).with("book name", true).
|
44
44
|
and_return :gen
|
45
45
|
expect(reference.book_key).to eq(:gen)
|
46
46
|
end
|
47
47
|
|
48
48
|
it "returns another book_key" do
|
49
|
-
allow(translator).to receive(:keyify).with("book name").
|
49
|
+
allow(translator).to receive(:keyify).with("book name", true).
|
50
50
|
and_return :ex
|
51
51
|
expect(reference.book_key).to eq(:ex)
|
52
52
|
end
|
@@ -300,40 +300,76 @@ describe BiblePassage::Reference do
|
|
300
300
|
BiblePassage::InvalidReferenceError, "Genosis is not a valid book")
|
301
301
|
end
|
302
302
|
|
303
|
+
it "returns an invalid reference when non-existent book and false are passed in for raise_errors" do
|
304
|
+
expect(BiblePassage::Reference.parse("Genosis", raise_errors: false).valid?).to eq(false)
|
305
|
+
end
|
306
|
+
|
307
|
+
it "returns valid? false when non-existent book and raise_errors:false are passed in" do
|
308
|
+
expect(BiblePassage::Reference.parse("Genosis", raise_errors: false).valid?).to eq(false)
|
309
|
+
end
|
310
|
+
|
303
311
|
end
|
304
312
|
|
305
313
|
context "new" do
|
306
314
|
|
307
315
|
def self.it_errors(msg, book_key, from_chapter, from_verse, to_chapter,
|
308
316
|
to_verse, error_msg)
|
309
|
-
it msg do
|
317
|
+
it "errors #{msg}" do
|
310
318
|
expect { BiblePassage::Reference.new(book_key, from_chapter,
|
311
319
|
from_verse, to_chapter, to_verse) }.
|
312
320
|
to raise_error(BiblePassage::InvalidReferenceError, error_msg)
|
313
321
|
end
|
314
322
|
end
|
315
323
|
|
324
|
+
def self.it_returns_invalid_reference(msg, book_key, from_chapter, from_verse, to_chapter, to_verse, error_msg)
|
325
|
+
it "returns an invalid reference #{msg}" do
|
326
|
+
ref = BiblePassage::Reference.new(book_key, from_chapter, from_verse, to_chapter, to_verse, raise_errors: false)
|
327
|
+
expect(ref.valid?).to eq(false)
|
328
|
+
expect(ref.error).to eq(error_msg)
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
316
332
|
it_errors "when from_chapter is less than 1", :gen, 0, nil, nil, nil,
|
317
333
|
"Genesis doesn't have a chapter 0"
|
334
|
+
|
335
|
+
it_returns_invalid_reference "when from_chapter is less than 1", :gen, 0, 1, 1, 1, "Genesis doesn't have a chapter 0"
|
318
336
|
|
319
337
|
it_errors "when from_chapter is greater than number of chapters in book",
|
320
338
|
:gen, 51, nil, nil, nil, "Genesis doesn't have a chapter 51"
|
321
339
|
|
340
|
+
it_returns_invalid_reference "when from_chapter is greater than number of chapters in book",
|
341
|
+
:gen, 51, 1, 51, 1, "Genesis doesn't have a chapter 51"
|
342
|
+
|
322
343
|
it_errors "when from_verse is less than 1", :gen, 1, 0, nil, nil,
|
323
344
|
"Genesis 1 doesn't have a verse 0"
|
324
345
|
|
346
|
+
it_returns_invalid_reference "when from_verse is less than 1", :gen, 1, 0, 1, 1,
|
347
|
+
"Genesis 1 doesn't have a verse 0"
|
348
|
+
|
325
349
|
it_errors "when from_verse is greater than number of verses in chapter",
|
326
350
|
:gen, 1, 32, nil, nil, "Genesis 1 doesn't have a verse 32"
|
327
351
|
|
352
|
+
it_returns_invalid_reference "when from_verse is greater than number of verses in chapter",
|
353
|
+
:gen, 1, 32, 1, 32, "Genesis 1 doesn't have a verse 32"
|
354
|
+
|
328
355
|
it_errors "when to_chapter is less than from_chapter", :gen, 2, nil, 1,
|
329
356
|
nil, "to_chapter cannot be before from_chapter"
|
330
357
|
|
358
|
+
it_returns_invalid_reference "when to_chapter is less than from_chapter", :gen, 2, 1, 1,
|
359
|
+
1, "to_chapter cannot be before from_chapter"
|
360
|
+
|
331
361
|
it_errors "when to_chapter is greater than number of chapters is book",
|
332
362
|
:gen, 2, nil, 51, nil, "Genesis doesn't have a chapter 51"
|
333
363
|
|
364
|
+
it_returns_invalid_reference "when to_chapter is greater than number of chapters is book",
|
365
|
+
:gen, 2, 1, 51, 1, "Genesis doesn't have a chapter 51"
|
366
|
+
|
334
367
|
it_errors "when to_verse is less than from_verse and in same chapter",
|
335
368
|
:gen, 2, 2, 2, 1, "to_verse cannot be before from_verse"
|
336
369
|
|
370
|
+
it_returns_invalid_reference "when to_verse is less than from_verse and in same chapter",
|
371
|
+
:gen, 2, 2, 2, 1, "to_verse cannot be before from_verse"
|
372
|
+
|
337
373
|
it "doesn't error when to_verse is less than from_verse but spans
|
338
374
|
chapters" do
|
339
375
|
expect { BiblePassage::Reference.new(:gen, 2, 2, 3, 1) }.
|
@@ -343,6 +379,9 @@ describe BiblePassage::Reference do
|
|
343
379
|
it_errors "when to_verse is greater than number of verses in chapter",
|
344
380
|
:gen, 1, 1, 1, 32, "Genesis 1 doesn't have a verse 32"
|
345
381
|
|
382
|
+
it_returns_invalid_reference "when to_verse is greater than number of verses in chapter",
|
383
|
+
:gen, 1, 1, 1, 32, "Genesis 1 doesn't have a verse 32"
|
384
|
+
|
346
385
|
it "errors when a chapter is supplied to .parse for a single-chapter
|
347
386
|
book" do
|
348
387
|
expect { BiblePassage::Reference.parse("Jude 2:3-4") }.to raise_error(
|
@@ -350,11 +389,23 @@ describe BiblePassage::Reference do
|
|
350
389
|
"Jude doesn't have any chapters")
|
351
390
|
end
|
352
391
|
|
392
|
+
it "returns an invalid reference when a chapter and parse_errors: false are supplied to .parse for a single-chapter book" do
|
393
|
+
expect(BiblePassage::Reference.parse("Jude 2:3-4", raise_errors: false).valid?).to eq(false)
|
394
|
+
end
|
395
|
+
|
353
396
|
it "errors when no book is supplied to parse" do
|
354
397
|
expect { BiblePassage::Reference.parse('2') }.to raise_error(
|
355
398
|
BiblePassage::InvalidReferenceError, "2 is not a valid reference")
|
356
399
|
end
|
357
400
|
|
401
|
+
it "returns an invalid reference when no book and raise_errors: false is supplied to parse" do
|
402
|
+
expect(BiblePassage::Reference.parse('2', raise_errors: false).valid?).to eq(false)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "returns true for valid? when it is valid" do
|
406
|
+
expect(BiblePassage::Reference.new(:gen, 1, 1).valid?).to eq(true)
|
407
|
+
end
|
408
|
+
|
358
409
|
end
|
359
410
|
|
360
411
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bible_passage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Si Wilkins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -83,10 +83,12 @@ files:
|
|
83
83
|
- lib/bible_passage.rb
|
84
84
|
- lib/bible_passage/book_data_store.rb
|
85
85
|
- lib/bible_passage/book_key_translator.rb
|
86
|
+
- lib/bible_passage/invalid_reference.rb
|
86
87
|
- lib/bible_passage/invalid_reference_error.rb
|
87
88
|
- lib/bible_passage/reference.rb
|
88
89
|
- spec/bible_passage/book_data_store_spec.rb
|
89
90
|
- spec/bible_passage/book_key_translator_spec.rb
|
91
|
+
- spec/bible_passage/invalid_reference_spec.rb
|
90
92
|
- spec/bible_passage/reference_spec.rb
|
91
93
|
- spec/spec_helper.rb
|
92
94
|
homepage: https://github.com/siwilkins/bible_passage
|