nhkore 0.3.3 → 0.3.4

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: 0ca67a215cda7c49a82aa824c1322b49285abe332f627c9ad4fae774043cbfc9
4
- data.tar.gz: b62a7e518787e89a3a54bcc66c191b4d3f005a911ab76861e3b118258f31b85f
3
+ metadata.gz: 1db415fe5fa2d6f112fae3ef163b79ddaa88d639de565c4cb35b40fa14fb5a66
4
+ data.tar.gz: c535ba1f719db2c64ba6713c21c6365f51e31361efd6046064cdf700219f30ab
5
5
  SHA512:
6
- metadata.gz: b4e84a07685c71400bd50b270c4ae662e6885f7149fc7ec3dec9476bf9b6b80f402d7f874ddcbef920c2b5034a1d39b44fbcb7e9ece06f3a2d517ca89e37de3d
7
- data.tar.gz: 2527b477b7b7088f2612e4a05e0369b60cacb34bedb6ac59a3296643b6f59fcfce0c054ede67c68e0f4299864795bd79f04a85020d8f4c87b67f56c5a5dbeb77
6
+ metadata.gz: af517bada681dc850e60f1c0e275ba35d2177dc413b076612a091217fd653bba82be725c0247c52bb1e342489fe99c731ac7f5efc0b681d54cdcbb02cdb5360b
7
+ data.tar.gz: 579569f8c5201f3fe8b460281d585ac8b10c50c881d18ca6d6ff342fab0c178f0ad6e532df42200db117b0f8e85dbbace87846c85fcdd5c0c4eac1501f4b24e7
data/CHANGELOG.md CHANGED
@@ -2,7 +2,28 @@
2
2
 
3
3
  Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
- ## [[Unreleased]](https://github.com/esotericpig/nhkore/compare/v0.3.3...master)
5
+ ## [[Unreleased]](https://github.com/esotericpig/nhkore/compare/v0.3.4...master)
6
+
7
+ ## [v0.3.4] - 2020-04-25
8
+
9
+ ### Added
10
+ - DatetimeParser
11
+ - Extracted from SiftCmd into its own class
12
+ - Fixed some minor logic bugs from the old code
13
+ - Added new feature where 1 range can be empty:
14
+ - `sift ez -d '...2019'` (from = 1924)
15
+ - `sift ez -d '2019...'` (to = current year)
16
+ - `sift ez -d '...'` (still an error)
17
+ - Added `update_core` rake task for dev
18
+ - Makes pushing a new release much easier
19
+ - See *Hacking.Releasing* section in *README*
20
+
21
+ ### Fixed
22
+ - SiftCmd `parse_sift_datetime()` for `-d/--datetime` option
23
+ - Didn't work exactly right (as written in *README*) for some special inputs:
24
+ - `-d '2019...3'`
25
+ - `-d '3-3'`
26
+ - `-d '3'`
6
27
 
7
28
  ## [v0.3.3] - 2020-04-23
8
29
 
data/README.md CHANGED
@@ -26,6 +26,8 @@ This is similar to a [core word/vocabulary list](https://www.fluentin3months.com
26
26
  - [News Command](#news-command-)
27
27
  - [Using the Library](#using-the-library-)
28
28
  - [Hacking](#hacking-)
29
+ - [Updating](#updating-)
30
+ - [Releasing](#releasing-)
29
31
  - [License](#license-)
30
32
 
31
33
  ## For Non-Power Users [^](#contents)
@@ -525,7 +527,7 @@ doc = ss.html_doc()
525
527
  doc.css('a').each() do |anchor|
526
528
  link = anchor['href']
527
529
 
528
- next if ss.ignore_link?(link)
530
+ next if ss.ignore_link?(link,cleaned: false)
529
531
 
530
532
  if link.include?('https://www3.nhk')
531
533
  puts link
@@ -564,6 +566,7 @@ end
564
566
 
565
567
  ```Ruby
566
568
  require 'nhkore/article_scraper'
569
+ require 'time'
567
570
 
568
571
  as = NHKore::ArticleScraper.new(
569
572
  'https://www3.nhk.or.jp/news/easy/k10011862381000/k10011862381000.html',
@@ -687,6 +690,7 @@ end
687
690
  `Sifter` will sift & sort the `News` data into a single file. The data is sorted by frequency in descending order (i.e., most frequent words first).
688
691
 
689
692
  ```Ruby
693
+ require 'nhkore/datetime_parser'
690
694
  require 'nhkore/news'
691
695
  require 'nhkore/sifter'
692
696
  require 'time'
@@ -698,7 +702,8 @@ sifter = NHKore::Sifter.new(news)
698
702
  sifter.caption = 'Sakura Fields Forever!'
699
703
 
700
704
  # Filter the data.
701
- #sifter.filter_by_datetime(Time.new(2019,12,5))
705
+ sifter.filter_by_datetime(NHKore::DatetimeParser.parse_range('2019-12-4...7'))
706
+ sifter.filter_by_datetime([Time.new(2019,12,4),Time.new(2019,12,7)])
702
707
  sifter.filter_by_datetime(
703
708
  from: Time.new(2019,12,4),to: Time.new(2019,12,7)
704
709
  )
@@ -727,13 +732,14 @@ if !File.exist?(file)
727
732
  end
728
733
  ```
729
734
 
730
- ### Util & UserAgents
735
+ ### Util, UserAgents, & DatetimeParser
731
736
 
732
737
  These provide a variety of useful methods/constants.
733
738
 
734
739
  Here are some of the most useful ones:
735
740
 
736
741
  ```Ruby
742
+ require 'nhkore/datetime_parser'
737
743
  require 'nhkore/user_agents'
738
744
  require 'nhkore/util'
739
745
 
@@ -759,14 +765,16 @@ puts
759
765
  puts '========'
760
766
  puts '[ Time ]'
761
767
  puts '========'
762
- puts "JST now: #{Util.jst_now}"
768
+ puts "JST now: #{Util.jst_now()}"
763
769
  # Drops in JST_OFFSET, does not change hour/min.
764
770
  puts "JST time: #{Util.jst_time(Time.now)}"
765
771
  puts "JST year: #{Util::JST_YEAR}"
766
772
  puts "1999 sane? #{Util.sane_year?(1999)}" # true
767
773
  puts "1776 sane? #{Util.sane_year?(1776)}" # false
768
- puts "Guess 5: #{Util.guess_year(5)}" # 2005
769
- puts "Guess 99: #{Util.guess_year(99)}" # 1999
774
+ puts "Guess 5: #{DatetimeParser.guess_year(5)}" # 2005
775
+ puts "Guess 99: #{DatetimeParser.guess_year(99)}" # 1999
776
+ # => [2020-12-01 00:00:00 +0900, 2020-12-31 23:59:59 +0900]
777
+ puts "Parse: #{DatetimeParser.parse_range('2020-12')}"
770
778
  puts
771
779
  puts "JST timezone offset: #{Util::JST_OFFSET}"
772
780
  puts "JST timezone offset hour: #{Util::JST_OFFSET_HOUR}"
@@ -792,9 +800,9 @@ def fmt_jpn()
792
800
  end
793
801
 
794
802
  puts " #{fmt_jpn{|x| x}}"
795
- puts "Hiragana? #{fmt_jpn{|x| !!Util.hiragana?(x)}}"
796
- puts "Kana? #{fmt_jpn{|x| !!Util.kana?(x)}}"
797
- puts "Kanji? #{fmt_jpn{|x| !!Util.kanji?(x)}}"
803
+ puts "Hiragana? #{fmt_jpn{|x| Util.hiragana?(x)}}"
804
+ puts "Kana? #{fmt_jpn{|x| Util.kana?(x)}}"
805
+ puts "Kanji? #{fmt_jpn{|x| Util.kanji?(x)}}"
798
806
  puts "Reduce: #{Util.reduce_jpn_space("' '")}"
799
807
  puts
800
808
 
@@ -842,9 +850,25 @@ You can make some changes/fixes to the code and then install your local version:
842
850
 
843
851
  `$ bundle exec rake install:local`
844
852
 
845
- ### Releasing/Publishing
853
+ ### Updating [^](#contents)
854
+
855
+ This will update *core/* for you:
856
+
857
+ `$ bundle exec rake update_core`
858
+
859
+ ### Releasing [^](#contents)
846
860
 
847
- `$ bundle exec rake release`
861
+ 1. Update *CHANGELOG.md*, *version.rb*, & *Gemfile.lock*
862
+ - *Raketary*: `$ raketary bump -v`
863
+ - Run: `$ bundle update`
864
+ 2. Run: `$ bundle exec rake update_core`
865
+ 3. Run: `$ bundle exec rake clobber pkg_core`
866
+ 4. Create a new release & tag
867
+ - Add `pkg/nhkore-core.zip`
868
+ 5. Run: `$ git pull`
869
+ 6. Upload GitHub package
870
+ - *Raketary*: `$ raketary github_pkg`
871
+ 7. Run: `$ bundle exec rake release`
848
872
 
849
873
  ## License [^](#contents)
850
874
 
data/Rakefile CHANGED
@@ -63,6 +63,31 @@ Rake::TestTask.new() do |task|
63
63
  task.warning = true
64
64
  end
65
65
 
66
+ # If you need to run a part after the 1st part,
67
+ # just type 'n' to not overwrite the file and then 'y' for continue.
68
+ desc "Update '#{File.join(NHKore::Util::CORE_DIR,'')}' files for release"
69
+ task :update_core do |task|
70
+ require 'highline'
71
+
72
+ CONTINUE_MSG = "\nContinue (y/n)? "
73
+
74
+ cmd = ['ruby','-w','./lib/nhkore.rb','-t','300','-m','10']
75
+ hl = HighLine.new()
76
+
77
+ next unless sh(*cmd,'se','ez','bing')
78
+ next unless hl.agree(CONTINUE_MSG)
79
+ puts
80
+
81
+ next unless sh(*cmd,'news','-s','100','ez')
82
+ next unless hl.agree(CONTINUE_MSG)
83
+ puts
84
+
85
+ next unless sh(*cmd,'sift','-e','csv' ,'ez')
86
+ next unless sh(*cmd,'sift','-e','html','ez')
87
+ next unless sh(*cmd,'sift','-e','json','ez')
88
+ next unless sh(*cmd,'sift','-e','yml' ,'ez')
89
+ end
90
+
66
91
  YARD::Rake::YardocTask.new() do |task|
67
92
  task.files = [File.join('lib','**','*.rb')]
68
93
 
@@ -23,6 +23,7 @@
23
23
 
24
24
  require 'time'
25
25
 
26
+ require 'nhkore/datetime_parser'
26
27
  require 'nhkore/error'
27
28
  require 'nhkore/missingno'
28
29
  require 'nhkore/news'
@@ -57,7 +58,7 @@ module CLI
57
58
  date time to use as a fallback in cases when an article doesn't have one;
58
59
  format: YYYY-mm-dd H:M; example: 2020-03-30 15:30
59
60
  EOD
60
- value = Time.strptime(value,'%Y-%m-%d %H:%M',&Util.method(:guess_year))
61
+ value = Time.strptime(value,'%Y-%m-%d %H:%M',&DatetimeParser.method(:guess_year))
61
62
  value = Util.jst_time(value)
62
63
  value
63
64
  end
@@ -83,7 +83,7 @@ module CLI
83
83
  key = key.to_s()
84
84
 
85
85
  if key.include?('show')
86
- raise CLIError.new("must specify a sub command for option[#{key}]")
86
+ raise CLIError,"must specify a sub command for option[#{key}]"
87
87
  end
88
88
  end
89
89
 
@@ -283,7 +283,7 @@ module CLI
283
283
  puts "> Easy: #{BingScraper.build_url(SearchScraper::YASASHII_SITE,count: count)}"
284
284
  puts "> Regular: #{BingScraper.build_url(SearchScraper::FUTSUU_SITE,count: count)}"
285
285
  else
286
- raise CLIError.new('must specify a sub command for option[show-urls]')
286
+ raise CLIError,'must specify a sub command for option[show-urls]'
287
287
  end
288
288
 
289
289
  return true
@@ -24,6 +24,7 @@
24
24
  require 'date'
25
25
  require 'time'
26
26
 
27
+ require 'nhkore/datetime_parser'
27
28
  require 'nhkore/news'
28
29
  require 'nhkore/sifter'
29
30
  require 'nhkore/util'
@@ -41,26 +42,6 @@ module CLI
41
42
  DEFAULT_SIFT_YASASHII_FILE = "#{Sifter::DEFAULT_YASASHII_FILE}{search.criteria}{file.ext}"
42
43
  SIFT_EXTS = [:csv,:htm,:html,:json,:yaml,:yml]
43
44
 
44
- # Order matters.
45
- SIFT_DATETIME_FMTS = [
46
- '%Y-%m-%d %H:%M',
47
- '%Y-%m-%d %H',
48
- '%Y-%m-%d',
49
- '%m-%d %H:%M',
50
- '%Y-%m %H:%M',
51
- '%m-%d %H',
52
- '%Y-%m %H',
53
- '%m-%d',
54
- '%Y-%m',
55
- '%d %H:%M',
56
- '%y %H:%M',
57
- '%d %H',
58
- '%Y %H',
59
- '%H:%M',
60
- '%d',
61
- '%Y'
62
- ]
63
-
64
45
  attr_accessor :sift_datetime_text
65
46
  attr_accessor :sift_search_criteria
66
47
 
@@ -90,7 +71,11 @@ module CLI
90
71
  '9' (9th of Current Year & Month)
91
72
  EOD
92
73
  app.sift_datetime_text = value # Save the original value for the file name
93
- value = app.parse_sift_datetime(value)
74
+
75
+ value = DatetimeParser.parse_range(value)
76
+
77
+ app.check_empty_opt(:datetime,value) if value.nil?()
78
+
94
79
  value
95
80
  end
96
81
  option :e,:ext,<<-EOD,argument: :required,default: DEFAULT_SIFT_EXT,transform: -> (value) do
@@ -211,96 +196,6 @@ module CLI
211
196
  return filename
212
197
  end
213
198
 
214
- # TODO: This should probably be moved into its own class, into Util, or into Sifter?
215
- def parse_sift_datetime(value)
216
- value = Util.reduce_space(value).strip() # Don't use unspace_web_str(), want spaces for formats
217
- value = value.split('...',2)
218
-
219
- check_empty_opt(:datetime,nil) if value.empty?() # For ''
220
-
221
- # Make a "to" and a "from" date time range.
222
- value << value[0].dup() if value.length == 1
223
-
224
- to_day = nil
225
- to_hour = 23
226
- to_minute = 59
227
- to_month = 12
228
- to_year = Util::MAX_SANE_YEAR
229
-
230
- value.each_with_index() do |v,i|
231
- v = check_empty_opt(:datetime,v) # For '...', '12-25...', or '...12-25'
232
-
233
- has_day = false
234
- has_hour = false
235
- has_minute = false
236
- has_month = false
237
- has_year = false
238
-
239
- SIFT_DATETIME_FMTS.each_with_index() do |fmt,i|
240
- begin
241
- # If don't do this, "%d" values will be parsed using "%d %H".
242
- # It seems as though strptime() ignores space.
243
- raise ArgumentError if !v.include?(' ') && fmt.include?(' ')
244
-
245
- # If don't do this, "%y" values will be parsed using "%d".
246
- raise ArgumentError if fmt == '%d' && v.length > 2
247
-
248
- v = Time.strptime(v,fmt,&Util.method(:guess_year))
249
-
250
- has_day = fmt.include?('%d')
251
- has_hour = fmt.include?('%H')
252
- has_minute = fmt.include?('%M')
253
- has_month = fmt.include?('%m')
254
- has_year = fmt.include?('%Y')
255
-
256
- break # No problem; this format worked
257
- rescue ArgumentError
258
- # Out of formats.
259
- raise if i >= (SIFT_DATETIME_FMTS.length - 1)
260
- end
261
- end
262
-
263
- # "From" date time.
264
- if i == 0
265
- # Set these so that "2012-7-4...7-9" will use the appropriate year
266
- # of "2012" for "7-9".
267
- to_day = v.day if has_day
268
- to_hour = v.hour if has_hour
269
- to_minute = v.min if has_minute
270
- to_month = v.month if has_month
271
- to_year = v.year if has_year
272
-
273
- v = Time.new(
274
- has_year ? v.year : Util::MIN_SANE_YEAR,
275
- has_month ? v.month : 1,
276
- has_day ? v.day : 1,
277
- has_hour ? v.hour : 0,
278
- has_minute ? v.min : 0
279
- )
280
- # "To" date time.
281
- else
282
- to_hour = v.hour if has_hour
283
- to_minute = v.min if has_minute
284
- to_month = v.month if has_month
285
- to_year = v.year if has_year
286
-
287
- if has_day
288
- to_day = v.day
289
- # Nothing passed from the "from" date time?
290
- elsif to_day.nil?()
291
- # Last day of month.
292
- to_day = Date.new(to_year,to_month,-1).day
293
- end
294
-
295
- v = Time.new(to_year,to_month,to_day,to_hour,to_minute)
296
- end
297
-
298
- value[i] = v
299
- end
300
-
301
- return value
302
- end
303
-
304
199
  def run_sift_cmd(type)
305
200
  news_name = nil
306
201
 
@@ -0,0 +1,342 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ #--
6
+ # This file is part of NHKore.
7
+ # Copyright (c) 2020 Jonathan Bradley Whited (@esotericpig)
8
+ #
9
+ # NHKore is free software: you can redistribute it and/or modify
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/>.
21
+ #++
22
+
23
+
24
+ require 'attr_bool'
25
+ require 'date'
26
+ require 'time'
27
+
28
+ require 'nhkore/util'
29
+
30
+
31
+ module NHKore
32
+ ###
33
+ # @author Jonathan Bradley Whited (@esotericpig)
34
+ # @since 0.3.4
35
+ ###
36
+ class DatetimeParser
37
+ # Order matters!
38
+ FMTS = [
39
+ '%Y-%m-%d %H:%M',
40
+ '%Y-%m-%d %H',
41
+ '%Y-%m-%d',
42
+ '%m-%d %H:%M',
43
+ '%Y-%m %H:%M',
44
+ '%m-%d %H',
45
+ '%Y-%m %H',
46
+ '%m-%d',
47
+ '%Y-%m',
48
+ '%d %H:%M',
49
+ '%y %H:%M',
50
+ '%d %H',
51
+ '%Y %H',
52
+ '%H:%M',
53
+ '%d',
54
+ '%Y',
55
+ ]
56
+
57
+ def self.guess_year(year)
58
+ if year < 1000
59
+ century = Util::JST_YEAR / 100 * 100 # 2120 -> 2100
60
+ millennium = Util::JST_YEAR / 1000 * 1000 # 2120 -> 2000
61
+
62
+ # If year <= 23 (2022 -> 23)...
63
+ if year <= ((Util::JST_YEAR % 100) + 1)
64
+ # Assume this century.
65
+ year = century + year
66
+ elsif year >= 100
67
+ # If (2000 + 150) <= 2201 (if current year is 2200)...
68
+ if (millennium + year) <= (Util::JST_YEAR + 1)
69
+ # Assume this millennium.
70
+ # So if the current year is 2200, and year is 150,
71
+ # then it will be 2000 + 150 = 2150.
72
+ year = millennium + year
73
+ else
74
+ # Assume previous millennium (2000 -> 1000),
75
+ # so year 999 will become 1999.
76
+ millennium -= 1000 if millennium >= 1000
77
+ year = millennium + year
78
+ end
79
+ else
80
+ # Assume previous century (2000 -> 1900).
81
+ century -= 100 if century >= 100
82
+ year = century + year
83
+ end
84
+ end
85
+
86
+ return year
87
+ end
88
+
89
+ def self.parse_range(value)
90
+ # Do not use unspace_web_str(), want spaces for formats.
91
+ value = Util.strip_web_str(Util.reduce_space(value))
92
+ values = value.split('...',2)
93
+
94
+ return nil if values.empty?() # For '' or '...'
95
+
96
+ # For '2020...' or '...2020'.
97
+ if value.include?('...')
98
+ # values.length is always 2 because of 2 in split() above.
99
+
100
+ # For '2020...'.
101
+ if Util.empty_web_str?(values[1])
102
+ values[1] = :infinity
103
+ # For '...2020'.
104
+ elsif Util.empty_web_str?(values[0])
105
+ values[0] = :infinity
106
+ end
107
+ end
108
+
109
+ datetimes = [
110
+ DatetimeParser.new(), # "From" date time
111
+ DatetimeParser.new(), # "To" date time
112
+ ]
113
+
114
+ values.each_with_index() do |v,i|
115
+ dt = datetimes[i]
116
+
117
+ # Minimum/Maximum date time for '2020...' or '...2020'.
118
+ if v == :infinity
119
+ # "From" date time.
120
+ if i == 0
121
+ dt.min!()
122
+ # "To" date time.
123
+ else
124
+ dt.max!()
125
+ end
126
+ else
127
+ v = Util.strip_web_str(v)
128
+
129
+ FMTS.each_with_index() do |fmt,i|
130
+ begin
131
+ # If don't do this, "%d" values will be parsed using "%d %H".
132
+ # It seems as though strptime() ignores space.
133
+ raise ArgumentError if fmt.include?(' ') && !v.include?(' ')
134
+
135
+ # If don't do this, "%y..." values will be parsed using "%d...".
136
+ raise ArgumentError if fmt.start_with?('%d') && v.split(' ')[0].length > 2
137
+
138
+ dt.parse!(v,fmt)
139
+
140
+ break # No problem; this format worked
141
+ rescue ArgumentError
142
+ # Out of formats.
143
+ raise if i >= (FMTS.length - 1)
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ from = datetimes[0]
150
+ to = datetimes[1]
151
+
152
+ from.autofill!(:from,to)
153
+ to.autofill!(:to,from)
154
+
155
+ return [from.jst_time(),to.jst_time()]
156
+ end
157
+
158
+ attr_accessor :day
159
+ attr_accessor :hour
160
+ attr_accessor :min
161
+ attr_accessor :month
162
+ attr_accessor :sec
163
+ attr_accessor :year
164
+
165
+ attr_accessor? :has_day
166
+ attr_accessor? :has_hour
167
+ attr_accessor? :has_min
168
+ attr_accessor? :has_month
169
+ attr_accessor? :has_sec
170
+ attr_accessor? :has_year
171
+
172
+ attr_reader? :min_or_max
173
+
174
+ def initialize(year=nil,month=nil,day=nil,hour=nil,min=nil,sec=nil)
175
+ super()
176
+
177
+ set!(year,month,day,hour,min,sec)
178
+
179
+ self.has = false
180
+ @min_or_max = false
181
+ end
182
+
183
+ def autofill!(type,other)
184
+ case type
185
+ when :from
186
+ is_from = true
187
+ when :to
188
+ is_from = false
189
+ else
190
+ raise ArgumentError,"invalid type[#{type}]"
191
+ end
192
+
193
+ return self if @min_or_max
194
+
195
+ has_small = false
196
+ jst_now = Util.jst_now()
197
+
198
+ # Must be from smallest to biggest.
199
+
200
+ if @has_sec || other.has_sec?()
201
+ @sec = other.sec unless @has_sec
202
+ has_small = true
203
+ else
204
+ if has_small
205
+ @sec = jst_now.sec
206
+ else
207
+ @sec = is_from ? 0 : 59
208
+ end
209
+ end
210
+
211
+ if @has_min || other.has_min?()
212
+ @min = other.min unless @has_min
213
+ has_small = true
214
+ else
215
+ if has_small
216
+ @min = jst_now.min
217
+ else
218
+ @min = is_from ? 0 : 59
219
+ end
220
+ end
221
+
222
+ if @has_hour || other.has_hour?()
223
+ @hour = other.hour unless @has_hour
224
+ has_small = true
225
+ else
226
+ if has_small
227
+ @hour = jst_now.hour
228
+ else
229
+ @hour = is_from ? 0 : 23
230
+ end
231
+ end
232
+
233
+ if @has_day || other.has_day?()
234
+ @day = other.day unless @has_day
235
+ has_small = true
236
+ else
237
+ if has_small
238
+ @day = jst_now.day
239
+ else
240
+ @day = is_from ? 1 : :last_day
241
+ end
242
+ end
243
+
244
+ if @has_month || other.has_month?()
245
+ @month = other.month unless @has_month
246
+ has_small = true
247
+ else
248
+ if has_small
249
+ @month = jst_now.month
250
+ else
251
+ @month = is_from ? 1 : 12
252
+ end
253
+ end
254
+
255
+ if @has_year || other.has_year?()
256
+ @year = other.year unless @has_year
257
+ has_small = true
258
+ else
259
+ if has_small
260
+ @year = jst_now.year
261
+ else
262
+ @year = is_from ? Util::MIN_SANE_YEAR : jst_now.year
263
+ end
264
+ end
265
+
266
+ # Must be after setting @year & @month.
267
+ if @day == :last_day
268
+ @day = Date.new(@year,@month,-1).day
269
+ end
270
+
271
+ return self
272
+ end
273
+
274
+ def max!()
275
+ @min_or_max = true
276
+
277
+ # Ex: 2020-12-31 23:59:59
278
+ return set!(Util::JST_YEAR,12,31,23,59,59)
279
+ end
280
+
281
+ def min!()
282
+ @min_or_max = true
283
+
284
+ # Ex: 1924-01-01 00:00:00
285
+ return set!(Util::MIN_SANE_YEAR,1,1,0,0,0)
286
+ end
287
+
288
+ def parse!(value,fmt)
289
+ value = Time.strptime(value,fmt,&self.class.method(:guess_year))
290
+
291
+ @has_day = fmt.include?('%d')
292
+ @has_hour = fmt.include?('%H')
293
+ @has_min = fmt.include?('%M')
294
+ @has_month = fmt.include?('%m')
295
+ @has_sec = fmt.include?('%S')
296
+ @has_year = fmt.include?('%Y')
297
+
298
+ @day = value.day if @has_day
299
+ @hour = value.hour if @has_hour
300
+ @min = value.min if @has_min
301
+ @month = value.month if @has_month
302
+ @sec = value.sec if @has_sec
303
+ @year = value.year if @has_year
304
+
305
+ return self
306
+ end
307
+
308
+ def set!(year=nil,month=nil,day=nil,hour=nil,min=nil,sec=nil)
309
+ @year = year
310
+ @month = month
311
+ @day = day
312
+ @hour = hour
313
+ @min = min
314
+ @sec = sec
315
+
316
+ return self
317
+ end
318
+
319
+ def has=(value)
320
+ @has_day = value
321
+ @has_hour = value
322
+ @has_min = value
323
+ @has_month = value
324
+ @has_sec = value
325
+ @has_year = value
326
+
327
+ return self
328
+ end
329
+
330
+ def jst_time()
331
+ return Util.jst_time(time())
332
+ end
333
+
334
+ def time()
335
+ return Time.new(@year,@month,@day,@hour,@min,@sec)
336
+ end
337
+
338
+ def to_s()
339
+ return "#{@year}-#{@month}-#{@day} #{@hour}:#{@min}:#{@sec}"
340
+ end
341
+ end
342
+ end
data/lib/nhkore/lib.rb CHANGED
@@ -24,6 +24,7 @@
24
24
  require 'nhkore/article'
25
25
  require 'nhkore/article_scraper'
26
26
  require 'nhkore/cleaner'
27
+ require 'nhkore/datetime_parser'
27
28
  require 'nhkore/defn'
28
29
  require 'nhkore/dict'
29
30
  require 'nhkore/dict_scraper'
data/lib/nhkore/util.rb CHANGED
@@ -108,23 +108,6 @@ module NHKore
108
108
  return !str.match?(/[\/\\]/)
109
109
  end
110
110
 
111
- def self.guess_year(year)
112
- if year < 100
113
- # 2021 -> 2000.
114
- millennium = JST_YEAR / 100 * 100
115
-
116
- # If year <= (2021 -> 21), assume this century.
117
- if year <= (JST_YEAR % 100)
118
- year = millennium + year
119
- else
120
- # Assume previous century (2000 -> 1900).
121
- year = (millennium - 100) + year
122
- end
123
- end
124
-
125
- return year
126
- end
127
-
128
111
  def self.hiragana?(str)
129
112
  return HIRAGANA_REGEX =~ str
130
113
  end
@@ -22,5 +22,5 @@
22
22
 
23
23
 
24
24
  module NHKore
25
- VERSION = '0.3.3'
25
+ VERSION = '0.3.4'
26
26
  end
data/nhkore.gemspec CHANGED
@@ -67,7 +67,7 @@ Gem::Specification.new() do |spec|
67
67
  spec.add_runtime_dependency 'http-cookie' ,'~> 1.0' # For parsing/setting cookies (BingScraper/Scraper)
68
68
  spec.add_runtime_dependency 'japanese_deinflector' ,'~> 0.0' # For unconjugating Japanese words (plain/dictionary form)
69
69
  spec.add_runtime_dependency 'nokogiri' ,'~> 1.10' # For scraping/hacking
70
- spec.add_runtime_dependency 'psychgus' ,'~> 1.2' # For styling Psych YAML
70
+ spec.add_runtime_dependency 'psychgus' ,'~> 1.3' # For styling Psych YAML
71
71
  spec.add_runtime_dependency 'public_suffix' ,'~> 4.0' # For parsing URL domain names
72
72
  spec.add_runtime_dependency 'rainbow' ,'~> 3.0' # For CLI color output
73
73
  spec.add_runtime_dependency 'rubyzip' ,'~> 2.3' # For extracting Zip files (GetCmd)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nhkore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Bradley Whited (@esotericpig)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-23 00:00:00.000000000 Z
11
+ date: 2020-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attr_bool
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '1.2'
131
+ version: '1.3'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '1.2'
138
+ version: '1.3'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: public_suffix
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -357,6 +357,7 @@ files:
357
357
  - lib/nhkore/cli/news_cmd.rb
358
358
  - lib/nhkore/cli/search_cmd.rb
359
359
  - lib/nhkore/cli/sift_cmd.rb
360
+ - lib/nhkore/datetime_parser.rb
360
361
  - lib/nhkore/defn.rb
361
362
  - lib/nhkore/dict.rb
362
363
  - lib/nhkore/dict_scraper.rb
@@ -389,7 +390,7 @@ metadata:
389
390
  changelog_uri: https://github.com/esotericpig/nhkore/blob/master/CHANGELOG.md
390
391
  homepage_uri: https://github.com/esotericpig/nhkore
391
392
  source_code_uri: https://github.com/esotericpig/nhkore
392
- post_install_message: " \n NHKore v0.3.3\n \n You can now use [nhkore] on the
393
+ post_install_message: " \n NHKore v0.3.4\n \n You can now use [nhkore] on the
393
394
  command line.\n \n Homepage: https://github.com/esotericpig/nhkore\n \n Code:
394
395
  \ https://github.com/esotericpig/nhkore\n Changelog: https://github.com/esotericpig/nhkore/blob/master/CHANGELOG.md\n
395
396
  \ Bugs: https://github.com/esotericpig/nhkore/issues\n \n"