bible_passage 0.1.1 → 0.2.0
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 +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
|