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 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