sqlbible 1.9.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: b56764d9e3209aadc3d033fdb8870ebf7b32aeed2c036527ad0211f637890db4
4
- data.tar.gz: 61562839dd855f990b6eebcafd375453e1e70e66d38574c3755cbcbb4a0c9c86
3
+ metadata.gz: 435728b125a8af87f99d9e0227de96a537f4525274ebdae22191d9de1f2d04a8
4
+ data.tar.gz: bba7f1ceb9626222a92a18773491764be9944261a55f42998cf17328d9034e44
5
5
  SHA512:
6
- metadata.gz: b3b396178ca096c2d153ffb241099c0d2bfdc7981d5b4bd8a0e033fd125e1a13231c4cf1f8c85309725fcd2067e37f63f31529149b5829aadf4744d534221c6c
7
- data.tar.gz: 2e5d47096a3023c4510f44359db1683ac3e4d08ba597c2178c9d04365d14f30a7158c0f292cf965b7bb73d8ccf50a32a5bf6924e473a29ccb0a437a3edcc8318
6
+ metadata.gz: e3deefdfdd74197c1b95cf1db6c2983694f759f4ffd2abd393ff7d69b7949557e5cacd1057f9cf365dfd6dcefe10c240381ecbe64e3c50664f00cfcd97ff737a
7
+ data.tar.gz: e0eaf3f6270f5feda71c454fe0aa11de540e8081cc180a4027db86ee94ed912426e0ae3a7fd1c860532dae374aa156ab5be7f0d8b90f8da2e6509d788077f9a7
data/bin/sqlbible CHANGED
@@ -3,118 +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
14
-
15
- $explizit_opts = Set.new
11
+ class Cli
16
12
 
17
- $opts = Optimist.options do
18
- synopsis 'Usage: sqlbible [options] [search regexes]*'
19
- opt :bible, 'Name of the bible module filename of an .sqlbible file', type: String, **default_bible_param
20
- opt :color, 'Colorize output', default: Sqlbible.color do |v|
21
- $explizit_opts << :color
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
22
20
  end
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
30
21
 
31
- unless $explizit_opts.include? :color
32
- if !$stdout.tty? || $opts[:output]
33
- $opts[:color] = false
34
- end
35
- end
22
+ private
36
23
 
37
- def determine_lang_mod
38
- case l = $opts[:lang]
39
- when 'en', nil
40
- Scripref::English
41
- when 'de'
42
- Scripref::German
43
- else
44
- fail format('lang option %s is not supported', l)
45
- end
46
- 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
47
30
 
48
- def open_out
49
- if fn = $opts[:output]
50
- File.open(fn, 'w') do |f|
51
- 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)
52
44
  end
53
- elsif $opts[:pager]
54
- IO.popen(Sqlbible.pager_command, 'w') do |p|
55
- yield p
45
+
46
+ unless explizit_opts.include? :color
47
+ if !$stdout.tty? || @opts[:output]
48
+ @opts[:color] = false
49
+ end
56
50
  end
57
- else
58
- yield $stdout
59
- end
60
- end
61
51
 
62
- def format_verse_ref f, v
63
- ref = f.format(v.scripref_passage)
64
- if $opts[:color]
65
- Ansicolor.apply(ref, Sqlbible.color_reference)
66
- else
67
- ref
52
+ @regexes = ARGV.map {|s| Regexp.new(s)}
68
53
  end
69
- end
70
54
 
71
- def format_text v, regexes
72
- text = v.plaintext.gsub("\n", ' ¶')
73
- if $opts[:color]
74
- regexes.each do |re|
75
- 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
76
61
  end
77
62
  end
78
- text
79
- end
80
-
81
- def format_verse_line f, v, regexes=[]
82
- format('%s: %s', format_verse_ref(f, v), format_text(v, regexes))
83
- end
84
63
 
85
- begin
86
- if $opts[:info]
64
+ def show_env
87
65
  names = Sqlbible.bible_names
88
66
  max_size = names.map(&:size).max
89
67
  names.each do |n|
90
68
  puts format("%-#{max_size}s (schema version: %s)", n, Sqlbible.new(n).schema_version)
91
69
  end
92
- return
93
70
  end
94
- lang_mod = determine_lang_mod
95
- p = Scripref::Parser.new(lang_mod)
96
- f = Scripref::Formatter.new(lang_mod, abbrev_level: 1)
97
- if r = $opts[:reference]
98
- ref = p.parse(r)
99
- else
100
- 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 = []
101
91
  end
102
- bible = Sqlbible.new($opts[:bible])
103
- if ARGV.size > 0
104
- regexes = ARGV.map {|s| Regexp.new(s)}
92
+
93
+ def do_processing
105
94
  open_out do |out|
106
- bible.search(regexes, range: ref).each do |v|
107
- out.puts format_verse_line(f, v, regexes)
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
108
103
  end
104
+ show_stats out
109
105
  end
110
- else
111
- open_out do |out|
112
- bible.reference(Array(ref)).flatten.each do |v|
113
- out.puts format_verse_line(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
114
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)
115
127
  end
116
128
  end
117
- rescue Exception => e
118
- $stderr.puts e.message
119
- 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
+
120
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.9.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 :color, :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.9.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