nhkore 0.3.7 → 0.3.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +53 -2
- data/Gemfile +0 -18
- data/Gemfile.lock +36 -33
- data/README.md +36 -30
- data/Rakefile +38 -52
- data/bin/nhkore +4 -15
- data/lib/nhkore/app.rb +235 -234
- data/lib/nhkore/article.rb +39 -53
- data/lib/nhkore/article_scraper.rb +293 -285
- data/lib/nhkore/cleaner.rb +20 -32
- data/lib/nhkore/cli/fx_cmd.rb +41 -53
- data/lib/nhkore/cli/get_cmd.rb +59 -70
- data/lib/nhkore/cli/news_cmd.rb +143 -153
- data/lib/nhkore/cli/search_cmd.rb +108 -118
- data/lib/nhkore/cli/sift_cmd.rb +109 -120
- data/lib/nhkore/datetime_parser.rb +88 -104
- data/lib/nhkore/defn.rb +48 -55
- data/lib/nhkore/dict.rb +26 -38
- data/lib/nhkore/dict_scraper.rb +31 -40
- data/lib/nhkore/entry.rb +43 -55
- data/lib/nhkore/error.rb +16 -21
- data/lib/nhkore/fileable.rb +10 -21
- data/lib/nhkore/lib.rb +5 -17
- data/lib/nhkore/missingno.rb +21 -33
- data/lib/nhkore/news.rb +58 -72
- data/lib/nhkore/polisher.rb +22 -34
- data/lib/nhkore/scraper.rb +74 -83
- data/lib/nhkore/search_link.rb +62 -76
- data/lib/nhkore/search_scraper.rb +81 -92
- data/lib/nhkore/sifter.rb +157 -171
- data/lib/nhkore/splitter.rb +19 -31
- data/lib/nhkore/user_agents.rb +28 -32
- data/lib/nhkore/util.rb +72 -84
- data/lib/nhkore/variator.rb +20 -32
- data/lib/nhkore/version.rb +4 -16
- data/lib/nhkore/word.rb +99 -97
- data/lib/nhkore.rb +8 -20
- data/nhkore.gemspec +30 -51
- data/samples/looper.rb +18 -29
- data/test/nhkore/test_helper.rb +3 -15
- data/test/nhkore_test.rb +6 -18
- metadata +33 -24
data/lib/nhkore/user_agents.rb
CHANGED
@@ -1,39 +1,33 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of NHKore.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# NHKore is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with NHKore. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
24
|
-
if $
|
25
|
-
|
26
|
-
|
12
|
+
if $PROGRAM_NAME == __FILE__
|
13
|
+
require 'bundler/inline'
|
14
|
+
|
15
|
+
gemfile do
|
16
|
+
source 'https://rubygems.org'
|
17
|
+
|
18
|
+
gem 'user-agent-randomizer','~> 0.2',require: false
|
19
|
+
end
|
20
|
+
|
27
21
|
require 'set'
|
28
22
|
require 'user_agent_randomizer'
|
29
|
-
|
30
|
-
agents = Set.new
|
31
|
-
|
23
|
+
|
24
|
+
agents = Set.new
|
25
|
+
|
32
26
|
while agents.length < 1111
|
33
27
|
agents.add(UserAgentRandomizer::UserAgent.fetch(type: 'desktop_browser').string)
|
34
28
|
end
|
35
|
-
|
36
|
-
agents.each
|
29
|
+
|
30
|
+
agents.each do |agent|
|
37
31
|
puts "'#{agent}',"
|
38
32
|
end
|
39
33
|
end
|
@@ -41,26 +35,27 @@ end
|
|
41
35
|
module NHKore
|
42
36
|
###
|
43
37
|
# 1111 user-agents produced using the +user-agent-randomizer+ gem.
|
44
|
-
#
|
38
|
+
#
|
45
39
|
# The gem is really old and had a lot of warnings, so decided to make this class.
|
46
40
|
# Maybe I'll fork the gem and maintain a new version in the future...
|
47
|
-
#
|
48
|
-
# @author Jonathan Bradley Whited
|
41
|
+
#
|
42
|
+
# @author Jonathan Bradley Whited
|
49
43
|
# @since 0.2.1
|
50
44
|
###
|
51
45
|
class UserAgents
|
52
46
|
attr_accessor :data
|
53
|
-
|
54
|
-
def self.sample
|
55
|
-
return UserAgents.new
|
47
|
+
|
48
|
+
def self.sample
|
49
|
+
return UserAgents.new.data.sample
|
56
50
|
end
|
57
|
-
|
51
|
+
|
58
52
|
# Decided to store the data in an instance variable (instead of a constant)
|
59
53
|
# because we don't need all of the data in memory after getting just 1
|
60
54
|
# sample, even though it's slower.
|
61
|
-
def initialize
|
55
|
+
def initialize
|
62
56
|
super()
|
63
|
-
|
57
|
+
|
58
|
+
# rubocop:disable all
|
64
59
|
@data = [
|
65
60
|
'ELinks/0.11.3 (textmode; Darwin 10.2.0 i386; 80x24-2)',
|
66
61
|
'Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; de) Opera 10.10',
|
@@ -1174,6 +1169,7 @@ module NHKore
|
|
1174
1169
|
'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.1a) Gecko/20020611',
|
1175
1170
|
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0',
|
1176
1171
|
]
|
1172
|
+
# rubocop:enable all
|
1177
1173
|
end
|
1178
1174
|
end
|
1179
1175
|
end
|
data/lib/nhkore/util.rb
CHANGED
@@ -1,23 +1,11 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of NHKore.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# NHKore is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with NHKore. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
@@ -29,110 +17,110 @@ require 'uri'
|
|
29
17
|
|
30
18
|
module NHKore
|
31
19
|
###
|
32
|
-
# @author Jonathan Bradley Whited
|
20
|
+
# @author Jonathan Bradley Whited
|
33
21
|
# @since 0.2.0
|
34
22
|
###
|
35
23
|
module Util
|
36
24
|
CORE_DIR = 'core'
|
37
25
|
WEB_DIR = 'web'
|
38
|
-
|
26
|
+
|
39
27
|
JST_OFFSET = '+09:00' # Japan Standard Time (JST) time zone offset from UTC
|
40
28
|
JST_OFFSET_HOUR = 9
|
41
29
|
JST_OFFSET_MIN = 0
|
42
|
-
|
43
|
-
HIRAGANA_REGEX = /\p{Hiragana}
|
30
|
+
|
31
|
+
HIRAGANA_REGEX = /\p{Hiragana}/.freeze
|
44
32
|
JPN_SPACE = "\u3000" # Must be double-quoted for escape chars
|
45
|
-
KANA_REGEX = /\p{Hiragana}|\p{Katakana}
|
46
|
-
KANJI_REGEX = /\p{Han}
|
47
|
-
KATAKANA_REGEX = /\p{Katakana}
|
48
|
-
NORMALIZE_STR_REGEX = /[^[[:alpha:]]]
|
49
|
-
STRIP_WEB_STR_REGEX = /(\A[[:space:]]+)|([[:space:]]+\z)
|
50
|
-
WEB_SPACES_REGEX = /[[:space:]]
|
51
|
-
|
52
|
-
def self.jst_now
|
53
|
-
return Time.now
|
54
|
-
end
|
55
|
-
|
56
|
-
JST_YEAR = jst_now
|
33
|
+
KANA_REGEX = /\p{Hiragana}|\p{Katakana}/.freeze
|
34
|
+
KANJI_REGEX = /\p{Han}/.freeze # Han probably stands for Hanzi?
|
35
|
+
KATAKANA_REGEX = /\p{Katakana}/.freeze
|
36
|
+
NORMALIZE_STR_REGEX = /[^[[:alpha:]]]+/.freeze
|
37
|
+
STRIP_WEB_STR_REGEX = /(\A[[:space:]]+)|([[:space:]]+\z)/.freeze
|
38
|
+
WEB_SPACES_REGEX = /[[:space:]]+/.freeze
|
39
|
+
|
40
|
+
def self.jst_now
|
41
|
+
return Time.now.getlocal(JST_OFFSET)
|
42
|
+
end
|
43
|
+
|
44
|
+
JST_YEAR = jst_now.year
|
57
45
|
MAX_SANE_YEAR = JST_YEAR + 1 # +1 Justin Case for time zone differences at the end of the year
|
58
|
-
|
46
|
+
|
59
47
|
# NHK was founded in 1924/25.
|
60
48
|
# - https://www.nhk.or.jp/bunken/english/about/history.html
|
61
49
|
# - https://en.wikipedia.org/wiki/NHK
|
62
50
|
# However, when was the website first created?
|
63
51
|
MIN_SANE_YEAR = 1924
|
64
|
-
|
52
|
+
|
65
53
|
def self.dir_str?(str)
|
66
|
-
return str.match?(
|
54
|
+
return str.match?(%r{[/\\]\s*\z/})
|
67
55
|
end
|
68
|
-
|
56
|
+
|
69
57
|
def self.domain(host,clean: true)
|
70
58
|
require 'public_suffix'
|
71
|
-
|
59
|
+
|
72
60
|
domain = PublicSuffix.domain(host)
|
73
|
-
domain = unspace_web_str(domain).downcase
|
74
|
-
|
61
|
+
domain = unspace_web_str(domain).downcase if !domain.nil? && clean
|
62
|
+
|
75
63
|
return domain
|
76
64
|
end
|
77
|
-
|
65
|
+
|
78
66
|
def self.dump_yaml(obj,flow_level: 8,stylers: nil)
|
79
67
|
require 'psychgus'
|
80
|
-
|
68
|
+
|
81
69
|
stylers = Array(stylers)
|
82
|
-
|
70
|
+
|
83
71
|
return Psychgus.dump(obj,
|
84
72
|
deref_aliases: true, # Dereference aliases for load_yaml()
|
85
73
|
header: true, # %YAML [version]
|
86
|
-
line_width:
|
74
|
+
line_width: 10_000, # Try not to wrap; ichiman!
|
87
75
|
stylers: [
|
88
76
|
Psychgus::FlowStyler.new(flow_level), # Put extra details on one line (flow/inline style)
|
89
77
|
Psychgus::NoSymStyler.new(cap: false), # Remove symbols, don't capitalize
|
90
|
-
Psychgus::NoTagStyler.new
|
78
|
+
Psychgus::NoTagStyler.new, # Remove class names (tags)
|
91
79
|
].concat(stylers),
|
92
80
|
)
|
93
81
|
end
|
94
|
-
|
82
|
+
|
95
83
|
def self.empty_web_str?(str)
|
96
|
-
return str.nil?
|
84
|
+
return str.nil? || strip_web_str(str).empty?
|
97
85
|
end
|
98
|
-
|
86
|
+
|
99
87
|
def self.escape_html(str)
|
100
88
|
str = CGI.escapeHTML(str)
|
101
89
|
str = str.gsub("\n",'<br>')
|
102
|
-
|
90
|
+
|
103
91
|
return str
|
104
92
|
end
|
105
|
-
|
93
|
+
|
106
94
|
def self.filename_str?(str)
|
107
95
|
# Do not use "!dir_str?()"! It's not the same meaning!
|
108
|
-
return !str.match?(
|
96
|
+
return !str.match?(%r{[/\\]})
|
109
97
|
end
|
110
|
-
|
98
|
+
|
111
99
|
def self.hiragana?(str)
|
112
100
|
return HIRAGANA_REGEX =~ str
|
113
101
|
end
|
114
|
-
|
102
|
+
|
115
103
|
# This doesn't modify the hour/minute according to {JST_OFFSET},
|
116
104
|
# but instead, it just drops {JST_OFFSET} into it without adjusting it.
|
117
105
|
def self.jst_time(time)
|
118
106
|
return Time.new(time.year,time.month,time.day,time.hour,time.min,time.sec,JST_OFFSET)
|
119
107
|
end
|
120
|
-
|
108
|
+
|
121
109
|
def self.kana?(str)
|
122
110
|
return KANA_REGEX =~ str
|
123
111
|
end
|
124
|
-
|
112
|
+
|
125
113
|
def self.kanji?(str)
|
126
114
|
return KANJI_REGEX =~ str
|
127
115
|
end
|
128
|
-
|
116
|
+
|
129
117
|
def self.katakana?(str)
|
130
118
|
return KATAKANA_REGEX =~ str
|
131
119
|
end
|
132
|
-
|
120
|
+
|
133
121
|
def self.load_yaml(data,file: nil,**kargs)
|
134
122
|
require 'psychgus'
|
135
|
-
|
123
|
+
|
136
124
|
return Psych.safe_load(data,
|
137
125
|
aliases: false,
|
138
126
|
filename: file,
|
@@ -142,72 +130,72 @@ module NHKore
|
|
142
130
|
**kargs,
|
143
131
|
)
|
144
132
|
end
|
145
|
-
|
133
|
+
|
146
134
|
def self.normalize_str(str)
|
147
135
|
return str.gsub(NORMALIZE_STR_REGEX,'')
|
148
136
|
end
|
149
|
-
|
137
|
+
|
150
138
|
def self.reduce_jpn_space(str)
|
151
139
|
# Do not strip; use a Japanese space
|
152
140
|
return str.gsub(WEB_SPACES_REGEX,JPN_SPACE)
|
153
141
|
end
|
154
|
-
|
142
|
+
|
155
143
|
def self.reduce_space(str)
|
156
144
|
return str.gsub(WEB_SPACES_REGEX,' ')
|
157
145
|
end
|
158
|
-
|
146
|
+
|
159
147
|
def self.replace_uri_query!(uri,**new_query)
|
160
|
-
return uri if new_query.empty?
|
161
|
-
|
148
|
+
return uri if new_query.empty?
|
149
|
+
|
162
150
|
query = uri.query
|
163
|
-
query = query.nil?
|
164
|
-
|
151
|
+
query = query.nil? ? [] : URI.decode_www_form(query)
|
152
|
+
|
165
153
|
# First, remove the old ones.
|
166
|
-
if !query.empty?
|
167
|
-
new_query_keys = Set.new(new_query.keys.map
|
168
|
-
unspace_web_str(key.to_s
|
169
|
-
|
170
|
-
|
171
|
-
query.filter!
|
172
|
-
if q.nil?
|
154
|
+
if !query.empty?
|
155
|
+
new_query_keys = Set.new(new_query.keys.map do |key|
|
156
|
+
unspace_web_str(key.to_s).downcase
|
157
|
+
end)
|
158
|
+
|
159
|
+
query.filter! do |q|
|
160
|
+
if q.nil? || q.empty?
|
173
161
|
false
|
174
162
|
else
|
175
|
-
key = unspace_web_str(q[0].to_s
|
176
|
-
|
163
|
+
key = unspace_web_str(q[0].to_s).downcase
|
164
|
+
|
177
165
|
!new_query_keys.include?(key)
|
178
166
|
end
|
179
167
|
end
|
180
168
|
end
|
181
|
-
|
169
|
+
|
182
170
|
# Next, add the new ones.
|
183
|
-
new_query.each
|
184
|
-
query << [key,value.nil?
|
171
|
+
new_query.each do |key,value|
|
172
|
+
query << [key,value.nil? ? '' : value]
|
185
173
|
end
|
186
|
-
|
174
|
+
|
187
175
|
uri.query = URI.encode_www_form(query)
|
188
|
-
|
176
|
+
|
189
177
|
return uri
|
190
178
|
end
|
191
|
-
|
179
|
+
|
192
180
|
def self.sane_year?(year)
|
193
181
|
return year >= MIN_SANE_YEAR && year <= MAX_SANE_YEAR
|
194
182
|
end
|
195
|
-
|
183
|
+
|
196
184
|
# String's normal strip() method doesn't work with special Unicode/HTML white space.
|
197
185
|
def self.strip_web_str(str)
|
198
186
|
# After testing with Benchmark, this is slower than one regex.
|
199
187
|
#str = str.gsub(/\A[[:space:]]+/,'')
|
200
188
|
#str = str.gsub(/[[:space:]]+\z/,'')
|
201
|
-
|
189
|
+
|
202
190
|
str = str.gsub(STRIP_WEB_STR_REGEX,'')
|
203
|
-
|
191
|
+
|
204
192
|
return str
|
205
193
|
end
|
206
|
-
|
194
|
+
|
207
195
|
def self.unspace_web_str(str)
|
208
196
|
return str.gsub(WEB_SPACES_REGEX,'')
|
209
197
|
end
|
210
|
-
|
198
|
+
|
211
199
|
def self.warn(msg,uplevel: 1)
|
212
200
|
Kernel.warn(msg,uplevel: uplevel)
|
213
201
|
end
|
data/lib/nhkore/variator.rb
CHANGED
@@ -1,46 +1,34 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of NHKore.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# NHKore is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with NHKore. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
24
12
|
module NHKore
|
25
13
|
###
|
26
|
-
# @author Jonathan Bradley Whited
|
14
|
+
# @author Jonathan Bradley Whited
|
27
15
|
# @since 0.2.0
|
28
16
|
###
|
29
17
|
class Variator
|
30
18
|
def begin_variate(str)
|
31
19
|
return str
|
32
20
|
end
|
33
|
-
|
21
|
+
|
34
22
|
def variate(str)
|
35
23
|
str = begin_variate(str)
|
36
24
|
str = end_variate(str)
|
37
|
-
|
25
|
+
|
38
26
|
return str
|
39
27
|
end
|
40
28
|
end
|
41
|
-
|
29
|
+
|
42
30
|
###
|
43
|
-
# @author Jonathan Bradley Whited
|
31
|
+
# @author Jonathan Bradley Whited
|
44
32
|
# @since 0.2.0
|
45
33
|
###
|
46
34
|
class BasicVariator < Variator
|
@@ -48,38 +36,38 @@ module NHKore
|
|
48
36
|
return [] # No variations; don't return nil
|
49
37
|
end
|
50
38
|
end
|
51
|
-
|
39
|
+
|
52
40
|
###
|
53
41
|
# Guesses a word's dictionary/plain form (辞書形).
|
54
|
-
#
|
42
|
+
#
|
55
43
|
# It doesn't work very well,but better than nothing...
|
56
|
-
#
|
44
|
+
#
|
57
45
|
# @since 0.2.0
|
58
46
|
###
|
59
47
|
class DictFormVariator < Variator
|
60
48
|
attr_accessor :deinflector
|
61
|
-
|
49
|
+
|
62
50
|
def initialize(*)
|
63
51
|
require 'set' # Must require manually because JapaneseDeinflector is old
|
64
52
|
require 'japanese_deinflector'
|
65
|
-
|
53
|
+
|
66
54
|
super
|
67
|
-
|
68
|
-
@deinflector = JapaneseDeinflector.new
|
55
|
+
|
56
|
+
@deinflector = JapaneseDeinflector.new
|
69
57
|
end
|
70
|
-
|
58
|
+
|
71
59
|
def end_variate(str)
|
72
60
|
guess = @deinflector.deinflect(str)
|
73
|
-
|
61
|
+
|
74
62
|
return [] if guess.length < 1
|
75
63
|
return [] if (guess = guess[0])[:weight] < 0.5
|
76
|
-
|
64
|
+
|
77
65
|
return [guess[:word]]
|
78
66
|
end
|
79
67
|
end
|
80
|
-
|
68
|
+
|
81
69
|
###
|
82
|
-
# @author Jonathan Bradley Whited
|
70
|
+
# @author Jonathan Bradley Whited
|
83
71
|
# @since 0.2.0
|
84
72
|
###
|
85
73
|
class BestVariator < DictFormVariator
|
data/lib/nhkore/version.rb
CHANGED
@@ -1,26 +1,14 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of NHKore.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# NHKore is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with NHKore. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
24
12
|
module NHKore
|
25
|
-
VERSION = '0.3.
|
13
|
+
VERSION = '0.3.11'
|
26
14
|
end
|