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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf622f06c1242c67eb2a34b5b929088b01586962
4
- data.tar.gz: 4de690f1b893d68634dea13519dfd0e6ba1af922
3
+ metadata.gz: 951cee3c9b5418a1f865574e2d5418a7f05c91ba
4
+ data.tar.gz: 20ecf5a12df90d42d8f0e6a331b15cc2826c990e
5
5
  SHA512:
6
- metadata.gz: 82873b7450db0f14a4ef53f4e50aca713aa862dfc180db355cdc17e0a53dc53717b534c8a543124fb41d67c2e6f3980a2166f74ce1783a3528497aa00d5cfded
7
- data.tar.gz: b5b91cdfd1f165ecfab92d120c9982ef8128deabb673c31951de5eca99590f1fb9d0d527ff18bcdfff10c8a9bad982f566a422418ef8279587c0ffba3fbaf717
6
+ metadata.gz: a1acfc1b1023053dd8694229b80f3751ab7bdb7442abef06ea604428f08b770efc70cc04c742d5d2c1320201b1583040d43fd56333dda70cc68abf7cacd72d09
7
+ data.tar.gz: 50c1014d263df724b2163d1b1d8fc3656f69508baf53fd744ef3840ec41369c1b8447a925afda782cddee0fde4898c0665a84a25c104bd0e5fa997305564b629
@@ -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.1.1'
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
@@ -0,0 +1,13 @@
1
+ class BiblePassage::InvalidReference < BiblePassage::Reference
2
+
3
+ attr_reader :error
4
+
5
+ def initialize(message)
6
+ @error = message
7
+ end
8
+
9
+ def valid?
10
+ false
11
+ end
12
+
13
+ end
@@ -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
- raise InvalidReferenceError.new("#{passage} is not a valid reference") if !match
17
- book_key = translator.keyify(match[1])
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
- raise InvalidReferenceError.new(msg)
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
- raise InvalidReferenceError.new(
139
- "#{book} doesn't have a chapter #{val}") if val < 1 ||
140
- val > @data_store.number_of_chapters(book_key)
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
- raise InvalidReferenceError.new(
153
- "#{book} #{from_chapter} doesn't have a verse #{val}") if val < 1 ||
154
- val > @data_store.number_of_verses(book_key, from_chapter)
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
- raise InvalidReferenceError.new(
167
- "to_chapter cannot be before from_chapter") if val < from_chapter
168
- raise InvalidReferenceError.new(
169
- "#{book} doesn't have a chapter #{val}") if val >
170
- @data_store.number_of_chapters(book_key)
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
- raise InvalidReferenceError.new(
182
- "to_verse cannot be before from_verse") if val < from_verse &&
183
- single_chapter_passage?
184
- raise InvalidReferenceError.new(
185
- "#{book} #{to_chapter} doesn't have a verse #{val}") if val >
186
- @data_store.number_of_verses(book_key, to_chapter)
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
@@ -2,4 +2,4 @@ require_relative 'bible_passage/reference'
2
2
  require_relative 'bible_passage/book_key_translator'
3
3
  require_relative 'bible_passage/invalid_reference_error'
4
4
  require_relative 'bible_passage/book_data_store'
5
-
5
+ require_relative 'bible_passage/invalid_reference'
@@ -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.1.1
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-13 00:00:00.000000000 Z
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