scriptura 0.0.1

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.
@@ -0,0 +1,25 @@
1
+ module ScriptureMeta
2
+ def self.old_testament_books
3
+ books = []
4
+ (1..39).each do |book_number|
5
+ books << ScriptureBook.new(book_number)
6
+ end
7
+ books
8
+ end
9
+
10
+ def self.new_testament_books
11
+ books = []
12
+ (40..66).each do |book_number|
13
+ books << ScriptureBook.new(book_number)
14
+ end
15
+ books
16
+ end
17
+
18
+ def self.books
19
+ old_testament_books + new_testament_books
20
+ end
21
+
22
+ def self.book_names
23
+ books.map(&:name)
24
+ end
25
+ end
@@ -0,0 +1,67 @@
1
+ module ScriptureMeta
2
+ class ScriptureBook
3
+ def initialize(number)
4
+ raise ArgumentError, 'book number cannot be converted to an integer' unless number.respond_to?(:to_i)
5
+ raise 'book number should be within 1-66' unless (1..66).cover?(number.to_i)
6
+ @number = number.to_i
7
+ end
8
+
9
+ def self.find_by_name name
10
+ hash = METADATA.find{|book| book['name'] == name}
11
+ raise "Book by the name #{name} was not found! Check if there was a spelling error.. or try initializing it with a book number" if hash.nil?
12
+ self.new(hash['number'])
13
+ end
14
+
15
+ def self.find string_id
16
+ hash = METADATA.find{|book| book['string_id'] == string_id}
17
+ raise "Book by the string_id #{string_id} was not found! Check if there was a spelling error.. or try initializing it with a book number" if hash.nil?
18
+ self.new(hash['number'])
19
+ end
20
+
21
+ def name
22
+ book_hash['name']
23
+ end
24
+
25
+ def abbr_name
26
+ book_hash['abbr']
27
+ end
28
+
29
+ def number_of_chapters
30
+ book_hash['chapters'].count
31
+ end
32
+
33
+ def number
34
+ book_hash['number']
35
+ end
36
+
37
+ def first_chapter
38
+ @first_chapter ||= ScriptureChapter.new(self.number, 1)
39
+ end
40
+
41
+ def last_chapter
42
+ @last_chapter ||= ScriptureChapter.new(self.number, self.number_of_chapters)
43
+ end
44
+
45
+ def first_chapter_number
46
+ first_chapter.number
47
+ end
48
+
49
+ def last_chapter_number
50
+ last_chapter.number
51
+ end
52
+
53
+ def to_hash
54
+ book_hash
55
+ end
56
+
57
+ def string_id
58
+ book_hash['string_id']
59
+ end
60
+
61
+ private
62
+
63
+ def book_hash
64
+ @book_hash ||= METADATA.find{|book| book['number'] == @number.to_i}
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,43 @@
1
+ module ScriptureMeta
2
+ class ScriptureChapter
3
+ attr_accessor :scripture_book
4
+
5
+ def initialize book_number, chapter_number
6
+ @scripture_book = ScriptureBook.new(book_number)
7
+ raise ArgumentError, 'chapter number cannot be converted to an integer' unless chapter_number.respond_to?(:to_i)
8
+ raise 'book number should be within 1-66' unless (1..66).cover?(book_number.to_i)
9
+ @number = chapter_number.to_i
10
+ raise 'chapter does not exist' if chapter_hash.nil?
11
+ end
12
+
13
+ def number
14
+ chapter_hash['number']
15
+ end
16
+
17
+ def number_of_verses
18
+ chapter_hash['verses']
19
+ end
20
+
21
+ def first_verse
22
+ @first_verse = ScriptureVerse.new(scripture_book.number, self.number, 1)
23
+ end
24
+
25
+ def last_verse
26
+ @first_verse = ScriptureVerse.new(scripture_book.number, self.number, self.number_of_verses)
27
+ end
28
+
29
+ def first_verse_number
30
+ first_verse.number
31
+ end
32
+
33
+ def last_verse_number
34
+ last_verse.number
35
+ end
36
+
37
+ private
38
+
39
+ def chapter_hash
40
+ @chapter_hash ||= @scripture_book.to_hash['chapters'].find{|chapter| chapter['number'] == @number.to_i}
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,56 @@
1
+ module ScriptureMeta
2
+ class ScriptureReference
3
+ attr_accessor :start_verse
4
+ attr_accessor :end_verse
5
+
6
+ def initialize start_verse, end_verse
7
+ @start_verse = start_verse
8
+ @end_verse = end_verse
9
+ end
10
+
11
+ def within_same_book?
12
+ start_verse.scripture_book.number == end_verse.scripture_book.number
13
+ end
14
+
15
+ def within_same_chapter?
16
+ within_same_book? &&
17
+ start_verse.scripture_chapter.number == end_verse.scripture_chapter.number
18
+ end
19
+
20
+ def spans_entire_book?
21
+ within_same_book? &&
22
+ start_verse.scripture_chapter.number == start_verse.scripture_book.first_chapter.number &&
23
+ start_verse.number == start_verse.scripture_chapter.first_verse.number &&
24
+ end_verse.scripture_chapter.number == end_verse.scripture_book.last_chapter.number &&
25
+ end_verse.number == end_verse.scripture_chapter.last_verse.number
26
+ end
27
+
28
+ def spans_entire_chapter?
29
+ within_same_chapter? &&
30
+ start_verse.number == start_verse.scripture_chapter.first_verse.number &&
31
+ end_verse.number == end_verse.scripture_chapter.last_verse.number
32
+ end
33
+
34
+ def spans_single_verse?
35
+ within_same_chapter? &&
36
+ start_verse.number == end_verse.number
37
+ end
38
+
39
+ def to_s
40
+ case
41
+ when self.spans_entire_book?
42
+ start_verse.scripture_book.name
43
+ when self.spans_entire_chapter?
44
+ "#{start_verse.scripture_book.name} #{start_verse.scripture_chapter.number}"
45
+ when self.spans_single_verse?
46
+ "#{start_verse.scripture_book.name} #{start_verse.scripture_chapter.number}:#{start_verse.number}"
47
+ when within_same_chapter?
48
+ "#{start_verse.scripture_book.name} #{start_verse.scripture_chapter.number}:#{start_verse.number}-#{end_verse.number}"
49
+ when within_same_book?
50
+ "#{start_verse.scripture_book.name} #{start_verse.scripture_chapter.number}:#{start_verse.number} - #{end_verse.scripture_chapter.number}:#{end_verse.number}"
51
+ else
52
+ "#{start_verse.scripture_book.name} #{start_verse.scripture_chapter.number}:#{start_verse.number} - #{end_verse.scripture_book.name} #{end_verse.scripture_chapter.number}:#{end_verse.number}"
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,37 @@
1
+ module ScriptureMeta
2
+ class ScriptureVerse
3
+ attr_accessor :scripture_chapter
4
+ attr_accessor :number
5
+
6
+ def initialize *args
7
+ case
8
+ when args.count == 1 && args[0].is_a?(Fixnum)
9
+ raise ArgumentError, 'normalized value of scripture verse cannot be converted to an integer' unless args[0].respond_to?(:to_i)
10
+ book_number, chapter_number, verse_number = de_normalize(args[0])
11
+ when args.count == 3
12
+ book_number, chapter_number, verse_number = args
13
+ end
14
+ @scripture_chapter = ScriptureChapter.new(book_number, chapter_number)
15
+ raise ArgumentError, 'verse number cannot be converted to an integer' unless verse_number.respond_to?(:to_i)
16
+ raise 'verse number does not exist' unless (1..@scripture_chapter.number_of_verses).cover? verse_number.to_i
17
+ @number = verse_number.to_i
18
+ end
19
+
20
+ def scripture_book
21
+ @scripture_chapter.scripture_book
22
+ end
23
+
24
+ def normalize
25
+ scripture_book.number * 1000000 + scripture_chapter.number * 1000 + @number
26
+ end
27
+
28
+ private
29
+
30
+ def de_normalize number
31
+ quotient, verse_number = number.divmod(1000)
32
+ book_number, chapter_number = quotient.divmod(1000)
33
+ [book_number, chapter_number, verse_number]
34
+ end
35
+
36
+ end
37
+ end
data/lib/scriptura.rb ADDED
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'scriptura/data'
3
+ require 'scriptura/scripture'
4
+ require 'scriptura/scripture_book'
5
+ require 'scriptura/scripture_chapter'
6
+ require 'scriptura/scripture_verse'
7
+ require 'scriptura/scripture_reference'
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scriptura
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gagan Awhad
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: This is a ruby library that provides operations related with meta information
28
+ about the Bible
29
+ email:
30
+ - gagan.a.awhad@gmail.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - lib/scriptura/data.rb
36
+ - lib/scriptura/scripture.rb
37
+ - lib/scriptura/scripture_book.rb
38
+ - lib/scriptura/scripture_chapter.rb
39
+ - lib/scriptura/scripture_reference.rb
40
+ - lib/scriptura/scripture_verse.rb
41
+ - lib/scriptura.rb
42
+ - README.md
43
+ - LICENSE
44
+ homepage: https://www.github.com/gaganawhad/scriptura
45
+ licenses: []
46
+ metadata: {}
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 2.0.3
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: This is a ruby library that provides operations related with meta information
67
+ about the Bible
68
+ test_files: []
69
+ has_rdoc: