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.
- checksums.yaml +4 -4
- data/.yardopts +6 -0
- data/bin/inat-get +1 -1
- data/inat-get.gemspec +6 -6
- data/lib/extra/enum.rb +4 -0
- data/lib/extra/period.rb +15 -0
- data/lib/inat/app/application.rb +4 -3
- data/lib/inat/app/config/messagelevel.rb +3 -1
- data/lib/inat/app/config/shiftage.rb +1 -1
- data/lib/inat/app/config/updatemode.rb +1 -1
- data/lib/inat/app/config.rb +6 -2
- data/lib/inat/app/globals.rb +6 -3
- data/lib/inat/app/info.rb +18 -13
- data/lib/inat/app/logging.rb +3 -3
- data/lib/inat/app/preamble.rb +1 -1
- data/lib/inat/app/status.rb +3 -9
- data/lib/inat/app/task/context.rb +9 -3
- data/lib/inat/app/task/dsl.rb +5 -3
- data/lib/inat/app/task.rb +2 -2
- data/lib/inat/data/api.rb +210 -181
- data/lib/inat/data/db.rb +9 -4
- data/lib/inat/data/ddl.rb +24 -5
- data/lib/inat/data/entity/comment.rb +8 -4
- data/lib/inat/data/entity/flag.rb +7 -3
- data/lib/inat/data/entity/identification.rb +9 -4
- data/lib/inat/data/entity/observation.rb +27 -14
- data/lib/inat/data/entity/observationphoto.rb +7 -3
- data/lib/inat/data/entity/observationsound.rb +6 -7
- data/lib/inat/data/entity/photo.rb +9 -3
- data/lib/inat/data/entity/place.rb +11 -2
- data/lib/inat/data/entity/project.rb +16 -10
- data/lib/inat/data/entity/projectadmin.rb +4 -4
- data/lib/inat/data/entity/projectobservationrule.rb +3 -4
- data/lib/inat/data/entity/request.rb +7 -3
- data/lib/inat/data/entity/sound.rb +7 -2
- data/lib/inat/data/entity/taxon.rb +11 -3
- data/lib/inat/data/entity/user.rb +7 -3
- data/lib/inat/data/entity/vote.rb +7 -3
- data/lib/inat/data/entity.rb +38 -24
- data/lib/inat/data/enums/conservationstatus.rb +3 -3
- data/lib/inat/data/enums/geoprivacy.rb +3 -1
- data/lib/inat/data/enums/iconictaxa.rb +1 -1
- data/lib/inat/data/enums/identificationcategory.rb +1 -1
- data/lib/inat/data/enums/licensecode.rb +5 -2
- data/lib/inat/data/enums/projectadminrole.rb +1 -1
- data/lib/inat/data/enums/projecttype.rb +5 -3
- data/lib/inat/data/enums/qualitygrade.rb +1 -1
- data/lib/inat/data/enums/rank.rb +1 -1
- data/lib/inat/data/model.rb +73 -24
- data/lib/inat/data/query.rb +14 -9
- data/lib/inat/data/sets/dataset.rb +10 -6
- data/lib/inat/data/sets/list.rb +8 -3
- data/lib/inat/data/sets/listers.rb +10 -4
- data/lib/inat/data/sets/wrappers.rb +111 -82
- data/lib/inat/data/types/location.rb +17 -8
- data/lib/inat/data/types/std.rb +171 -176
- data/lib/inat/report/report_dsl.rb +205 -0
- data/lib/inat/report/table.rb +11 -3
- data/lib/inat/utils/deep.rb +25 -19
- metadata +6 -5
- data/lib/inat/data/cache.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df7509aed95fafc1944ec83113fff7f22e4d0ae6ec8f5f9326c2db57a257ccd2
|
4
|
+
data.tar.gz: dd7eff7e9ef9052bb88b329cdcc0c2beb944595f318a507809f74749a020d559
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 373b8050cfcb590324af92dcbe8add0cc182b1a6210aba67870692b9f3d4547906055bd3e47cdd107ce0ac83d20614e5cb59b812d4991af2b0d65c678b9704b7
|
7
|
+
data.tar.gz: 689eabfd32e1dd385208a27b4e2ac7eec58cfaebf2d9a51e8c2e2cf3569f4223d74e0aa8dc1f031058739893ea8fcbc37cb7a960f57016fcf693f74e1adb21d5
|
data/.yardopts
ADDED
data/bin/inat-get
CHANGED
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 =
|
8
|
-
spec.authors = [
|
9
|
-
spec.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 =
|
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"] =
|
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
|
data/lib/inat/app/application.rb
CHANGED
@@ -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
|
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 =
|
21
|
+
G.logger = INat::App::Logger::new self
|
21
22
|
end
|
22
23
|
|
23
24
|
private def tasks!
|
data/lib/inat/app/config.rb
CHANGED
@@ -10,9 +10,13 @@ require_relative 'config/messagelevel'
|
|
10
10
|
require_relative 'config/updatemode'
|
11
11
|
require_relative 'config/shiftage'
|
12
12
|
|
13
|
-
|
13
|
+
# TODO: переделать в модуль INat::App::Config
|
14
|
+
class INat::Application
|
14
15
|
|
15
|
-
|
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"
|
data/lib/inat/app/globals.rb
CHANGED
@@ -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
|
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
|
3
|
+
module INat
|
4
4
|
|
5
|
-
|
6
|
-
EMAIL = 'shkikhalev@gmail.com'
|
5
|
+
module App
|
7
6
|
|
8
|
-
|
9
|
-
HOMEPAGE = 'https://github.com/shikhalev/inat-get'
|
10
|
-
SOURCE_URL = 'https://github.com/shikhalev/inat-get'
|
7
|
+
module Info
|
11
8
|
|
12
|
-
|
13
|
-
|
9
|
+
AUTHOR = "Ivan Shikhalev"
|
10
|
+
EMAIL = "shkikhalev@gmail.com"
|
14
11
|
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
data/lib/inat/app/logging.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
|
5
|
-
class
|
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
|
data/lib/inat/app/preamble.rb
CHANGED
data/lib/inat/app/status.rb
CHANGED
@@ -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
|
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
|
|
data/lib/inat/app/task/dsl.rb
CHANGED
@@ -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
|
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 =
|
67
|
+
@context = Context::new self, @basename, @path
|
68
68
|
end
|
69
69
|
|
70
70
|
def execute
|