Class: BibleBot::Reference
- Inherits:
-
Object
- Object
- BibleBot::Reference
- Defined in:
- lib/bible_bot/reference.rb
Overview
A Reference represents a range of verses.
Instance Attribute Summary collapse
- #end_verse ⇒ Verse readonly
- #start_verse ⇒ Verse readonly
Class Method Summary collapse
- .from_verse_ids(start_verse_id, end_verse_id = nil) ⇒ Reference
-
.parse(text, validate: true) ⇒ Array<Reference>
Parse text into an array of scripture References.
Instance Method Summary collapse
-
#formatted(include_chapter_on_single_chapter_books: false) ⇒ String
Returns a formatted string of the Reference.
-
#full_chapters? ⇒ Boolean
One or multiple full chapters.
-
#includes_verse?(verse) ⇒ Boolean
Returns true if the given verse is within the start and end verse of the Reference.
-
#initialize(start_verse:, end_verse: nil) ⇒ Reference
constructor
A new instance of Reference.
- #inspect ⇒ Hash
-
#intersects_reference?(other) ⇒ Boolean
Return true if the two references contain any of the same verses.
- #same_start_and_end_book? ⇒ Boolean
- #same_start_and_end_chapter? ⇒ Boolean
- #to_s ⇒ string
- #valid? ⇒ Boolean
-
#validate! ⇒ Object
Raises error if reference is invalid.
-
#verses ⇒ Array<Verse>
Returns an array of all the verses contained in the Reference.
Constructor Details
#initialize(start_verse:, end_verse: nil) ⇒ Reference
Returns a new instance of Reference.
42 43 44 45 |
# File 'lib/bible_bot/reference.rb', line 42 def initialize(start_verse:, end_verse: nil) @start_verse = start_verse @end_verse = end_verse || start_verse end |
Instance Attribute Details
#end_verse ⇒ Verse (readonly)
5 6 7 |
# File 'lib/bible_bot/reference.rb', line 5 def end_verse @end_verse end |
#start_verse ⇒ Verse (readonly)
4 5 6 |
# File 'lib/bible_bot/reference.rb', line 4 def start_verse @start_verse end |
Class Method Details
.from_verse_ids(start_verse_id, end_verse_id = nil) ⇒ Reference
Initialize a BibleBot::Reference from Verse IDs. If no end_verse_id is provided, it will set end_verse to equal start_verse.
15 16 17 18 19 20 |
# File 'lib/bible_bot/reference.rb', line 15 def self.from_verse_ids(start_verse_id, end_verse_id=nil) new( start_verse: Verse.from_id(start_verse_id), end_verse: Verse.from_id(end_verse_id || start_verse_id), ) end |
.parse(text, validate: true) ⇒ Array<Reference>
Parse text into an array of scripture References.
30 31 32 33 34 35 36 37 38 |
# File 'lib/bible_bot/reference.rb', line 30 def self.parse(text, validate: true) return [] if text.nil? || text.strip == "" ReferenceMatch.scan(text).map(&:reference).select do |ref| ref.validate! if validate == :raise_errors !validate || ref.valid? end end |
Instance Method Details
#formatted(include_chapter_on_single_chapter_books: false) ⇒ String
Returns a formatted string of the BibleBot::Reference.
53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/bible_bot/reference.rb', line 53 def formatted(include_chapter_on_single_chapter_books: false) formatted_verses = [start_verse.formatted(include_verse: !full_chapters?, include_chapter_on_single_chapter_books: include_chapter_on_single_chapter_books)] if end_verse && end_verse > start_verse && !(same_start_and_end_chapter? && full_chapters?) formatted_verses << end_verse.formatted( include_book: !same_start_and_end_book?, include_chapter: !same_start_and_end_chapter?, include_verse: !full_chapters?, ) end formatted_verses.join('-') end |
#full_chapters? ⇒ Boolean
One or multiple full chapters.
81 82 83 |
# File 'lib/bible_bot/reference.rb', line 81 def full_chapters? start_verse.verse_number == 1 && end_verse&.last_verse_in_chapter? end |
#includes_verse?(verse) ⇒ Boolean
Returns true if the given verse is within the start and end verse of the Reference.
94 95 96 97 98 |
# File 'lib/bible_bot/reference.rb', line 94 def includes_verse?(verse) return false unless verse.is_a?(Verse) start_verse <= verse && verse <= end_verse end |
#inspect ⇒ Hash
130 131 132 133 134 135 |
# File 'lib/bible_bot/reference.rb', line 130 def inspect { start_verse: start_verse&.formatted, end_verse: end_verse&.formatted, } end |
#intersects_reference?(other) ⇒ Boolean
Return true if the two references contain any of the same verses.
103 104 105 106 107 |
# File 'lib/bible_bot/reference.rb', line 103 def intersects_reference?(other) return false unless other.is_a?(Reference) start_verse <= other.end_verse && end_verse >= other.start_verse end |
#same_start_and_end_book? ⇒ Boolean
68 69 70 |
# File 'lib/bible_bot/reference.rb', line 68 def same_start_and_end_book? start_verse.book == end_verse&.book end |
#same_start_and_end_chapter? ⇒ Boolean
73 74 75 76 |
# File 'lib/bible_bot/reference.rb', line 73 def same_start_and_end_chapter? same_start_and_end_book? && start_verse.chapter_number == end_verse&.chapter_number end |
#to_s ⇒ string
86 87 88 |
# File 'lib/bible_bot/reference.rb', line 86 def to_s "BibleBot::Reference — #{formatted}" end |
#valid? ⇒ Boolean
138 139 140 |
# File 'lib/bible_bot/reference.rb', line 138 def valid? start_verse&.valid? && end_verse&.valid? && end_verse >= start_verse end |
#validate! ⇒ Object
Raises error if reference is invalid
143 144 145 146 147 |
# File 'lib/bible_bot/reference.rb', line 143 def validate! start_verse&.validate! end_verse&.validate! raise InvalidReferenceError.new "Reference is not vaild: #{inspect}" unless valid? end |
#verses ⇒ Array<Verse>
Returns an array of all the verses contained in the Reference.
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/bible_bot/reference.rb', line 112 def verses return @verses if defined? @verses @verses = [] return @verses unless valid? verse = start_verse loop do @verses << verse break if end_verse.nil? || verse == end_verse verse = verse.next_verse end @verses end |