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.
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 +8 -4
  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 +9 -5
  52. data/lib/inat/data/sets/list.rb +8 -3
  53. data/lib/inat/data/sets/listers.rb +10 -5
  54. data/lib/inat/data/sets/wrappers.rb +79 -75
  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 +13 -11
  58. data/lib/inat/report/table.rb +7 -3
  59. data/lib/inat/utils/deep.rb +25 -19
  60. metadata +5 -5
  61. data/lib/inat/data/cache.rb +0 -9
@@ -1,170 +1,186 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'time'
4
- require 'date'
5
- require 'uri'
3
+ require "time"
4
+ require "date"
5
+ require "uri"
6
6
 
7
- class Integer
7
+ module INat::Types; end
8
8
 
9
- def self.parse src
10
- return nil if src == nil
11
- return src if Integer === src
12
- return src.to_i if String === src
13
- raise TypeError, "Source must be a String!", caller
14
- end
15
-
16
- def self.ddl
17
- :INTEGER
18
- end
19
-
20
- def self.from_db src
21
- return nil if src == nil
22
- return src if Integer === src
23
- raise TypeError, "Source must be an Integer!", caller
24
- end
25
-
26
- def to_db
27
- self
28
- end
9
+ module Boolean
10
+ end
29
11
 
30
- def to_query
31
- to_s
32
- end
12
+ class TrueClass
13
+ include Boolean
14
+ end
33
15
 
16
+ class FalseClass
17
+ include Boolean
34
18
  end
35
19
 
36
- class String
20
+ # TODO: возможно, разбить по функционалу
37
21
 
38
- def self.parse src
39
- return nil if src == nil
40
- return src if String === src
41
- raise TypeError, "Source must be a String!", caller
42
- end
22
+ module INat::Types::Std
23
+ refine Boolean do
24
+ def to_db
25
+ self && 1 || 0
26
+ end
43
27
 
44
- def self.ddl
45
- :TEXT
28
+ def to_query
29
+ inspect
30
+ end
46
31
  end
47
32
 
48
- def self.from_db src
49
- return nil if src == nil
50
- return src if String === src
51
- raise TypeError, "Source must be a String!", caller
52
- end
33
+ refine Boolean.singleton_class do
34
+ def parse(src)
35
+ return nil if src == nil
36
+ return src if Boolean === src
37
+ raise TypeError, "Source must be a Boolean!", caller
38
+ end
53
39
 
54
- def to_db
55
- self
56
- end
40
+ def ddl
41
+ :INTEGER
42
+ end
57
43
 
58
- def to_query
59
- self
44
+ def from_db(src)
45
+ return nil if src == nil
46
+ return src if Boolean === src
47
+ return src != 0 if Integer === src
48
+ raise TypeError, "Source must be an Integer!", caller
49
+ end
60
50
  end
61
51
 
62
- end
63
-
64
- class Symbol
52
+ refine Integer do
53
+ def to_db
54
+ self
55
+ end
65
56
 
66
- def self.parse src
67
- return nil if src == nil
68
- return src if Symbol === src
69
- return src.intern if String === src
70
- raise TypeError, "Source must be a String!", caller
57
+ def to_query
58
+ to_s
59
+ end
71
60
  end
72
61
 
73
- def self.ddl
74
- :TEXT
75
- end
62
+ refine Integer.singleton_class do
63
+ def parse(src)
64
+ return nil if src == nil
65
+ return src if Integer === src
66
+ return src.to_i if String === src
67
+ raise TypeError, "Source must be a String!", caller
68
+ end
76
69
 
77
- def self.from_db src
78
- return nil if src == nil
79
- return src if Symbol === src
80
- return src.intern if String === src
81
- raise TypeError, "Source must be a String!", caller
82
- end
70
+ def ddl
71
+ :INTEGER
72
+ end
83
73
 
84
- def to_db
85
- self.to_s
74
+ def from_db(src)
75
+ return nil if src == nil
76
+ return src if Integer === src
77
+ raise TypeError, "Source must be an Integer!", caller
78
+ end
86
79
  end
87
80
 
88
- def to_query
89
- to_s
90
- end
81
+ refine String do
82
+ def to_db
83
+ self
84
+ end
91
85
 
92
- end
86
+ def to_query
87
+ self
88
+ end
89
+ end
93
90
 
94
- class Float
91
+ refine String.singleton_class do
92
+ def parse(src)
93
+ return nil if src == nil
94
+ return src if String === src
95
+ raise TypeError, "Source must be a String!", caller
96
+ end
95
97
 
96
- def self.parse src
97
- return nil if src == nil
98
- return src if Float === src
99
- return src.to_f if String === src || Integer === src
100
- raise TypeError, "Source must be a String!", caller
101
- end
98
+ def ddl
99
+ :TEXT
100
+ end
102
101
 
103
- def self.ddl
104
- :REAL
102
+ def from_db(src)
103
+ return nil if src == nil
104
+ return src if String === src
105
+ raise TypeError, "Source must be a String!", caller
106
+ end
105
107
  end
106
108
 
107
- def self.from_db src
108
- return nil if src == nil
109
- return src if Float === src
110
- raise TypeError, "Source must be a Float!", caller
111
- end
109
+ refine Symbol do
110
+ def to_db
111
+ self.to_s
112
+ end
112
113
 
113
- def to_db
114
- self
114
+ def to_query
115
+ to_s
116
+ end
115
117
  end
116
118
 
117
- def to_query
118
- to_s
119
- end
119
+ refine Symbol.singleton_class do
120
+ def parse(src)
121
+ return nil if src == nil
122
+ return src if Symbol === src
123
+ return src.intern if String === src
124
+ raise TypeError, "Source must be a String!", caller
125
+ end
120
126
 
121
- end
127
+ def ddl
128
+ :TEXT
129
+ end
122
130
 
123
- class Time
131
+ def from_db(src)
132
+ return nil if src == nil
133
+ return src if Symbol === src
134
+ return src.intern if String === src
135
+ raise TypeError, "Source must be a String!", caller
136
+ end
137
+ end
124
138
 
125
- class << self
139
+ refine Float do
140
+ def to_db
141
+ self
142
+ end
126
143
 
127
- alias :std_parse :parse
144
+ def to_query
145
+ to_s
146
+ end
147
+ end
128
148
 
129
- def parse src
149
+ refine Float.singleton_class do
150
+ def parse(src)
130
151
  return nil if src == nil
131
- return src if Time === src
132
- return std_parse(src) if String === src
152
+ return src if Float === src
153
+ return src.to_f if String === src || Integer === src
133
154
  raise TypeError, "Source must be a String!", caller
134
155
  end
135
156
 
136
157
  def ddl
137
- :INTEGER
158
+ :REAL
138
159
  end
139
160
 
140
- def from_db src
161
+ def from_db(src)
141
162
  return nil if src == nil
142
- return src if Time === src
143
- return Time::at(src) if Integer === src
144
- raise TypeError, "Source must be an Integer!", caller
163
+ return src if Float === src
164
+ raise TypeError, "Source must be a Float!", caller
145
165
  end
146
-
147
166
  end
148
167
 
149
- def to_db
150
- to_i
151
- end
168
+ refine Time do
169
+ def to_db
170
+ to_i
171
+ end
152
172
 
153
- def to_query
154
- xmlschema
173
+ def to_query
174
+ xmlschema
175
+ end
155
176
  end
156
177
 
157
- end
158
-
159
- class Date
160
-
161
- class << self
162
-
178
+ refine Time.singleton_class do
163
179
  alias :std_parse :parse
164
180
 
165
- def parse src
181
+ def parse(src)
166
182
  return nil if src == nil
167
- return src if Date === src
183
+ return src if Time === src
168
184
  return std_parse(src) if String === src
169
185
  raise TypeError, "Source must be a String!", caller
170
186
  end
@@ -173,79 +189,62 @@ class Date
173
189
  :INTEGER
174
190
  end
175
191
 
176
- def from_db src
192
+ def from_db(src)
177
193
  return nil if src == nil
178
- return src if Date === src
179
- return Time::at(src).to_date if Integer === src
194
+ return src if Time === src
195
+ return Time::at(src) if Integer === src
180
196
  raise TypeError, "Source must be an Integer!", caller
181
197
  end
182
-
183
198
  end
184
199
 
185
- def to_db
186
- to_time.to_i
187
- end
200
+ refine Date do
201
+ def to_db
202
+ to_time.to_i
203
+ end
188
204
 
189
- def to_query
190
- xmlschema
205
+ def to_query
206
+ xmlschema
207
+ end
191
208
  end
192
209
 
193
- end
194
-
195
- module Boolean
196
-
197
- class << self
210
+ refine Date.singleton_class do
211
+ alias :std_parse :parse
198
212
 
199
- def parse src
213
+ def parse(src)
200
214
  return nil if src == nil
201
- return src if Boolean === src
202
- raise TypeError, "Source must be a Boolean!", caller
215
+ return src if Date === src
216
+ return std_parse(src) if String === src
217
+ raise TypeError, "Source must be a String!", caller
203
218
  end
204
219
 
205
220
  def ddl
206
221
  :INTEGER
207
222
  end
208
223
 
209
- def from_db src
224
+ def from_db(src)
210
225
  return nil if src == nil
211
- return src if Boolean === src
212
- return src != 0 if Integer === src
226
+ return src if Date === src
227
+ return Time::at(src).to_date if Integer === src
213
228
  raise TypeError, "Source must be an Integer!", caller
214
229
  end
215
-
216
230
  end
217
231
 
218
- def to_db
219
- self && 1 || 0
220
- end
221
-
222
- def to_query
223
- inspect
232
+ refine URI do
233
+ def to_db
234
+ to_s
235
+ end
224
236
  end
225
237
 
226
- end
227
-
228
- class TrueClass
229
- include Boolean
230
- end
231
-
232
- class FalseClass
233
- include Boolean
234
- end
235
-
236
- module URI
237
-
238
- class << self
239
-
238
+ refine URI.singleton_class do
240
239
  pre_verbose = $VERBOSE
241
240
  $VERBOSE = nil
242
241
 
243
242
  alias :std_parse :parse
244
243
 
245
- def parse src
244
+ def parse(src)
246
245
  return nil if src == nil
247
246
  return src if URI === src
248
- url = URI::DEFAULT_PARSER.escape(src).gsub('+', '%2B')
247
+ url = URI::DEFAULT_PARSER.escape(src).gsub("+", "%2B")
249
248
  return std_parse(url) if String === src
250
249
  raise TypeError, "Source must be a String!", caller
251
250
  end
@@ -256,38 +255,34 @@ module URI
256
255
  :TEXT
257
256
  end
258
257
 
259
- def from_db src
258
+ def from_db(src)
260
259
  parse src
261
260
  # return nil if src == nil
262
261
  # return src if URI === src
263
262
  # return URI(URI::DEFAULT_PARSER.escape(src)) if String === src
264
263
  # raise TypeError, "Source must be a String!", caller
265
264
  end
266
-
267
- end
268
-
269
- def to_db
270
- to_s
271
265
  end
272
266
 
273
- end
274
-
275
- class NilClass
267
+ refine NilClass do
268
+ def self.parse(src)
269
+ nil
270
+ end
276
271
 
277
- def self.parse src
278
- nil
272
+ def to_db
273
+ nil
274
+ end
279
275
  end
280
276
 
281
- def to_db
282
- nil
277
+ refine Array do
278
+ def to_query
279
+ map { |i| i.to_query }.join(",")
280
+ end
283
281
  end
284
282
 
285
- end
286
-
287
- class Array
288
-
289
- def to_query
290
- map { |i| i.to_query }.join(',')
283
+ refine Module do
284
+ def short_name
285
+ name.split("::").last
286
+ end
291
287
  end
292
-
293
288
  end
@@ -2,25 +2,27 @@
2
2
 
3
3
  require_relative 'table'
4
4
 
5
- module ReportDSL
5
+ module INat::Report::DSL
6
6
 
7
- include TableDSL
7
+ include INat
8
+ include INat::Report
9
+ include INat::Report::Table::DSL
8
10
 
9
- def class_title object, is_observer: true
11
+ private def class_title object, is_observer: true
10
12
  case object
11
- when Taxon
13
+ when Entity::Taxon
12
14
  'Таксон'
13
- when Place
15
+ when Entity::Place
14
16
  'Территория'
15
- when Project
17
+ when Entity::Project
16
18
  'Проект'
17
- when User
19
+ when Entity::User
18
20
  if is_observer
19
21
  'Наблюдатель'
20
22
  else
21
23
  'Пользователь'
22
24
  end
23
- when Calendarian
25
+ when Report::Period
24
26
  'Период'
25
27
  else
26
28
  'Объект'
@@ -45,7 +47,7 @@ module ReportDSL
45
47
  @@prefix ||= 0
46
48
  @@prefix += 1
47
49
  users = table do
48
- column '#', width: 3, align: :right, data: :line_no
50
+ column '#', width: 3, align: :right, data: :line_no, marker: true
49
51
  column 'Наблюдатель', data: :user
50
52
  column 'Виды', width: 6, align: :right, data: :species
51
53
  column 'Наблюдения', width: 6, align: :right, data: :observations
@@ -63,7 +65,7 @@ module ReportDSL
63
65
  list.each do |ds|
64
66
  observations = if details
65
67
  if observers
66
- ds.observations.map { |o| "#{ o }<sup><a href=\"\##{ @@prefix }-user-#{ o.user.id }\">#{ user_rows.index { |row| row[:user] == o.user } }</a></sup>" }
68
+ ds.observations.map { |o| "#{ o }<sup><a href=\"\##{ @@prefix }-user-#{ o.user.id }\">#{ user_rows.index { |row| row[:user] == o.user } + 1 }</a></sup>" }
67
69
  else
68
70
  ds.observations.map(&:to_s)
69
71
  end
@@ -155,7 +157,7 @@ module ReportDSL
155
157
 
156
158
  # TODO: разобраться с разными count в разных контекстах.
157
159
  def rating_table list, limit: 1, count: 3, details: true, key: :species, summary: false
158
- object_title = class_title list.first.object
160
+ object_title = class_title list.first&.object
159
161
  rating = table do
160
162
  column '#', width: 3, align: :right, data: :line_no
161
163
  column object_title, data: :object
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Table
3
+ class INat::Report::Table
4
4
 
5
5
  attr_reader :columns
6
6
 
@@ -128,12 +128,16 @@ class Table
128
128
 
129
129
  end
130
130
 
131
- module TableDSL
131
+ module INat::Report::Table::DSL
132
132
 
133
- private def table &block
133
+ include INat::Report
134
+
135
+ def table &block
134
136
  tbl = Table::new
135
137
  tbl.instance_eval(&block) if block_given?
136
138
  tbl
137
139
  end
138
140
 
141
+ module_function :table
142
+
139
143
  end
@@ -1,30 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Hash
4
-
5
- def deep_merge! other
6
- other.each do |key, value|
7
- if has_key?(key) && self[key].respond_to?(:deep_merge!)
8
- self[key].deep_merge! value
9
- else
10
- self[key] = value
3
+ # TODO: убрать, все равно конфиг надо парсить нормально
4
+
5
+ module DeepMerge
6
+
7
+ refine Hash do
8
+
9
+ def deep_merge! other
10
+ other.each do |key, value|
11
+ if has_key?(key) && self[key].respond_to?(:deep_merge!)
12
+ self[key].deep_merge! value
13
+ else
14
+ self[key] = value
15
+ end
11
16
  end
17
+ self
12
18
  end
13
- self
14
- end
15
19
 
16
- end
20
+ end
17
21
 
18
- class Array
22
+ refine Array do
19
23
 
20
- def deep_merge! other
21
- other.each do |value|
22
- next if self.include?(value)
23
- next if String === value && self.include?(value.intern)
24
- next if Symbol === value && self.include?(value.to_s)
25
- self << value
24
+ def deep_merge! other
25
+ other.each do |value|
26
+ next if self.include?(value)
27
+ next if String === value && self.include?(value.intern)
28
+ next if Symbol === value && self.include?(value.to_s)
29
+ self << value
30
+ end
31
+ self
26
32
  end
27
- self
33
+
28
34
  end
29
35
 
30
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inat-get
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0.12
4
+ version: 0.8.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Shikhalev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-26 00:00:00.000000000 Z
11
+ date: 2024-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -46,6 +46,7 @@ executables:
46
46
  extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
+ - ".yardopts"
49
50
  - LICENSE
50
51
  - README.md
51
52
  - Rakefile
@@ -69,7 +70,6 @@ files:
69
70
  - lib/inat/app/task/context.rb
70
71
  - lib/inat/app/task/dsl.rb
71
72
  - lib/inat/data/api.rb
72
- - lib/inat/data/cache.rb
73
73
  - lib/inat/data/db.rb
74
74
  - lib/inat/data/ddl.rb
75
75
  - lib/inat/data/entity.rb
@@ -112,7 +112,7 @@ files:
112
112
  - lib/inat/utils/deep.rb
113
113
  homepage: https://github.com/shikhalev/inat-get
114
114
  licenses:
115
- - GPL-3.0
115
+ - GPL-3.0-or-later
116
116
  metadata:
117
117
  homepage_uri: https://github.com/shikhalev/inat-get
118
118
  source_code_uri: https://github.com/shikhalev/inat-get
@@ -131,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  requirements: []
134
- rubygems_version: 3.4.19
134
+ rubygems_version: 3.5.3
135
135
  signing_key:
136
136
  specification_version: 4
137
137
  summary: Client for iNaturalist API.
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # class Cache
4
-
5
- # class << self
6
-
7
- # end
8
-
9
- # end