biblesearch-api 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/HISTORY.md +3 -0
- data/LICENSE +22 -0
- data/README.md +91 -0
- data/Rakefile +24 -0
- data/biblesearch-api.gemspec +25 -0
- data/lib/biblesearch-api.rb +87 -0
- data/lib/biblesearch-api/api_interface.rb +58 -0
- data/lib/biblesearch-api/client_version.rb +3 -0
- data/lib/biblesearch-api/endpoints/books.rb +38 -0
- data/lib/biblesearch-api/endpoints/chapters.rb +47 -0
- data/lib/biblesearch-api/endpoints/passages.rb +22 -0
- data/lib/biblesearch-api/endpoints/search.rb +24 -0
- data/lib/biblesearch-api/endpoints/verses.rb +42 -0
- data/lib/biblesearch-api/endpoints/versions.rb +28 -0
- data/spec/biblesearch-api/endpoints/books_spec.rb +128 -0
- data/spec/biblesearch-api/endpoints/chapters_spec.rb +154 -0
- data/spec/biblesearch-api/endpoints/fumsify_for_all_endpoints_spec.rb +75 -0
- data/spec/biblesearch-api/endpoints/passages_spec.rb +85 -0
- data/spec/biblesearch-api/endpoints/search_spec.rb +36 -0
- data/spec/biblesearch-api/endpoints/verses_spec.rb +152 -0
- data/spec/biblesearch-api/endpoints/versions_spec.rb +91 -0
- data/spec/biblesearch-api/pathtest.rb +1 -0
- data/spec/biblesearch-api_spec.rb +137 -0
- data/spec/spec_helper.rb +12 -0
- metadata +199 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
class BibleSearch
|
2
|
+
module Search
|
3
|
+
def search(query, options = {})
|
4
|
+
options = options.merge({:query => query})
|
5
|
+
|
6
|
+
result = Hashie::Mash.new
|
7
|
+
api_result = get_mash("/search.js", :query => options)
|
8
|
+
|
9
|
+
if api_result.meta.http_code == 200
|
10
|
+
api_result.response.search.tap do |search_response|
|
11
|
+
result.type = search_response.result.type
|
12
|
+
result.summary = search_response.result.summary
|
13
|
+
if result.type == 'passages'
|
14
|
+
result.passages = pluralize_result(search_response.result.passages)
|
15
|
+
elsif result.type == 'verses'
|
16
|
+
result.verses = pluralize_result(search_response.result.verses)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
fumsify(api_result, result)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class BibleSearch
|
2
|
+
module Verses
|
3
|
+
def verses(chapter_id, start_verse="", end_verse="")
|
4
|
+
|
5
|
+
verses = []
|
6
|
+
api_result = get_mash("/chapters/#{chapter_id}/verses.js", :query => {:start => start_verse, :end => end_verse})
|
7
|
+
if api_result.meta.http_code == 200
|
8
|
+
verses = pluralize_result(api_result.response.verses)
|
9
|
+
end
|
10
|
+
|
11
|
+
fumsify(api_result, verses)
|
12
|
+
end
|
13
|
+
|
14
|
+
def verse(verse_sig)
|
15
|
+
|
16
|
+
# Validate a signature hash, calling its string sig equivalent if valid
|
17
|
+
if verse_sig.is_a?(Hash)
|
18
|
+
unless required_keys_present?(verse_sig, [:version_id, :book_id, :chapter, :verse])
|
19
|
+
raise ArgumentError.new('Verse signature hash must include :version_id, :book_id, :chapter, and :verse')
|
20
|
+
end
|
21
|
+
|
22
|
+
return verse("#{verse_sig[:version_id]}:#{verse_sig[:book_id]}.#{verse_sig[:chapter]}.#{verse_sig[:verse]}")
|
23
|
+
end
|
24
|
+
|
25
|
+
# Validate a signature string, returning a verse Mash if valid and the
|
26
|
+
# remote request succeeds
|
27
|
+
if verse_sig.is_a?(String)
|
28
|
+
unless verse_sig.match(/([A-Za-z0-9]+-)?[A-Za-z0-9]+:[A-Za-z0-9]+\.[0-9]+\.[0-9]+/)
|
29
|
+
raise ArgumentError.new('Verse signature must be in the form "VERSION_ID:BOOK_ID.CHAPTER_NUMBER.VERSE_NUMBER"')
|
30
|
+
end
|
31
|
+
|
32
|
+
verse = nil
|
33
|
+
api_result = get_mash("/verses/#{verse_sig}.js")
|
34
|
+
if api_result.meta.http_code == 200
|
35
|
+
verse = api_result.response.verses.first
|
36
|
+
end
|
37
|
+
|
38
|
+
return fumsify(api_result, verse)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class BibleSearch
|
2
|
+
module Versions
|
3
|
+
def versions(options = {})
|
4
|
+
api_endpoint = '/versions.js'
|
5
|
+
unless options[:language].nil?
|
6
|
+
api_endpoint += %{?language=#{options[:language]}}
|
7
|
+
end
|
8
|
+
|
9
|
+
versions = []
|
10
|
+
api_result = get_mash(api_endpoint)
|
11
|
+
if api_result.meta.http_code == 200
|
12
|
+
versions = pluralize_result(api_result.response.versions)
|
13
|
+
end
|
14
|
+
|
15
|
+
fumsify(api_result, versions)
|
16
|
+
end
|
17
|
+
|
18
|
+
def version(version_id)
|
19
|
+
version = nil
|
20
|
+
api_result = get_mash("/versions/#{version_id.upcase}.js")
|
21
|
+
if api_result.meta.http_code == 200
|
22
|
+
version = api_result.response.versions.first
|
23
|
+
end
|
24
|
+
|
25
|
+
fumsify(api_result, version)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'biblesearch-api'
|
3
|
+
|
4
|
+
describe BibleSearch do
|
5
|
+
before do
|
6
|
+
VCR.insert_cassette %{endpoint-#{File.basename(__FILE__, '.rb')}-#{__name__}}
|
7
|
+
@biblesearch = BibleSearch.new('DUMMY_API_KEY')
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
VCR.eject_cassette
|
12
|
+
end
|
13
|
+
|
14
|
+
describe %{books} do
|
15
|
+
it %{requires a version id} do
|
16
|
+
lambda { @biblesearch.books }.must_raise ArgumentError
|
17
|
+
(lambda { @biblesearch.books('GNT') }.call rescue $!).wont_be_kind_of ArgumentError
|
18
|
+
end
|
19
|
+
|
20
|
+
it %{accepts an optional testament id} do
|
21
|
+
all_cool = lambda { @biblesearch.books('GNT', 'OT') }
|
22
|
+
(all_cool.call rescue $!).wont_be_kind_of ArgumentError
|
23
|
+
end
|
24
|
+
|
25
|
+
describe %{when I make a valid request} do
|
26
|
+
before do
|
27
|
+
@books = @biblesearch.books('GNT')
|
28
|
+
end
|
29
|
+
|
30
|
+
it %{has a collection} do
|
31
|
+
@books.collection.must_be_kind_of(Array)
|
32
|
+
end
|
33
|
+
|
34
|
+
it %{contains books} do
|
35
|
+
@books.collection.length.must_be :>, 0
|
36
|
+
@books.collection.each do |book|
|
37
|
+
book.must_respond_to(:version_id)
|
38
|
+
book.must_respond_to(:name)
|
39
|
+
book.must_respond_to(:abbr)
|
40
|
+
book.must_respond_to(:ord)
|
41
|
+
book.must_respond_to(:book_group_id)
|
42
|
+
book.must_respond_to(:testament)
|
43
|
+
book.must_respond_to(:id)
|
44
|
+
book.must_respond_to(:osis_end)
|
45
|
+
book.must_respond_to(:parent)
|
46
|
+
book.must_respond_to(:copyright)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe %{when I make a bad request} do
|
52
|
+
before do
|
53
|
+
@books = @biblesearch.books('SupDawg')
|
54
|
+
end
|
55
|
+
|
56
|
+
it %{has a collection} do
|
57
|
+
@books.collection.must_be_instance_of Array
|
58
|
+
end
|
59
|
+
|
60
|
+
it %{contains no items} do
|
61
|
+
@books.collection.length.must_equal 0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe %{book} do
|
68
|
+
describe %{given a book signature} do
|
69
|
+
describe %{as a string} do
|
70
|
+
it %{raises an argument error for bad input} do
|
71
|
+
bad_book_string = lambda { @biblesearch.book('SupDawg') }
|
72
|
+
bad_book_string.must_raise ArgumentError
|
73
|
+
(bad_book_string.call rescue $!).message.must_equal 'Book signature must be in the form "VERSION_ID:BOOK_ID"'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe %{as a hash} do
|
78
|
+
before do
|
79
|
+
@options = {
|
80
|
+
:version_id => 'GNT',
|
81
|
+
:book_id => '2Tim'
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
describe %{if any pieces are missing} do
|
86
|
+
it %{raises an argument error} do
|
87
|
+
@options.keys.each do |key|
|
88
|
+
options = @options
|
89
|
+
options.delete(key)
|
90
|
+
bad_book_hash = lambda { @biblesearch.book(options) }
|
91
|
+
bad_book_hash.must_raise ArgumentError
|
92
|
+
(bad_book_hash.call rescue $!).message.must_equal 'Book signature hash must include :version_id and :book_id'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe %{with a complete hash} do
|
98
|
+
it %{returns the same thing as the equivalent string sig} do
|
99
|
+
@biblesearch.book(@options).value.must_equal @biblesearch.book('GNT:2Tim').value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe %{when I make a valid request} do
|
105
|
+
it %{has a book value} do
|
106
|
+
@biblesearch.book('GNT:2Tim').value.tap do |book|
|
107
|
+
book.must_respond_to(:version_id)
|
108
|
+
book.must_respond_to(:name)
|
109
|
+
book.must_respond_to(:abbr)
|
110
|
+
book.must_respond_to(:ord)
|
111
|
+
book.must_respond_to(:book_group_id)
|
112
|
+
book.must_respond_to(:testament)
|
113
|
+
book.must_respond_to(:id)
|
114
|
+
book.must_respond_to(:osis_end)
|
115
|
+
book.must_respond_to(:parent)
|
116
|
+
book.must_respond_to(:copyright)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe %{when I request an invalid book} do
|
122
|
+
it %{returns nil} do
|
123
|
+
@biblesearch.book('GNT:Batman').value.must_be_nil
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'biblesearch-api'
|
3
|
+
|
4
|
+
describe BibleSearch do
|
5
|
+
before do
|
6
|
+
VCR.insert_cassette %{endpoint-#{File.basename(__FILE__, '.rb')}-#{__name__}}
|
7
|
+
@biblesearch = BibleSearch.new('DUMMY_API_KEY')
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
VCR.eject_cassette
|
12
|
+
end
|
13
|
+
|
14
|
+
describe %{#chapters} do
|
15
|
+
|
16
|
+
describe %{given a book signature} do
|
17
|
+
describe %{as a string} do
|
18
|
+
it %{raises an argument error for bad input} do
|
19
|
+
bad_book_string = lambda { @biblesearch.chapters('SupDawg') }
|
20
|
+
bad_book_string.must_raise ArgumentError
|
21
|
+
(bad_book_string.call rescue $!).message.must_equal 'Book signature must be in the form "VERSION_ID:BOOK_ID"'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe %{as a hash} do
|
26
|
+
before do
|
27
|
+
@options = {
|
28
|
+
:version_id => 'GNT',
|
29
|
+
:book_id => '2Tim'
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
describe %{if any pieces are missing} do
|
34
|
+
it %{raises an argument error} do
|
35
|
+
@options.keys.each do |key|
|
36
|
+
options = @options
|
37
|
+
options.delete(key)
|
38
|
+
bad_book_hash = lambda { @biblesearch.chapters(options) }
|
39
|
+
bad_book_hash.must_raise ArgumentError
|
40
|
+
(bad_book_hash.call rescue $!).message.must_equal "Book signature hash must include :version_id and :book_id"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe %{with a complete hash} do
|
46
|
+
it %{returns the same thing as the equivalent string sig} do
|
47
|
+
@biblesearch.chapters(@options).collection.must_equal @biblesearch.chapters('GNT:2Tim').collection
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe %{when I make a valid request} do
|
54
|
+
before do
|
55
|
+
@chapters = @biblesearch.chapters('GNT:2Tim')
|
56
|
+
end
|
57
|
+
|
58
|
+
it %{has a collection} do
|
59
|
+
@chapters.collection.must_be_instance_of Array
|
60
|
+
end
|
61
|
+
|
62
|
+
it %{should contain chapters} do
|
63
|
+
@chapters.collection.length.must_be :>, 0
|
64
|
+
@chapters.collection.each do |chapter|
|
65
|
+
chapter.must_respond_to(:auditid)
|
66
|
+
chapter.must_respond_to(:label)
|
67
|
+
chapter.must_respond_to(:chapter)
|
68
|
+
chapter.must_respond_to(:id)
|
69
|
+
chapter.must_respond_to(:osis_end)
|
70
|
+
chapter.must_respond_to(:parent)
|
71
|
+
chapter.must_respond_to(:next)
|
72
|
+
chapter.must_respond_to(:previous)
|
73
|
+
chapter.must_respond_to(:copyright)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe %{when I make a bad request} do
|
79
|
+
before do
|
80
|
+
@chapters = @biblesearch.chapters('GNT:Batman')
|
81
|
+
end
|
82
|
+
|
83
|
+
it %{has a collection} do
|
84
|
+
@chapters.collection.must_be_instance_of Array
|
85
|
+
end
|
86
|
+
|
87
|
+
it %{contains no items} do
|
88
|
+
@chapters.collection.length.must_equal 0
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe %{#chapter} do
|
94
|
+
describe %{given a chapter signature} do
|
95
|
+
describe %{as a string} do
|
96
|
+
it %{raises an argument error for bad input} do
|
97
|
+
bad_chapter_string = lambda { @biblesearch.chapter('SupDawg') }
|
98
|
+
bad_chapter_string.must_raise ArgumentError
|
99
|
+
(bad_chapter_string.call rescue $!).message.must_equal 'Chapter signature must be in the form "VERSION_ID:BOOK_ID.CHAPTER_NUMBER"'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe %{as a hash} do
|
104
|
+
before do
|
105
|
+
@options = {
|
106
|
+
:version_id => 'GNT',
|
107
|
+
:book_id => '2Tim',
|
108
|
+
:chapter => 1
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
describe %{if any pieces are missing} do
|
113
|
+
it %{raises an argument error} do
|
114
|
+
@options.keys.each do |key|
|
115
|
+
options = @options
|
116
|
+
options.delete(key)
|
117
|
+
bad_chapter_hash = lambda { @biblesearch.chapter(options) }
|
118
|
+
bad_chapter_hash.must_raise ArgumentError
|
119
|
+
(bad_chapter_hash.call rescue $!).message.must_equal "Chapter signature hash must include :version_id, :book_id, and :chapter"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe %{with a complete hash} do
|
125
|
+
it %{returns the same thing as the equivalent string sig} do
|
126
|
+
@biblesearch.chapter(@options).value.must_equal @biblesearch.chapter('GNT:2Tim.1').value
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe %{when I make a valid request} do
|
133
|
+
it %{has a chapter value} do
|
134
|
+
@biblesearch.chapter('GNT:2Tim.1').value.tap do |chapter|
|
135
|
+
chapter.must_respond_to(:auditid)
|
136
|
+
chapter.must_respond_to(:label)
|
137
|
+
chapter.must_respond_to(:chapter)
|
138
|
+
chapter.must_respond_to(:id)
|
139
|
+
chapter.must_respond_to(:osis_end)
|
140
|
+
chapter.must_respond_to(:parent)
|
141
|
+
chapter.must_respond_to(:next)
|
142
|
+
chapter.must_respond_to(:previous)
|
143
|
+
chapter.must_respond_to(:copyright)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe %{when I request an invalid chapter} do
|
149
|
+
it %{has a nil value} do
|
150
|
+
@biblesearch.chapter('GNT:Batman.1').value.must_be_nil
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'biblesearch-api'
|
3
|
+
|
4
|
+
describe BibleSearch do
|
5
|
+
before do
|
6
|
+
VCR.insert_cassette %{#{File.basename(__FILE__, '.rb')}-#{__name__}}
|
7
|
+
@biblesearch = BibleSearch.new('DUMMY_API_KEY')
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
VCR.eject_cassette
|
12
|
+
end
|
13
|
+
|
14
|
+
describe %{the Books endpoint} do
|
15
|
+
it %{has real fums for all valid requests} do
|
16
|
+
@biblesearch.books('GNT').fums.wont_be_nil
|
17
|
+
@biblesearch.book('GNT:2Tim').fums.wont_be_nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it %{has nil fums for bad requests} do
|
21
|
+
@biblesearch.books('Gotham').fums.must_be_nil
|
22
|
+
@biblesearch.book('Gotham:Batman').fums.must_be_nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe %{the Chapters endpoint} do
|
27
|
+
it %{has real fums for all valid requests} do
|
28
|
+
@biblesearch.chapters('GNT:2Tim').fums.wont_be_nil
|
29
|
+
@biblesearch.chapter('GNT:2Tim.1').fums.wont_be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it %{has nil fums for bad requests} do
|
33
|
+
@biblesearch.chapters('Gotham:Batman').fums.must_be_nil
|
34
|
+
@biblesearch.chapter('Gotham:Bataman.1').fums.must_be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe %{the Passages endpoint} do
|
39
|
+
it %{has real fums for all requests} do
|
40
|
+
@biblesearch.passages('John 3:16', :version => 'KJV').fums.wont_be_nil
|
41
|
+
@biblesearch.passages('Batman 13:17', :version => 'DCU').fums.wont_be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe %{the Search endpoint} do
|
46
|
+
it %{has real fums for all requests} do
|
47
|
+
@biblesearch.search('john 3:16').fums.wont_be_nil
|
48
|
+
@biblesearch.search('batman 13:17').fums.wont_be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe %{the Verses endpoint} do
|
53
|
+
it %{has real fums for all valid requests} do
|
54
|
+
@biblesearch.verses('KJV:John.3', '16', '16').fums.wont_be_nil
|
55
|
+
@biblesearch.verse('GNT:Acts.8.34').fums.wont_be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it %{has nil fums for bad requests} do
|
59
|
+
@biblesearch.verses('Gotham:Batman', '13', '17').fums.must_be_nil
|
60
|
+
@biblesearch.verses('Metropolis:Superman.1.2').fums.must_be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe %{the Versions endpoint} do
|
65
|
+
it %{has real fums for all valid requests} do
|
66
|
+
@biblesearch.versions.fums.wont_be_nil
|
67
|
+
@biblesearch.version('GNT').fums.wont_be_nil
|
68
|
+
end
|
69
|
+
|
70
|
+
it %{has nil fums for bad requests} do
|
71
|
+
@biblesearch.version('Gotham').fums.must_be_nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|