sqlbible 1.8.0 → 1.10.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d56c3d8c24b77ebd196845f6337befa2be5ba09af57609ae81c970485882162a
4
- data.tar.gz: 03f098e9b3df74b206b1a8a7ffd424b25c6cedca2440f63b21569f7983c0ba2c
3
+ metadata.gz: 435728b125a8af87f99d9e0227de96a537f4525274ebdae22191d9de1f2d04a8
4
+ data.tar.gz: bba7f1ceb9626222a92a18773491764be9944261a55f42998cf17328d9034e44
5
5
  SHA512:
6
- metadata.gz: eb289248fbf37ef0b2220939d20757d590186b8c0338beb76e5630f5d8cbd230ff4d37e472b2732d1082c13b11e0458fcdfd18bf14b63c0ed2a1c2652b8412be
7
- data.tar.gz: 7bdc2c73f78526fadd9b568a3f22d421c64bfbacdae5e17e261dea9fdcf0045d48d4d33969d40c768f92afe7a26693daf0a416878ca3c3ce64f718ada47b2f11
6
+ metadata.gz: e3deefdfdd74197c1b95cf1db6c2983694f759f4ffd2abd393ff7d69b7949557e5cacd1057f9cf365dfd6dcefe10c240381ecbe64e3c50664f00cfcd97ff737a
7
+ data.tar.gz: e0eaf3f6270f5feda71c454fe0aa11de540e8081cc180a4027db86ee94ed912426e0ae3a7fd1c860532dae374aa156ab5be7f0d8b90f8da2e6509d788077f9a7
data/bin/sqlbible CHANGED
@@ -3,112 +3,198 @@
3
3
  # frozen_string_literal: false
4
4
 
5
5
  require 'optimist'
6
+ require 'reline'
6
7
  require 'scripref'
7
8
  require 'sqlbible'
8
9
  require 'sqlbible/ansicolor'
9
10
 
10
- default_bible_param = {}
11
- if b = Sqlbible.bible
12
- default_bible_param[:default] = b.to_s
13
- end
11
+ class Cli
14
12
 
15
- unless $stdout.tty?
16
- Sqlbible.colorize = false
17
- end
13
+ def run
14
+ parse_args
15
+ process_by_opts
16
+ rescue SystemExit
17
+ rescue Exception => e
18
+ $stderr.puts e.message
19
+ exit 1
20
+ end
18
21
 
19
- opts = Optimist.options do
20
- synopsis 'Usage: sqlbible [options] [search regexes]*'
21
- opt :bible, 'Name of the bible module filename of an .sqlbible file', type: String, **default_bible_param
22
- opt :colorize, 'Colorize output', default: Sqlbible.colorize
23
- opt :info, 'Show infos for installed bibles'
24
- opt :lang, 'Language for parsing and formatting scripture references', type: String, permitted: %w(de en), default: Sqlbible.lang.to_s
25
- opt :output, 'Output filename', type: String
26
- opt :pager, 'Use pager for terminal output', default: Sqlbible.pager
27
- opt :reference, 'Reference to show or search, example: "John 3:16; 10:27-30"', type: String
28
- version format("sqlbible %s\nschema version %s", Sqlbible::VERSION, Sqlbible.schema_version)
29
- end
22
+ private
30
23
 
31
- def determine_lang_mod opts
32
- case l = opts[:lang]
33
- when 'en', nil
34
- Scripref::English
35
- when 'de'
36
- Scripref::German
37
- else
38
- fail format('lang option %s is not supported', l)
39
- end
40
- end
24
+ def parse_args
25
+ default_bible_param = {}
26
+ if b = Sqlbible.bible
27
+ default_bible_param[:default] = b.to_s
28
+ end
29
+ explizit_opts = Set.new
41
30
 
42
- def open_out opts
43
- if fn = opts[:output]
44
- File.open(fn, 'w') do |f|
45
- yield f
31
+ @opts = Optimist.options do
32
+ synopsis 'Usage: sqlbible [options] [search regexes]*'
33
+ opt :bible, 'Name of the bible module or filename of an .sqlbible file', type: String, **default_bible_param
34
+ opt :color, 'Colorize output', default: Sqlbible.color do |v|
35
+ explizit_opts << :color
36
+ end
37
+ opt :env, 'Show infos of the sqlbible environment: installed bibles with schema versions'
38
+ opt :lang, 'Language for parsing and formatting scripture references', type: String, permitted: %w(de en), default: Sqlbible.lang.to_s
39
+ opt :output, 'Output filename', type: String
40
+ opt :pager, 'Use pager for terminal output', default: Sqlbible.pager
41
+ opt :reference, 'Reference to show or search, example: "John 3:16; 10:27-30"', type: String
42
+ opt :stat, 'Statistics level', type: Integer, permitted: (0..2), default: Sqlbible.stat_level
43
+ version format("sqlbible %s\nschema version %s", Sqlbible::VERSION, Sqlbible.schema_version)
46
44
  end
47
- elsif opts[:pager]
48
- IO.popen(Sqlbible.pager_command, 'w') do |p|
49
- yield p
45
+
46
+ unless explizit_opts.include? :color
47
+ if !$stdout.tty? || @opts[:output]
48
+ @opts[:color] = false
49
+ end
50
50
  end
51
- else
52
- yield $stdout
53
- end
54
- end
55
51
 
56
- def format_verse_ref opts, f, v
57
- ref = f.format(v.scripref_passage)
58
- if opts[:colorize]
59
- Ansicolor.apply(ref, Sqlbible.color_reference)
60
- else
61
- ref
52
+ @regexes = ARGV.map {|s| Regexp.new(s)}
62
53
  end
63
- end
64
54
 
65
- def format_text opts, v, regexes
66
- text = v.plaintext.gsub("\n", ' ¶')
67
- if opts[:colorize]
68
- regexes.each do |re|
69
- text = text.gsub(re, Ansicolor.apply('\0', Sqlbible.color_emphasize))
55
+ def process_by_opts
56
+ if @opts[:env]
57
+ show_env
58
+ else
59
+ init_processing
60
+ do_processing
70
61
  end
71
62
  end
72
- text
73
- end
74
-
75
- def format_verse_line opts, f, v, regexes=[]
76
- format('%s: %s', format_verse_ref(opts, f, v), format_text(opts, v, regexes))
77
- end
78
63
 
79
- begin
80
- if opts[:info]
64
+ def show_env
81
65
  names = Sqlbible.bible_names
82
66
  max_size = names.map(&:size).max
83
67
  names.each do |n|
84
68
  puts format("%-#{max_size}s (schema version: %s)", n, Sqlbible.new(n).schema_version)
85
69
  end
86
- return
87
70
  end
88
- lang_mod = determine_lang_mod(opts)
89
- p = Scripref::Parser.new(lang_mod)
90
- f = Scripref::Formatter.new(lang_mod, abbrev_level: 1)
91
- if r = opts[:reference]
92
- ref = p.parse(r)
93
- else
94
- ref = nil
71
+
72
+ def init_processing
73
+ m = case l = @opts[:lang]
74
+ when 'en', nil
75
+ Scripref::English
76
+ when 'de'
77
+ Scripref::German
78
+ else
79
+ fail format('lang option %s is not supported', l)
80
+ end
81
+ @parser = Scripref::Parser.new(m)
82
+ @formatter = Scripref::Formatter.new(m, abbrev_level: 1)
83
+ if r = @opts[:reference]
84
+ @reference = @parser.parse(r)
85
+ else
86
+ @reference = nil
87
+ end
88
+ @bible = Sqlbible.new(@opts[:bible])
89
+ @verse_count = 0
90
+ @matches = []
95
91
  end
96
- bible = Sqlbible.new(opts[:bible])
97
- if ARGV.size > 0
98
- regexes = ARGV.map {|s| Regexp.new(s)}
99
- open_out opts do |out|
100
- bible.search(regexes, range: ref).each do |v|
101
- out.puts format_verse_line(opts, f, v, regexes)
92
+
93
+ def do_processing
94
+ open_out do |out|
95
+ if @regexes.size > 0
96
+ @bible.search(@regexes, range: @reference).each do |v|
97
+ process_verse out, v
98
+ end
99
+ else
100
+ @bible.reference(Array(@reference)).flatten.each do |v|
101
+ process_verse out, v
102
+ end
102
103
  end
104
+ show_stats out
103
105
  end
104
- else
105
- open_out opts do |out|
106
- bible.reference(Array(ref)).flatten.each do |v|
107
- out.puts format_verse_line(opts, f, v)
106
+ end
107
+
108
+ def open_out
109
+ if fn = @opts[:output]
110
+ File.open(fn, 'w') do |f|
111
+ yield f
112
+ end
113
+ elsif @opts[:pager]
114
+ IO.popen(Sqlbible.pager_command, 'w') do |p|
115
+ yield p
108
116
  end
117
+ else
118
+ yield $stdout
119
+ end
120
+ end
121
+
122
+ def process_verse out, v
123
+ show_verse out, v
124
+ @verse_count += 1
125
+ @regexes.each do |re|
126
+ @matches += v.plaintext.scan(re)
109
127
  end
110
128
  end
111
- rescue Exception => e
112
- $stderr.puts e.message
113
- exit 1
129
+
130
+ def show_verse out, v
131
+ out.puts format_verse_line(v)
132
+ end
133
+
134
+ def format_verse_line v
135
+ format('%s: %s', format_verse_ref(v), format_text(v))
136
+ end
137
+
138
+ def format_verse_ref v
139
+ ref = @formatter.format(v.scripref_passage)
140
+ if @opts[:color]
141
+ Ansicolor.apply(ref, Sqlbible.color_reference)
142
+ else
143
+ ref
144
+ end
145
+ end
146
+
147
+ def format_text v
148
+ text = v.plaintext.gsub("\n", ' ¶')
149
+ if @opts[:color]
150
+ @regexes.each do |re|
151
+ text = text.gsub(re, Ansicolor.apply('\0', Sqlbible.color_emphasize))
152
+ end
153
+ end
154
+ text
155
+ end
156
+
157
+ def show_stats out
158
+ l = @opts[:stat]
159
+ if l < 1
160
+ return
161
+ end
162
+ if l >= 2 and !@matches.empty?
163
+ h = @matches.tally
164
+ arr = h.to_a.sort_by(&:last).reverse
165
+ unless arr.empty?
166
+ out.puts
167
+ end
168
+ arr.each do |e|
169
+ out.puts format('%s: %d', e[0], e[1])
170
+ end
171
+ if arr.size > 1
172
+ out.puts nil, format('%d total', arr.map(&:last).sum)
173
+ end
174
+ end
175
+ if @verse_count > 0
176
+ out.puts nil, format('%d verses', @verse_count)
177
+ end
178
+ end
179
+
114
180
  end
181
+
182
+ # interactive mode
183
+ if ARGV.empty?
184
+ begin
185
+ while (l = Reline.readline('> ', false))
186
+ break if l.empty?
187
+ if l =~ /^-/
188
+ l.split(/\s+/, 2).each do |s|
189
+ ARGV << s
190
+ end
191
+ else
192
+ ARGV << l
193
+ end
194
+ end
195
+ rescue Interrupt
196
+ exit
197
+ end
198
+ end
199
+
200
+ Cli.new.run
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Sqlbible
5
- VERSION = '1.8.0'
5
+ VERSION = '1.10.0'
6
6
  end
data/lib/sqlbible.rb CHANGED
@@ -86,11 +86,12 @@ class Sqlbible
86
86
  @color_emphasize = :underline
87
87
  @lang = :en
88
88
  @pager_command = 'less -FRSX'
89
+ @stat_level = 1
89
90
 
90
91
  class << self
91
92
 
92
93
  attr_reader :bibles_dir
93
- attr_accessor :colorize, :color_reference, :color_emphasize, :bible, :lang, :pager, :pager_command
94
+ attr_accessor :color, :color_reference, :color_emphasize, :bible, :lang, :pager, :pager_command, :stat_level
94
95
 
95
96
  # Get the database schema as string
96
97
  def db_schema
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqlbible
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Friedrich
@@ -99,28 +99,28 @@ dependencies:
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: 2.5.0
102
+ version: '2.5'
103
103
  type: :development
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: 2.5.0
109
+ version: '2.5'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: test-unit
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 3.7.0
116
+ version: '3.7'
117
117
  type: :development
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: 3.7.0
123
+ version: '3.7'
124
124
  email: janfri26@gmail.com
125
125
  executables:
126
126
  - sqlbible
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
157
  requirements: []
158
- rubygems_version: 4.1.0.dev
158
+ rubygems_version: 4.0.6
159
159
  specification_version: 4
160
160
  summary: Library for bibles as SQLite databases
161
161
  test_files: []