inat-get 0.8.0.11 → 0.8.0.13

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -0
  3. data/bin/inat-get +1 -1
  4. data/inat-get.gemspec +6 -6
  5. data/lib/extra/enum.rb +4 -0
  6. data/lib/extra/period.rb +15 -0
  7. data/lib/inat/app/application.rb +4 -3
  8. data/lib/inat/app/config/messagelevel.rb +3 -1
  9. data/lib/inat/app/config/shiftage.rb +1 -1
  10. data/lib/inat/app/config/updatemode.rb +1 -1
  11. data/lib/inat/app/config.rb +6 -2
  12. data/lib/inat/app/globals.rb +6 -3
  13. data/lib/inat/app/info.rb +18 -13
  14. data/lib/inat/app/logging.rb +3 -3
  15. data/lib/inat/app/preamble.rb +1 -1
  16. data/lib/inat/app/status.rb +3 -9
  17. data/lib/inat/app/task/context.rb +9 -3
  18. data/lib/inat/app/task/dsl.rb +5 -3
  19. data/lib/inat/app/task.rb +2 -2
  20. data/lib/inat/data/api.rb +210 -181
  21. data/lib/inat/data/db.rb +9 -4
  22. data/lib/inat/data/ddl.rb +24 -5
  23. data/lib/inat/data/entity/comment.rb +8 -4
  24. data/lib/inat/data/entity/flag.rb +7 -3
  25. data/lib/inat/data/entity/identification.rb +9 -4
  26. data/lib/inat/data/entity/observation.rb +27 -14
  27. data/lib/inat/data/entity/observationphoto.rb +7 -3
  28. data/lib/inat/data/entity/observationsound.rb +6 -7
  29. data/lib/inat/data/entity/photo.rb +9 -3
  30. data/lib/inat/data/entity/place.rb +11 -2
  31. data/lib/inat/data/entity/project.rb +16 -10
  32. data/lib/inat/data/entity/projectadmin.rb +4 -4
  33. data/lib/inat/data/entity/projectobservationrule.rb +3 -4
  34. data/lib/inat/data/entity/request.rb +7 -3
  35. data/lib/inat/data/entity/sound.rb +7 -2
  36. data/lib/inat/data/entity/taxon.rb +11 -3
  37. data/lib/inat/data/entity/user.rb +7 -3
  38. data/lib/inat/data/entity/vote.rb +7 -3
  39. data/lib/inat/data/entity.rb +38 -24
  40. data/lib/inat/data/enums/conservationstatus.rb +3 -3
  41. data/lib/inat/data/enums/geoprivacy.rb +3 -1
  42. data/lib/inat/data/enums/iconictaxa.rb +1 -1
  43. data/lib/inat/data/enums/identificationcategory.rb +1 -1
  44. data/lib/inat/data/enums/licensecode.rb +5 -2
  45. data/lib/inat/data/enums/projectadminrole.rb +1 -1
  46. data/lib/inat/data/enums/projecttype.rb +5 -3
  47. data/lib/inat/data/enums/qualitygrade.rb +1 -1
  48. data/lib/inat/data/enums/rank.rb +1 -1
  49. data/lib/inat/data/model.rb +73 -24
  50. data/lib/inat/data/query.rb +14 -9
  51. data/lib/inat/data/sets/dataset.rb +10 -6
  52. data/lib/inat/data/sets/list.rb +8 -3
  53. data/lib/inat/data/sets/listers.rb +10 -4
  54. data/lib/inat/data/sets/wrappers.rb +111 -82
  55. data/lib/inat/data/types/location.rb +17 -8
  56. data/lib/inat/data/types/std.rb +171 -176
  57. data/lib/inat/report/report_dsl.rb +205 -0
  58. data/lib/inat/report/table.rb +11 -3
  59. data/lib/inat/utils/deep.rb +25 -19
  60. metadata +6 -5
  61. data/lib/inat/data/cache.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd46b6875ef0b9feaa0a8632c86ad0a72d234958452bd04c7e879f433324c53f
4
- data.tar.gz: 91b31159aba05e86a5f5fd154bb197267a55b3ccbf6b14781fb399bd249a27ed
3
+ metadata.gz: df7509aed95fafc1944ec83113fff7f22e4d0ae6ec8f5f9326c2db57a257ccd2
4
+ data.tar.gz: dd7eff7e9ef9052bb88b329cdcc0c2beb944595f318a507809f74749a020d559
5
5
  SHA512:
6
- metadata.gz: 1cf679179ea4e548ea3ced47bb7e6cd9039d6a5c79404f5a944b2fb098bb4520b23d77e3116628e59acdd25bd359877ff60a9c81fcda84d4a0a53faba0354c49
7
- data.tar.gz: 0606f69e8a4fac67df1382fd67f3bda21bd678e5f8655b58deb4355018be4ba29f3dfb0bce7411b51fc05e8c5be34227c361cf2fe2810afe6b059b7606ccad37
6
+ metadata.gz: 373b8050cfcb590324af92dcbe8add0cc182b1a6210aba67870692b9f3d4547906055bd3e47cdd107ce0ac83d20614e5cb59b812d4991af2b0d65c678b9704b7
7
+ data.tar.gz: 689eabfd32e1dd385208a27b4e2ac7eec58cfaebf2d9a51e8c2e2cf3569f4223d74e0aa8dc1f031058739893ea8fcbc37cb7a960f57016fcf693f74e1adb21d5
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --no-private
2
+ --title "INat::Get"
3
+ --hide-void-return
4
+ --private
5
+ --asset docs/ doc/docs/
6
+ lib/**/*.rb
data/bin/inat-get CHANGED
@@ -12,7 +12,7 @@ require 'inat/data/entity/request'
12
12
  require 'inat/data/db'
13
13
  require 'inat/data/query'
14
14
 
15
- app = Application.new
15
+ app = INat::Application.new
16
16
  app.run
17
17
  # PP::pp Globals.config, $>, 64
18
18
 
data/inat-get.gemspec CHANGED
@@ -4,18 +4,18 @@ require_relative 'lib/inat/app/info'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "inat-get"
7
- spec.version = AppInfo::VERSION
8
- spec.authors = [ AppInfo::AUTHOR ]
9
- spec.email = [ AppInfo::EMAIL ]
7
+ spec.version = INat::App::Info::VERSION
8
+ spec.authors = [ INat::App::Info::AUTHOR ]
9
+ spec.email = [ INat::App::Info::EMAIL ]
10
10
 
11
11
  spec.summary = "Client for iNaturalist API."
12
12
  # spec.description = "TODO: Write a longer description or delete this line."
13
- spec.homepage = AppInfo::HOMEPAGE
14
- spec.license = "GPL-3.0"
13
+ spec.homepage = INat::App::Info::HOMEPAGE
14
+ spec.license = "GPL-3.0-or-later"
15
15
  spec.required_ruby_version = ">= 3.1.0"
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = AppInfo::SOURCE_URL
18
+ spec.metadata["source_code_uri"] = INat::App::Info::SOURCE_URL
19
19
 
20
20
  spec.files = Dir.chdir(__dir__) do
21
21
  `git ls-files -z`.split("\x0").reject do |f|
data/lib/extra/enum.rb CHANGED
@@ -12,6 +12,7 @@ class Enum
12
12
 
13
13
  private :new
14
14
 
15
+ # @!scope class
15
16
  private def item name, order = nil, description: nil, data: nil
16
17
  raise TypeError, "Name of enum value must be a Symbol!", caller unless Symbol === name
17
18
  raise TypeError, "Order of enum value must be a Integer!", caller unless nil === order || Integer === order
@@ -35,6 +36,7 @@ class Enum
35
36
  return value
36
37
  end
37
38
 
39
+ # @!scope class
38
40
  private def items *names, **names_with_order
39
41
  names.each do |name|
40
42
  item name
@@ -45,6 +47,7 @@ class Enum
45
47
  return values
46
48
  end
47
49
 
50
+ # @!scope class
48
51
  private def item_alias **params
49
52
  @aliases ||= {}
50
53
  params.each do |name, value|
@@ -94,6 +97,7 @@ class Enum
94
97
  end
95
98
  end
96
99
 
100
+ # @!scope class
97
101
  private def get name_or_order
98
102
  return nil if name == nil
99
103
  result = @by_name[name_or_order] || @by_order[name_or_order]
data/lib/extra/period.rb CHANGED
@@ -185,6 +185,7 @@ class Period
185
185
  self.class.make(seconds: (@value / num).to_i)
186
186
  end
187
187
 
188
+ # @private
188
189
  class Num
189
190
 
190
191
  attr_reader :value
@@ -199,6 +200,8 @@ class Period
199
200
 
200
201
  end
201
202
 
203
+ private_constant :Num
204
+
202
205
  def coerce num
203
206
  case num
204
207
  when Integer, Float, Rational
@@ -212,7 +215,9 @@ end
212
215
 
213
216
  class Time
214
217
 
218
+ # @private
215
219
  alias :preperiod_plus :+
220
+ # @private
216
221
  alias :preperiod_minus :-
217
222
 
218
223
  def + arg
@@ -229,22 +234,32 @@ end
229
234
 
230
235
  class Numeric
231
236
 
237
+ #
238
+ # @return [Period]
232
239
  def weeks
233
240
  Period::make(weeks: 1) * self
234
241
  end
235
242
 
243
+ #
244
+ # @return [Period]
236
245
  def days
237
246
  Period::make(days: 1) * self
238
247
  end
239
248
 
249
+ #
250
+ # @return [Period]
240
251
  def hours
241
252
  Period::make(hours: 1) * self
242
253
  end
243
254
 
255
+ #
256
+ # @return [Period]
244
257
  def minutes
245
258
  Period::make(minutes: 1) * self
246
259
  end
247
260
 
261
+ #
262
+ # @return [Period]
248
263
  def seconds
249
264
  Period::make(seconds: 1) * self
250
265
  end
@@ -6,9 +6,10 @@ require_relative 'preamble'
6
6
  require_relative 'globals'
7
7
  require_relative 'task'
8
8
 
9
- class Application
9
+ class INat::Application
10
10
 
11
- include AppPreamble
11
+ include INat::App
12
+ include INat::App::Preamble
12
13
 
13
14
  def logger
14
15
  G.logger
@@ -17,7 +18,7 @@ class Application
17
18
  def initialize
18
19
  setup!
19
20
  G.config = @config.freeze
20
- G.logger = DualLogger::new self
21
+ G.logger = INat::App::Logger::new self
21
22
  end
22
23
 
23
24
  private def tasks!
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'extra/enum'
4
4
 
5
- class MessageLevel < Enum
5
+ module INat::App::Config; end
6
+
7
+ class INat::App::Config::MessageLevel < Enum
6
8
 
7
9
  item :TRACE, -1
8
10
  item :DEBUG, data: 0
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ShiftAge
3
+ module INat::App::Config::ShiftAge
4
4
 
5
5
  class << self
6
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'extra/enum'
4
4
 
5
- class UpdateMode < Enum
5
+ class INat::App::Config::UpdateMode < Enum
6
6
 
7
7
  items :UPDATE,
8
8
  :FORCE,
@@ -10,9 +10,13 @@ require_relative 'config/messagelevel'
10
10
  require_relative 'config/updatemode'
11
11
  require_relative 'config/shiftage'
12
12
 
13
- class Application
13
+ # TODO: переделать в модуль INat::App::Config
14
+ class INat::Application
14
15
 
15
- include AppInfo
16
+ using DeepMerge
17
+
18
+ include INat::App::Info
19
+ include INat::App::Config
16
20
 
17
21
  API_DEFAULT = 'https://api.inaturalist.org/v1/'
18
22
  DEFAULT_LOG = "./#{ NAME }.log"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Globals
3
+ module INat::App::Globals
4
4
 
5
5
  class << self
6
6
 
@@ -40,10 +40,13 @@ module Globals
40
40
 
41
41
  end
42
42
 
43
- G = Globals
43
+ G = INat::App::Globals
44
44
 
45
- module LogDSL
45
+ module INat::App::Logger::DSL
46
46
 
47
+ include INat::App::Config
48
+
49
+ # @private
47
50
  def included mod
48
51
  mod.extend LogDSL
49
52
  end
data/lib/inat/app/info.rb CHANGED
@@ -1,21 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module AppInfo
3
+ module INat
4
4
 
5
- AUTHOR = 'Ivan Shikhalev'
6
- EMAIL = 'shkikhalev@gmail.com'
5
+ module App
7
6
 
8
- VERSION = '0.8.0.11'
9
- HOMEPAGE = 'https://github.com/shikhalev/inat-get'
10
- SOURCE_URL = 'https://github.com/shikhalev/inat-get'
7
+ module Info
11
8
 
12
- EXE = File.basename $0
13
- NAME = File.basename $0, '.rb'
9
+ AUTHOR = "Ivan Shikhalev"
10
+ EMAIL = "shkikhalev@gmail.com"
14
11
 
15
- USAGE = "\e[1mUsage $\e[0m #{EXE} [options] ‹task[, ...]›"
16
- ABOUT = "\e[1mINat::Get v#{VERSION}\e[0m — A toolset for fetching and processing data from \e[4miNaturalist.org\e[0m.\n" +
17
- "\n" +
18
- "\e[1mSource:\e[0m \e[4m#{HOMEPAGE}\e[0m\n" +
19
- "\e[1mAuthor:\e[0m #{AUTHOR} ‹\e[4m#{EMAIL}\e[0m›"
12
+ VERSION = "0.8.0.13"
13
+ HOMEPAGE = "https://github.com/shikhalev/inat-get"
14
+ SOURCE_URL = "https://github.com/shikhalev/inat-get"
20
15
 
16
+ EXE = File.basename $0
17
+ NAME = File.basename $0, ".rb"
18
+
19
+ USAGE = "\e[1mUsage $\e[0m #{EXE} [options] ‹task[, ...]›"
20
+ ABOUT = "\e[1mINat::Get v#{VERSION}\e[0m — A toolset for fetching and processing data from \e[4miNaturalist.org\e[0m.\n" +
21
+ "\n" +
22
+ "\e[1mSource:\e[0m \e[4m#{HOMEPAGE}\e[0m\n" +
23
+ "\e[1mAuthor:\e[0m #{AUTHOR} ‹\e[4m#{EMAIL}\e[0m›"
24
+ end
25
+ end
21
26
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'logger'
4
4
 
5
- class DualLogger
5
+ class INat::App::Logger
6
6
 
7
7
  def config
8
8
  @application.config
@@ -13,14 +13,14 @@ class DualLogger
13
13
  v_para = {
14
14
  level: config[:verbose].severity
15
15
  }
16
- @verb = Logger::new STDERR, **v_para
16
+ @verb = ::Logger::new STDERR, **v_para
17
17
  if config[:log][:enable]
18
18
  f_para = {
19
19
  level: config[:log][:level].severity,
20
20
  }
21
21
  f_para[:shift_age] = config[:log][:shift][:age] if config[:log][:shift][:age]
22
22
  f_para[:shift_level] = config[:log][:shift][:level] if config[:log][:shift][:level]
23
- @file = Logger::new config[:log][:file], **f_para
23
+ @file = ::Logger::new config[:log][:file], **f_para
24
24
  else
25
25
  @file = nil
26
26
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module AppPreamble
3
+ module INat::App::Preamble
4
4
 
5
5
  private def do_clean_requests
6
6
  # NEED: implement
@@ -4,7 +4,7 @@ require_relative 'globals'
4
4
 
5
5
  # TODO: переделать на отдельный поток и очередь статусов. Ввести отдельно ключ, как идентификатор запроса, например.
6
6
 
7
- module Status
7
+ module INat::App::Status
8
8
 
9
9
  class << self
10
10
 
@@ -17,12 +17,6 @@ module Status
17
17
  end
18
18
  end
19
19
 
20
- # private def get_num
21
- # @num ||= 0
22
- # @num += 1
23
- # @num
24
- # end
25
-
26
20
  def init
27
21
  @lines = {}
28
22
  @mutex = Mutex::new
@@ -70,5 +64,5 @@ module Status
70
64
 
71
65
  end
72
66
 
73
- Status::init
74
- G.status = Status
67
+ INat::App::Status::init
68
+ G.status = INat::App::Status
@@ -2,11 +2,17 @@
2
2
 
3
3
  require_relative 'dsl'
4
4
  require_relative '../../report/table'
5
+ require_relative '../../report/report_dsl'
5
6
 
6
- class Task::Context
7
+ class INat::App::Task::Context
7
8
 
8
- include Task::DSL
9
- include TableDSL
9
+ include INat::App::Task::DSL
10
+ include INat::Report::DSL
11
+ include INat::Report::Table::DSL
12
+
13
+ include INat
14
+ include INat::App
15
+ include INat::Report
10
16
 
11
17
  attr_accessor :name
12
18
 
@@ -8,11 +8,13 @@ require_relative '../../data/query'
8
8
  require_relative '../../data/sets/dataset'
9
9
  require_relative '../../data/sets/list'
10
10
 
11
- class Task; end
11
+ class INat::App::Task; end
12
12
 
13
- module Task::DSL
13
+ module INat::App::Task::DSL
14
14
 
15
- include LogDSL
15
+ include INat
16
+ include INat::Report
17
+ include INat::App::Logger::DSL
16
18
 
17
19
  def select **params
18
20
  query = Query::new(**params)
data/lib/inat/app/task.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require_relative 'globals'
4
4
  require_relative 'task/context'
5
5
 
6
- class Task
6
+ class INat::App::Task
7
7
 
8
8
  CHECK_LIST = %w[ . .inat .rb ]
9
9
  FILE_CHECK_LIST = %w[ .inat .iNat .INat .INAT .rb .RB ]
@@ -64,7 +64,7 @@ class Task
64
64
  @application = application
65
65
  @basename, @path = get_names source
66
66
  raise ArgumentError, "File not found: #{source}!" if @path.nil?
67
- @context = Task::Context::new self, @basename, @path
67
+ @context = Context::new self, @basename, @path
68
68
  end
69
69
 
70
70
  def execute