sqlbible 1.0.0 → 1.1.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
  SHA256:
3
- metadata.gz: 96109d81bd585cf38052c95bada0cb07f8c67796e9dd9c9123b26f9f2f2977f7
4
- data.tar.gz: e73d3ddb3b30911468000e9b86c35ac5e9826b496cb2e15f27e20fb14d6553ab
3
+ metadata.gz: 0db4b2a65f0c016b81b2d1ec4c0cb45c85bb619eacf7aa802cea2fcfda88048c
4
+ data.tar.gz: 61e97c6905189eec0a5cfc6ef1b02a8cc91dd1d4ecd1fe1d9250db1c9c93c423
5
5
  SHA512:
6
- metadata.gz: 7146abd51b0b4ff2e9da21cbd17c2a94f2e0ea67c62ce3315429bc1047d1b6c8e219d72c4564c41f353182fada41c4d84a67620ea8b0caca6cba56478f30e02e
7
- data.tar.gz: 6dc22bbaadb8d512edcf3c2e2e710653cdcd26864c30517f1d2226407ec03f20f5071815184e163413e95f9bee901a33676a47a4d62cd042bc8b6942abf5027d
6
+ metadata.gz: 7ba9e92407bc21109d36538b6932b04790a0d6082ca6131260280b6aaaf2b96e3bf42872d352637c8846ebb4d28999da222b0130a30ac41e47414d36684bd09a
7
+ data.tar.gz: c5250da5c011c5e4fb1e5f3536be717a84c550f9f10dd8c03d2665cdb369982aaa4fbab4d83a183010245621dda4cf092f05746f05f61c4349507dd96d1a4b5d
data/README.md CHANGED
@@ -35,11 +35,14 @@ bible.reference(ref)
35
35
 
36
36
  ### Sqlbible as command-line application
37
37
 
38
+ It is possible to convert bibles in OSIS XML format to SQLite databases for
39
+ Sqlbible, to search for regular expressions and show text for references.
40
+
38
41
  See help of the command-line application:
39
42
 
40
43
  ```shell
41
44
  sqlbible -h
42
- ``
45
+ ```
43
46
 
44
47
  ## Requirements
45
48
 
data/bin/sqlbible CHANGED
@@ -2,18 +2,93 @@
2
2
  # encoding: utf-8
3
3
  # frozen_string_literal: false
4
4
 
5
- require 'optimist'
5
+ require 'optimist_xl'
6
+ require 'scripref'
7
+ require 'sqlbible'
6
8
 
7
- opts = Optimist.options do
8
- opt :convert, 'Convert a bible from OSIS-XML to Sqlbible format', type: String
9
+ result = OptimistXL.options do
10
+ synopsis 'Usage: sqlitebible [options] [<command> [suboptions] <filename>]'
11
+ subcmd :convert, 'Convert a bible from OSIS-XML to Sqlbible format' do
12
+ opt :output, 'Output filename of the generated Sqlbible file', type: String
13
+ end
14
+ subcmd :search, 'Search with regular expressions' do
15
+ opt :search, 'Regular expression to search (multiple allowed)', type: String, multi: true, required: true
16
+ opt :lang, 'Language for parsing and formatting scripture references', type: String, permitted: %w(de en), default: 'en'
17
+ opt :output, 'Output filename', type: String
18
+ opt :range, 'Search range, example: "John 1-10"', type: String
19
+ end
20
+ subcmd :text, 'Show text of references' do
21
+ opt :lang, 'Language for parsing and formatting scripture references', type: String, permitted: %w(de en), default: 'en'
22
+ opt :output, 'Output filename', type: String
23
+ opt :reference, 'Reference to show, example: "John 3:16; 10:27-30"', type: String, required: true
24
+ end
25
+ version format("sqlbible %s\nschema version %s", Sqlbible::VERSION, Sqlbible.schema_version)
26
+ end
27
+
28
+ unless filename = result.leftovers.first
29
+ $stderr.puts 'no filename given'
30
+ exit 1
31
+ end
32
+
33
+ def determine_lang_mod subopts
34
+ case l = subopts[:lang]
35
+ when 'en', nil
36
+ Scripref::English
37
+ when 'de'
38
+ Scripref::German
39
+ else
40
+ fail format("lang option #{l} is not supported")
41
+ end
42
+ end
43
+
44
+ def determine_out subopts
45
+ if fn = subopts[:output]
46
+ out = File.open(opts[:output], 'w')
47
+ else
48
+ out = $stdout
49
+ end
9
50
  end
10
51
 
11
- if osis_fn = opts[:convert]
52
+ def format_verse f, v
53
+ format('%s: %s', f.format(v.scripref_passage), v.plaintext)
54
+ end
55
+
56
+ subopts = result.subcommand_options
57
+
58
+ case result.subcommand
59
+ when 'convert'
12
60
  require 'sqlbible/convert'
13
- sqlite_fn = osis_fn.sub(/\.xml/i, '') << '.sqlite'
61
+ osis_fn = filename
62
+ sqlite_fn = subopts[:output] || osis_fn.sub(/\.xml/i, '') << '.sqlite'
14
63
  if $stdout.tty?
15
64
  puts "convert #{osis_fn} to #{sqlite_fn} ..."
16
65
  end
17
66
  Sqlbible.convert osis_fn, sqlite_fn
67
+ exit
68
+ when 'search'
69
+ searches = subopts[:search]
70
+ lang_mod = determine_lang_mod(subopts)
71
+ if r = subopts[:range]
72
+ p = Scripref::Parser.new(lang_mod)
73
+ range = p.parse(r)
74
+ else
75
+ range = nil
76
+ end
77
+ out = determine_out subopts
78
+ bible = Sqlbible.new(filename)
79
+ regexes = searches.map {|s| Regexp.new(s)}
80
+ f = Scripref::Formatter.new(lang_mod, bookformat: :abbrev)
81
+ bible.search(regexes, range: range).each do |v|
82
+ out.puts format_verse(f, v)
83
+ end
84
+ when 'text'
85
+ lang_mod = determine_lang_mod(subopts)
86
+ p = Scripref::Parser.new(lang_mod)
87
+ f = Scripref::Formatter.new(lang_mod, bookformat: :abbrev)
88
+ ref = p.parse(subopts[:reference])
89
+ bible = Sqlbible.new(filename)
90
+ out = determine_out subopts
91
+ bible.reference(ref).flatten.each do |v|
92
+ out.puts format_verse(f, v)
93
+ end
18
94
  end
19
-
@@ -8,6 +8,8 @@ require_relative '../sqlbible'
8
8
 
9
9
  class Sqlbible
10
10
 
11
+ # Convert a bible file in OSIS XML format to another file in SQLite format
12
+ # for Sqlbible
11
13
  def self.convert osis_fn, sqlite_fn
12
14
  last_bookid = nil
13
15
  booknumber = 0
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ class Sqlbible
5
+ VERSION = '1.1.0'
6
+ end
data/lib/sqlbible.rb CHANGED
@@ -1,12 +1,12 @@
1
- # encooding: utf-8
1
+ # encoding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'scripref'
5
5
  require 'sqlite3'
6
6
 
7
- class Sqlbible
7
+ require_relative 'sqlbible/version'
8
8
 
9
- VERSION = '1.0.0'
9
+ class Sqlbible
10
10
 
11
11
  def initialize db_filename
12
12
  @db = SQLite3::Database.new(db_filename)
@@ -16,17 +16,22 @@ class Sqlbible
16
16
  check_schema_version
17
17
  end
18
18
 
19
+ # Get an array of Verse instances for a Scripref::Passage
19
20
  def passage pass
20
21
  rowid1, rowid2 = passage2rowids(pass)
21
22
  res = select_text(where: 'rowid between ? and ?', args: [rowid1, rowid2])
22
23
  parse_verse_list(res)
23
24
  end
24
25
 
26
+ # Get an array of arrays of Verse instances for a Scripref reference (array
27
+ # of Scripref::Passage instances)
25
28
  def reference ref
26
29
  ref.select {|e| e.kind_of?(Scripref::Passage)}.map {|pass| passage(pass)}
27
30
  end
28
31
 
29
- def search obj, range: nil
32
+ # Get an array of Verse instances for a search with one ore more regular
33
+ # expressions (optional a search range of a Scripref reference is possible)
34
+ def search *searches, range: nil
30
35
  where_arr = []
31
36
  args = []
32
37
  if range
@@ -35,17 +40,26 @@ class Sqlbible
35
40
  where_arr == [or_join_where(where_arr)]
36
41
  args = passages.map {|p| passage2rowids(p)}.flatten
37
42
  end
38
- case obj
39
- when Regexp
40
- where_arr << 'plaintext regexp ?'
41
- args << obj.source
42
- res = select_text(where: and_join_where(where_arr), args: args)
43
- else
44
- fail 'unknown search object'
43
+ searches.flatten.each do |o|
44
+ case o
45
+ when Regexp
46
+ where_arr << 'plaintext regexp ?'
47
+ args << o.to_s
48
+ else
49
+ fail format('search objects of class %s are not (yet) supported', o.class)
50
+ end
45
51
  end
52
+ where = and_join_where(where_arr)
53
+ res = select_text(where: where, args: args)
46
54
  parse_verse_list(res)
47
55
  end
48
56
 
57
+ # Get the schema version of the SQLite database of the instance
58
+ def schema_version
59
+ Sqlbible.select_schema_version(@db)
60
+ end
61
+
62
+ # Representation of a verse
49
63
  Verse = Struct.new :osisid, :bookid, :chapter, :verse, :xml, :plaintext, keyword_init: true do
50
64
  def scripref_passage
51
65
  Scripref::Passage.new(b1: bookid, c1: chapter, v1: verse, b2: bookid, c2: chapter, v2: verse)
@@ -54,23 +68,41 @@ class Sqlbible
54
68
 
55
69
  class << self
56
70
 
71
+ # Get the database schema as string
57
72
  def db_schema
58
73
  File.read(File.join(__dir__, '../schema.sql'))
59
74
  end
60
75
 
61
- end
76
+ # Get an array of the major and minor version of the database schema of the
77
+ # actual version of the lib
78
+ def schema_major_minor
79
+ lib_db = SQLite3::Database.new(':memory:')
80
+ lib_db.execute_batch(Sqlbible.db_schema)
81
+ select_schema_major_minor(lib_db)
82
+ end
62
83
 
63
- private
84
+ # Get the version of the database schema of the actual version of the lib
85
+ def schema_version
86
+ schema_major_minor.join('.')
87
+ end
88
+
89
+ # Get an array of the major and minor version of an Sqlbible database
90
+ def select_schema_major_minor db
91
+ db.execute("select major, minor from schema_version").first
92
+ end
93
+
94
+ # Get the version of an Sqlbible database
95
+ def select_schema_version db
96
+ select_schema_major_minor(db).join('.')
97
+ end
64
98
 
65
- def select_schema_version db
66
- db.execute("select major, minor from schema_version").first
67
99
  end
68
100
 
101
+ private
102
+
69
103
  def check_schema_version
70
- lib_db = SQLite3::Database.new(':memory:')
71
- lib_db.execute_batch(Sqlbible.db_schema)
72
- major_lib, minor_lib = select_schema_version(lib_db)
73
- major_bible, minor_bible = select_schema_version(@db)
104
+ major_lib, minor_lib = Sqlbible.schema_major_minor
105
+ major_bible, minor_bible = Sqlbible.select_schema_major_minor(@db)
74
106
  if major_bible < major_lib || major_bible == major_lib && minor_bible < minor_lib
75
107
  fail 'database schema of bible database is too old'
76
108
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlbible
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Friedrich
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-10-31 00:00:00.000000000 Z
10
+ date: 2024-11-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: nokogiri
@@ -24,19 +24,19 @@ dependencies:
24
24
  - !ruby/object:Gem::Version
25
25
  version: '1.16'
26
26
  - !ruby/object:Gem::Dependency
27
- name: optimist
27
+ name: optimist_xl
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '3.1'
32
+ version: '3.3'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '3.1'
39
+ version: '3.3'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: scripref
42
42
  requirement: !ruby/object:Gem::Requirement
@@ -90,6 +90,7 @@ files:
90
90
  - bin/sqlbible
91
91
  - lib/sqlbible.rb
92
92
  - lib/sqlbible/convert.rb
93
+ - lib/sqlbible/version.rb
93
94
  - schema.sql
94
95
  homepage: https://bitbucket.org/janfri/sqlbible
95
96
  licenses: