inat-get 0.8.0.12 → 0.8.0.13
Sign up to get free protection for your applications and to get access to all the features.
- 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 +8 -4
- 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 +9 -5
- data/lib/inat/data/sets/list.rb +8 -3
- data/lib/inat/data/sets/listers.rb +10 -5
- data/lib/inat/data/sets/wrappers.rb +79 -75
- 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 +13 -11
- data/lib/inat/report/table.rb +7 -3
- data/lib/inat/utils/deep.rb +25 -19
- metadata +5 -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
|
@@ -4,11 +4,15 @@ require_relative 'dsl'
|
|
4
4
|
require_relative '../../report/table'
|
5
5
|
require_relative '../../report/report_dsl'
|
6
6
|
|
7
|
-
class Task::Context
|
7
|
+
class INat::App::Task::Context
|
8
8
|
|
9
|
-
include Task::DSL
|
10
|
-
include
|
11
|
-
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
|
12
16
|
|
13
17
|
attr_accessor :name
|
14
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
|