bomdb 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +20 -5
- data/README.md +63 -3
- data/bomdb.gemspec +2 -1
- data/data/book_of_mormon.db +0 -0
- data/lib/bomdb.rb +1 -0
- data/lib/bomdb/export/verses.rb +8 -4
- data/lib/bomdb/import/verses.rb +23 -15
- data/lib/bomdb/models/verse.rb +14 -5
- data/lib/bomdb/query.rb +33 -1
- data/lib/bomdb/schema.rb +2 -0
- data/lib/bomdb/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7fbd83f638d94be3f15c4cf8442e2cdeccf8b1e
|
4
|
+
data.tar.gz: 2625af19b7be4478cd1abf1a39900ff41d21e10c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c3d9acb48871cf5676c901c3d45b233a4d7e208da3d873b5b63930a2dbbe3d8456472b3045597f61493f8181b468f7d9a82defe4354d4252857ad2ded14ddcd
|
7
|
+
data.tar.gz: 58c3914913e18e8aa645997b13599d33e4c5876ce9fbf0e0928fd17e8603baf20ef87dd50f20822922fc2761fe2e6db5907fe58f0d8350012ffff667c62d8e48
|
data/Gemfile.lock
CHANGED
@@ -1,18 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bomdb (0.
|
4
|
+
bomdb (0.5.0)
|
5
5
|
colorize (~> 0.7)
|
6
6
|
constellation (~> 0.1)
|
7
7
|
levenshtein-ffi (~> 1.1)
|
8
|
+
mericope (~> 0.1.1)
|
8
9
|
sequel (~> 4.21)
|
9
10
|
sqlite3 (~> 1.3)
|
10
|
-
text_clean
|
11
|
+
text_clean (~> 0)
|
11
12
|
thor (~> 0.19)
|
12
13
|
|
13
14
|
GEM
|
14
15
|
remote: https://rubygems.org/
|
15
16
|
specs:
|
17
|
+
activesupport (4.2.1)
|
18
|
+
i18n (~> 0.7)
|
19
|
+
json (~> 1.7, >= 1.7.7)
|
20
|
+
minitest (~> 5.1)
|
21
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
22
|
+
tzinfo (~> 1.1)
|
16
23
|
byebug (4.0.5)
|
17
24
|
columnize (= 0.9.0)
|
18
25
|
colorize (0.7.5)
|
@@ -20,18 +27,23 @@ GEM
|
|
20
27
|
constellation (0.1.1)
|
21
28
|
multi_json
|
22
29
|
diff-lcs (1.2.5)
|
23
|
-
ffi (1.9.
|
30
|
+
ffi (1.9.8)
|
31
|
+
i18n (0.7.0)
|
32
|
+
json (1.8.2)
|
24
33
|
levenshtein-ffi (1.1.0)
|
25
34
|
ffi (~> 1.9)
|
35
|
+
mericope (0.1.1)
|
36
|
+
activesupport (~> 4.0)
|
37
|
+
minitest (5.6.0)
|
26
38
|
multi_json (1.11.0)
|
27
39
|
rake (10.4.2)
|
28
40
|
rspec (3.2.0)
|
29
41
|
rspec-core (~> 3.2.0)
|
30
42
|
rspec-expectations (~> 3.2.0)
|
31
43
|
rspec-mocks (~> 3.2.0)
|
32
|
-
rspec-core (3.2.
|
44
|
+
rspec-core (3.2.3)
|
33
45
|
rspec-support (~> 3.2.0)
|
34
|
-
rspec-expectations (3.2.
|
46
|
+
rspec-expectations (3.2.1)
|
35
47
|
diff-lcs (>= 1.2.0, < 2.0)
|
36
48
|
rspec-support (~> 3.2.0)
|
37
49
|
rspec-mocks (3.2.1)
|
@@ -42,6 +54,9 @@ GEM
|
|
42
54
|
sqlite3 (1.3.10)
|
43
55
|
text_clean (0.2.2)
|
44
56
|
thor (0.19.1)
|
57
|
+
thread_safe (0.3.5)
|
58
|
+
tzinfo (1.2.2)
|
59
|
+
thread_safe (~> 0.1)
|
45
60
|
|
46
61
|
PLATFORMS
|
47
62
|
ruby
|
data/README.md
CHANGED
@@ -117,7 +117,14 @@ Suppose you have a new Book of Mormon text file that has been scanned from OCR o
|
|
117
117
|
Given this text:
|
118
118
|
|
119
119
|
```
|
120
|
-
I, Nephi, having been born of goodly parents, therefore I was taught somewhat
|
120
|
+
I, Nephi, having been born of goodly parents, therefore I was taught somewhat
|
121
|
+
in all the learning of my father; and having seen many afflictions in the course
|
122
|
+
of my days--nevertheless, having been highly favored of the Lord in all my days;
|
123
|
+
yea, having had a great knowledge of the goodness and the mysteries of God,
|
124
|
+
therefore I make a record of my proceedings in my days; yea, I make a record in
|
125
|
+
the language of my father, which consists of the learning of the Jews and the
|
126
|
+
language of the Egyptians. And I know that the record which I make is true; and
|
127
|
+
I make it with mine own hand; and I make it according to my knowledge.
|
121
128
|
```
|
122
129
|
|
123
130
|
You can automatically align and annotate it:
|
@@ -125,14 +132,67 @@ You can automatically align and annotate it:
|
|
125
132
|
```bash
|
126
133
|
$ bomdb align my_typed_bom.txt
|
127
134
|
|
128
|
-
|
135
|
+
1 Nephi 1:1 I, Nephi, having been born of goodly parents, therefore I was taught somewhat in all the learning of my father; and having seen many afflictions in the course of my days--nevertheless, having been highly favored of the Lord in all my days; yea, having had a great knowledge of the goodness and the mysteries of God, therefore I make a record of my proceedings in my days;
|
129
136
|
1 Nephi 1:2 yea, I make a record in the language of my father, which consists of the learning of the Jews and the language of the Egyptians.
|
130
137
|
1 Nephi 1:3 And I know that the record which I make is true; and I make it with mine own hand; and I make it according to my knowledge.
|
131
|
-
# ... shows 6601 more verses
|
132
138
|
```
|
133
139
|
|
134
140
|
Note that `align` requires the [dwdiff](http://linux.die.net/man/1/dwdiff) command on your system.
|
135
141
|
|
142
|
+
### Custom Queries
|
143
|
+
|
144
|
+
Here's a simple way to analyze the Book of Mormon to see the wherefore/therefore divergence leading to the [Mosiah Priority](http://signaturebookslibrary.org/new-approaches-to-the-book-of-mormon-10/) (Mosiah was written before 1 Nephi) hypothesis:
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
$ bundle exec irb -rbomdb
|
148
|
+
irb(main):001:0> q = BomDB::Query.new(exclude: 'Bible-OT')
|
149
|
+
=> #<BomDB::Query:0x007f90ad1cb408 @edition=1829, @exclude="Bible-OT", @headings=false>
|
150
|
+
irb(main):002:0> q.books.map{ |book,content| [book, content.scan(/wherefore/i).size, content.scan(/therefore/i).size] }
|
151
|
+
=> [
|
152
|
+
["1 Nephi", 99, 13], ["2 Nephi", 126, 6], ["Jacob", 53, 1],
|
153
|
+
["Enos", 6, 0], ["Jarom", 3, 0], ["Omni", 6, 0], ["Words of Mormon", 5, 0],
|
154
|
+
["Mosiah", 0, 122], ["Alma", 3, 288], ["Helaman", 0, 63],
|
155
|
+
["3 Nephi", 3, 96], ["4 Nephi", 0, 5], ["Mormon", 0, 22],
|
156
|
+
["Ether", 63, 26], ["Moroni", 38, 0]
|
157
|
+
]
|
158
|
+
```
|
159
|
+
|
160
|
+
Or perhaps a little more visually:
|
161
|
+
```ruby
|
162
|
+
require 'bomdb'
|
163
|
+
|
164
|
+
q = BomDB::Query.new(exclude: "Bible-OT")
|
165
|
+
|
166
|
+
q.books.each do |book,content|
|
167
|
+
words = content.scan(/ +/).size
|
168
|
+
puts book.ljust(18) +
|
169
|
+
'W' * (content.scan(/wherefore/i).size.to_f / words * 2000) +
|
170
|
+
'T' * (content.scan(/therefore/i).size.to_f / words * 2000)
|
171
|
+
end
|
172
|
+
|
173
|
+
# 1 Nephi WWWWWWWWT
|
174
|
+
# 2 Nephi WWWWWWWWWWWWWW
|
175
|
+
# Jacob WWWWWWWWWWW
|
176
|
+
# Enos WWWWWWWWWW
|
177
|
+
# Jarom WWWWWWWW
|
178
|
+
# Omni WWWWWWWW
|
179
|
+
# Words of Mormon WWWWWWWWWWW
|
180
|
+
# Mosiah TTTTTTTT
|
181
|
+
# Alma TTTTTT
|
182
|
+
# Helaman TTTTTT
|
183
|
+
# 3 Nephi TTTTTTT
|
184
|
+
# 4 Nephi TTTTT
|
185
|
+
# Mormon TTTT
|
186
|
+
# Ether WWWWWWWTTT
|
187
|
+
# Moroni WWWWWWWWWWWW
|
188
|
+
```
|
189
|
+
|
190
|
+
Other possible enumerables on a Query include:
|
191
|
+
|
192
|
+
- books: enumerate on each book of the Book of Mormon
|
193
|
+
- chapters: enumerate on each book and chapter of the Book of Mormon
|
194
|
+
- wordgroups(N): enumerate on consecutive N words, e.g. each 1000 words
|
195
|
+
|
136
196
|
## Installation
|
137
197
|
|
138
198
|
Ruby 2.1 is required. You should also have a normal build environment set up, e.g. command line tools on the mac, or GCC on Linux.
|
data/bomdb.gemspec
CHANGED
@@ -24,8 +24,9 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency 'thor', '~> 0.19'
|
25
25
|
spec.add_dependency 'constellation', '~> 0.1'
|
26
26
|
spec.add_dependency 'colorize', '~> 0.7'
|
27
|
-
spec.add_dependency 'text_clean'
|
27
|
+
spec.add_dependency 'text_clean', '~> 0'
|
28
28
|
spec.add_dependency 'levenshtein-ffi', '~> 1.1'
|
29
|
+
spec.add_dependency 'mericope', '~> 0.1.1'
|
29
30
|
|
30
31
|
# spec.add_development_dependency 'bundler', '~> 1.7'
|
31
32
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/data/book_of_mormon.db
CHANGED
Binary file
|
data/lib/bomdb.rb
CHANGED
data/lib/bomdb/export/verses.rb
CHANGED
@@ -5,13 +5,17 @@ module BomDB
|
|
5
5
|
class Verses < Export::Base
|
6
6
|
def export_json
|
7
7
|
verses = []
|
8
|
-
@db[:verses].
|
8
|
+
@db[:verses].
|
9
|
+
join(:books, :book_id => :book_id).
|
9
10
|
where(:verse_heading => nil).
|
10
11
|
order(:book_sort, :verse_chapter).
|
11
|
-
select_group(:book_name, :verse_chapter).
|
12
|
-
select_append{ Sequel.as(max(:verse_number), :count) }.
|
13
12
|
each do |v|
|
14
|
-
verses << {
|
13
|
+
verses << {
|
14
|
+
range_id: v[:verse_range_id],
|
15
|
+
book: v[:book_name],
|
16
|
+
chapter: v[:verse_chapter],
|
17
|
+
verse: v[:verse_number]
|
18
|
+
}
|
15
19
|
end
|
16
20
|
Export::Result.new(success: true, body: JSON.pretty_generate(verses))
|
17
21
|
end
|
data/lib/bomdb/import/verses.rb
CHANGED
@@ -9,30 +9,38 @@ module BomDB
|
|
9
9
|
# Expected data format is:
|
10
10
|
# [
|
11
11
|
# {
|
12
|
-
# "
|
13
|
-
# "
|
14
|
-
# "
|
12
|
+
# "range_id": Int, # the mericope range ID
|
13
|
+
# "book": String, # the name of the book, e.g. 1 Nephi
|
14
|
+
# "chapter": Int, # the chapter number
|
15
|
+
# "verse": Int # the verse number
|
15
16
|
# },
|
16
17
|
# ...
|
17
18
|
# ]
|
18
19
|
def import_json(data, **args)
|
20
|
+
book, chapter = nil, nil
|
21
|
+
verse_model = Models::Verse.new(@db)
|
19
22
|
data.each do |r|
|
20
|
-
|
21
|
-
|
22
|
-
chapter: r['chapter'],
|
23
|
-
verse: nil,
|
24
|
-
book_name: r['book'],
|
25
|
-
heading: true
|
26
|
-
)
|
27
|
-
|
28
|
-
# Create as many verses as is called for per chapter
|
29
|
-
(1..r['verses']).each do |verse_number|
|
23
|
+
if r['chapter'] != chapter || r['book'] != book
|
24
|
+
# Create a heading per chapter
|
30
25
|
Models::Verse.new(@db).find_or_create(
|
31
26
|
chapter: r['chapter'],
|
32
|
-
verse:
|
33
|
-
book_name: r['book']
|
27
|
+
verse: nil,
|
28
|
+
book_name: r['book'],
|
29
|
+
heading: true
|
34
30
|
)
|
31
|
+
chapter = r['chapter']
|
35
32
|
end
|
33
|
+
|
34
|
+
if r['book'] != book
|
35
|
+
puts "Importing chapters & verses for '#{r['book']}'"
|
36
|
+
book = r['book']
|
37
|
+
end
|
38
|
+
verse_model.find_or_create(
|
39
|
+
chapter: r['chapter'],
|
40
|
+
verse: r['verse'],
|
41
|
+
book_name: r['book'],
|
42
|
+
range_id: r['range_id']
|
43
|
+
)
|
36
44
|
end
|
37
45
|
Import::Result.new(success: true)
|
38
46
|
rescue Sequel::UniqueConstraintViolation => e
|
data/lib/bomdb/models/verse.rb
CHANGED
@@ -16,19 +16,28 @@ module BomDB
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# Create a verse and return its verse_id
|
19
|
-
def create(chapter:, verse:, book_name: nil, book_id: nil, heading: false)
|
19
|
+
def create(chapter:, verse:, book_name: nil, book_id: nil, heading: false, range_id: nil)
|
20
20
|
@db[:verses].insert(
|
21
21
|
book_id: book_by_name_or_id(book_name, book_id),
|
22
22
|
verse_chapter: chapter,
|
23
23
|
verse_number: verse,
|
24
|
-
verse_heading: heading ? 0 : nil
|
24
|
+
verse_heading: heading ? 0 : nil,
|
25
|
+
verse_range_id: range_id
|
25
26
|
)
|
26
27
|
end
|
27
28
|
|
28
29
|
# Returns a verse_id after finding or creating the verse
|
29
|
-
def find_or_create(
|
30
|
-
|
31
|
-
|
30
|
+
def find_or_create(chapter:, verse:, book_name: nil, book_id: nil, heading: false, range_id: nil)
|
31
|
+
v = find(
|
32
|
+
chapter: chapter, verse: verse,
|
33
|
+
book_name: book_name, book_id: book_id,
|
34
|
+
heading: heading
|
35
|
+
)
|
36
|
+
(v && v[:verse_id]) || create(
|
37
|
+
chapter: chapter, verse: verse,
|
38
|
+
book_name: book_name, book_id: book_id,
|
39
|
+
heading: heading, range_id: range_id
|
40
|
+
)
|
32
41
|
end
|
33
42
|
|
34
43
|
protected
|
data/lib/bomdb/query.rb
CHANGED
@@ -2,7 +2,7 @@ require 'bomdb/models/edition'
|
|
2
2
|
|
3
3
|
module BomDB
|
4
4
|
class Query
|
5
|
-
def initialize(edition
|
5
|
+
def initialize(edition: 1829, exclude: nil, headings: false)
|
6
6
|
@edition = edition
|
7
7
|
@exclude = exclude
|
8
8
|
@headings = headings
|
@@ -35,6 +35,38 @@ module BomDB
|
|
35
35
|
query.each(&block)
|
36
36
|
end
|
37
37
|
|
38
|
+
def chapters
|
39
|
+
groups = query.all.group_by do |x|
|
40
|
+
[x[:book_name], x[:verse_chapter]]
|
41
|
+
end
|
42
|
+
Enumerator.new(groups.size) do |y|
|
43
|
+
groups.each do |heading, rows|
|
44
|
+
content = rows.map{ |r| r[:content_body] }.join(" ")
|
45
|
+
y.yield(heading, content)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def books
|
51
|
+
groups = query.all.group_by{ |x| x[:book_name] }
|
52
|
+
Enumerator.new(groups.size) do |y|
|
53
|
+
groups.each do |heading, rows|
|
54
|
+
content = rows.map{ |r| r[:content_body] }.join(" ")
|
55
|
+
y.yield(heading, content)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def wordgroups(wordcount)
|
61
|
+
content = query.all.map{ |r| r[:content_body] }.join(" ")
|
62
|
+
groups = content.scan(/[^ ]+/).each_slice(wordcount).map{ |w| w.join(" ") }
|
63
|
+
Enumerator.new(groups.size) do |y|
|
64
|
+
groups.each do |g|
|
65
|
+
y.yield(g)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
38
70
|
def print(verse_format: nil, body_format: nil, sep: ' ', linesep: "\n", io: $stdout)
|
39
71
|
shown = false
|
40
72
|
verse_format ||= lambda{ |book, chapter, verse| "#{book}#{sep}#{chapter}:#{verse}" }
|
data/lib/bomdb/schema.rb
CHANGED
@@ -37,6 +37,8 @@ module BomDB
|
|
37
37
|
integer :verse_number, :null => true
|
38
38
|
integer :verse_heading, :null => true
|
39
39
|
|
40
|
+
integer :verse_range_id, :unique => true, :null => true
|
41
|
+
|
40
42
|
index [:book_id, :verse_chapter, :verse_number, :verse_heading], :unique => true
|
41
43
|
end if include?(tables, :verses)
|
42
44
|
|
data/lib/bomdb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bomdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duane Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -84,14 +84,14 @@ dependencies:
|
|
84
84
|
name: text_clean
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.1'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: mericope
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.1.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.1.1
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|