inat-get 0.8.0.11

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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +16 -0
  4. data/Rakefile +4 -0
  5. data/bin/inat-get +59 -0
  6. data/docs/logo.png +0 -0
  7. data/inat-get.gemspec +33 -0
  8. data/lib/extra/enum.rb +184 -0
  9. data/lib/extra/period.rb +252 -0
  10. data/lib/extra/uuid.rb +90 -0
  11. data/lib/inat/app/application.rb +50 -0
  12. data/lib/inat/app/config/messagelevel.rb +22 -0
  13. data/lib/inat/app/config/shiftage.rb +24 -0
  14. data/lib/inat/app/config/updatemode.rb +20 -0
  15. data/lib/inat/app/config.rb +296 -0
  16. data/lib/inat/app/globals.rb +80 -0
  17. data/lib/inat/app/info.rb +21 -0
  18. data/lib/inat/app/logging.rb +35 -0
  19. data/lib/inat/app/preamble.rb +27 -0
  20. data/lib/inat/app/status.rb +74 -0
  21. data/lib/inat/app/task/context.rb +47 -0
  22. data/lib/inat/app/task/dsl.rb +24 -0
  23. data/lib/inat/app/task.rb +75 -0
  24. data/lib/inat/data/api.rb +218 -0
  25. data/lib/inat/data/cache.rb +9 -0
  26. data/lib/inat/data/db.rb +87 -0
  27. data/lib/inat/data/ddl.rb +18 -0
  28. data/lib/inat/data/entity/comment.rb +29 -0
  29. data/lib/inat/data/entity/flag.rb +22 -0
  30. data/lib/inat/data/entity/identification.rb +45 -0
  31. data/lib/inat/data/entity/observation.rb +172 -0
  32. data/lib/inat/data/entity/observationphoto.rb +25 -0
  33. data/lib/inat/data/entity/observationsound.rb +26 -0
  34. data/lib/inat/data/entity/photo.rb +31 -0
  35. data/lib/inat/data/entity/place.rb +57 -0
  36. data/lib/inat/data/entity/project.rb +94 -0
  37. data/lib/inat/data/entity/projectadmin.rb +21 -0
  38. data/lib/inat/data/entity/projectobservationrule.rb +50 -0
  39. data/lib/inat/data/entity/request.rb +58 -0
  40. data/lib/inat/data/entity/sound.rb +27 -0
  41. data/lib/inat/data/entity/taxon.rb +94 -0
  42. data/lib/inat/data/entity/user.rb +67 -0
  43. data/lib/inat/data/entity/vote.rb +22 -0
  44. data/lib/inat/data/entity.rb +291 -0
  45. data/lib/inat/data/enums/conservationstatus.rb +30 -0
  46. data/lib/inat/data/enums/geoprivacy.rb +14 -0
  47. data/lib/inat/data/enums/iconictaxa.rb +23 -0
  48. data/lib/inat/data/enums/identificationcategory.rb +13 -0
  49. data/lib/inat/data/enums/licensecode.rb +16 -0
  50. data/lib/inat/data/enums/projectadminrole.rb +11 -0
  51. data/lib/inat/data/enums/projecttype.rb +37 -0
  52. data/lib/inat/data/enums/qualitygrade.rb +12 -0
  53. data/lib/inat/data/enums/rank.rb +60 -0
  54. data/lib/inat/data/model.rb +551 -0
  55. data/lib/inat/data/query.rb +1145 -0
  56. data/lib/inat/data/sets/dataset.rb +104 -0
  57. data/lib/inat/data/sets/list.rb +190 -0
  58. data/lib/inat/data/sets/listers.rb +15 -0
  59. data/lib/inat/data/sets/wrappers.rb +137 -0
  60. data/lib/inat/data/types/extras.rb +88 -0
  61. data/lib/inat/data/types/location.rb +89 -0
  62. data/lib/inat/data/types/std.rb +293 -0
  63. data/lib/inat/report/table.rb +135 -0
  64. data/lib/inat/utils/deep.rb +30 -0
  65. metadata +137 -0
@@ -0,0 +1,293 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'date'
5
+ require 'uri'
6
+
7
+ class Integer
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
29
+
30
+ def to_query
31
+ to_s
32
+ end
33
+
34
+ end
35
+
36
+ class String
37
+
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
43
+
44
+ def self.ddl
45
+ :TEXT
46
+ end
47
+
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
53
+
54
+ def to_db
55
+ self
56
+ end
57
+
58
+ def to_query
59
+ self
60
+ end
61
+
62
+ end
63
+
64
+ class Symbol
65
+
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
71
+ end
72
+
73
+ def self.ddl
74
+ :TEXT
75
+ end
76
+
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
83
+
84
+ def to_db
85
+ self.to_s
86
+ end
87
+
88
+ def to_query
89
+ to_s
90
+ end
91
+
92
+ end
93
+
94
+ class Float
95
+
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
102
+
103
+ def self.ddl
104
+ :REAL
105
+ end
106
+
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
112
+
113
+ def to_db
114
+ self
115
+ end
116
+
117
+ def to_query
118
+ to_s
119
+ end
120
+
121
+ end
122
+
123
+ class Time
124
+
125
+ class << self
126
+
127
+ alias :std_parse :parse
128
+
129
+ def parse src
130
+ return nil if src == nil
131
+ return src if Time === src
132
+ return std_parse(src) if String === src
133
+ raise TypeError, "Source must be a String!", caller
134
+ end
135
+
136
+ def ddl
137
+ :INTEGER
138
+ end
139
+
140
+ def from_db src
141
+ 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
145
+ end
146
+
147
+ end
148
+
149
+ def to_db
150
+ to_i
151
+ end
152
+
153
+ def to_query
154
+ xmlschema
155
+ end
156
+
157
+ end
158
+
159
+ class Date
160
+
161
+ class << self
162
+
163
+ alias :std_parse :parse
164
+
165
+ def parse src
166
+ return nil if src == nil
167
+ return src if Date === src
168
+ return std_parse(src) if String === src
169
+ raise TypeError, "Source must be a String!", caller
170
+ end
171
+
172
+ def ddl
173
+ :INTEGER
174
+ end
175
+
176
+ def from_db src
177
+ return nil if src == nil
178
+ return src if Date === src
179
+ return Time::at(src).to_date if Integer === src
180
+ raise TypeError, "Source must be an Integer!", caller
181
+ end
182
+
183
+ end
184
+
185
+ def to_db
186
+ to_time.to_i
187
+ end
188
+
189
+ def to_query
190
+ xmlschema
191
+ end
192
+
193
+ end
194
+
195
+ module Boolean
196
+
197
+ class << self
198
+
199
+ def parse src
200
+ return nil if src == nil
201
+ return src if Boolean === src
202
+ raise TypeError, "Source must be a Boolean!", caller
203
+ end
204
+
205
+ def ddl
206
+ :INTEGER
207
+ end
208
+
209
+ def from_db src
210
+ return nil if src == nil
211
+ return src if Boolean === src
212
+ return src != 0 if Integer === src
213
+ raise TypeError, "Source must be an Integer!", caller
214
+ end
215
+
216
+ end
217
+
218
+ def to_db
219
+ self && 1 || 0
220
+ end
221
+
222
+ def to_query
223
+ inspect
224
+ end
225
+
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
+
240
+ pre_verbose = $VERBOSE
241
+ $VERBOSE = nil
242
+
243
+ alias :std_parse :parse
244
+
245
+ def parse src
246
+ return nil if src == nil
247
+ return src if URI === src
248
+ url = URI::DEFAULT_PARSER.escape(src).gsub('+', '%2B')
249
+ return std_parse(url) if String === src
250
+ raise TypeError, "Source must be a String!", caller
251
+ end
252
+
253
+ $VERBOSE = pre_verbose
254
+
255
+ def ddl
256
+ :TEXT
257
+ end
258
+
259
+ def from_db src
260
+ parse src
261
+ # return nil if src == nil
262
+ # return src if URI === src
263
+ # return URI(URI::DEFAULT_PARSER.escape(src)) if String === src
264
+ # raise TypeError, "Source must be a String!", caller
265
+ end
266
+
267
+ end
268
+
269
+ def to_db
270
+ to_s
271
+ end
272
+
273
+ end
274
+
275
+ class NilClass
276
+
277
+ def self.parse src
278
+ nil
279
+ end
280
+
281
+ def to_db
282
+ nil
283
+ end
284
+
285
+ end
286
+
287
+ class Array
288
+
289
+ def to_query
290
+ map { |i| i.to_query }.join(',')
291
+ end
292
+
293
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Table
4
+
5
+ attr_reader :columns
6
+
7
+ def initialize
8
+ @columns = []
9
+ @rows = []
10
+ @line_no = 0
11
+ end
12
+
13
+ def column title, width: nil, align: nil, data: nil, marker: false, &block
14
+ if data == nil && !block_given?
15
+ raise ArgumentError, "Data argument or block must be provided!", caller
16
+ end
17
+ @columns << {
18
+ title: title,
19
+ width: width,
20
+ align: align,
21
+ data: data,
22
+ marker: marker,
23
+ block: block
24
+ }
25
+ end
26
+
27
+ private :column
28
+
29
+ def row **data
30
+ if !data.has_key?(:line_no)
31
+ @line_no += 1
32
+ data[:line_no] ||= @line_no
33
+ end
34
+ @rows << data
35
+ end
36
+
37
+ def rows *data
38
+ data.each do |r|
39
+ row(**r)
40
+ end
41
+ @rows
42
+ end
43
+
44
+ def << data
45
+ if Array === data
46
+ rows(*data)
47
+ elsif Hash === data
48
+ row(**data)
49
+ else
50
+ raise TypeError, "Invalid data type: #{ data.inspect }!", caller
51
+ end
52
+ end
53
+
54
+ private def th column
55
+ style = ""
56
+ case column[:width]
57
+ when Numeric
58
+ style += "width:#{ column[:width] }em;"
59
+ when String
60
+ style += "width:#{ column[:width] };"
61
+ end
62
+ style += "text-align:#{ column[:align] };" if column[:align]
63
+ if style.empty?
64
+ "<th>#{ column[:title] }</th>"
65
+ else
66
+ "<th style=\"#{ style }\">#{ column[:title] }</th>"
67
+ end
68
+ end
69
+
70
+ private def header
71
+ result = []
72
+ result << "<tr>"
73
+ result += @columns.map { |c| th(c) }
74
+ result << "</tr>"
75
+ result.join ""
76
+ end
77
+
78
+ private def td column, row
79
+ inner = case column[:data]
80
+ when String, Symbol
81
+ row[column[:data].intern]
82
+ when Proc
83
+ column[:data].call row
84
+ when nil
85
+ column[:block].call row
86
+ end
87
+ inner = inner.to_html if inner.respond_to?(:to_html)
88
+ style = ""
89
+ case column[:width]
90
+ when Numeric
91
+ style += "width:#{ column[:width] }em;"
92
+ when String
93
+ style += "width:#{ column[:width] };"
94
+ end
95
+ style += "text-align:#{ column[:align] };" if column[:align]
96
+ marker = nil
97
+ if column[:marker]
98
+ anchor = row[:anchor]
99
+ marker = "<a name=\"#{ anchor }\"></a>"
100
+ end
101
+ if style.empty?
102
+ "<td>#{ marker }#{ inner }</td>"
103
+ else
104
+ "<td style=\"#{ style }\">#{ marker }#{ inner }</td>"
105
+ end
106
+ end
107
+
108
+ private def row_to_html row
109
+ result = []
110
+ result << "<tr#{ row[:style] ? " style=\"#{ row[:style] }\"" : '' }>"
111
+ result += @columns.map { |c| td(c, row) }
112
+ result << "</td>"
113
+ result.join "\n"
114
+ end
115
+
116
+ def to_html
117
+ result = []
118
+ result << "<table>"
119
+ result << header
120
+ result += @rows.map { |r| row_to_html(r) }
121
+ result << "</table>"
122
+ result.join "\n"
123
+ end
124
+
125
+ end
126
+
127
+ module TableDSL
128
+
129
+ private def table &block
130
+ tbl = Table::new
131
+ tbl.instance_eval(&block) if block_given?
132
+ tbl
133
+ end
134
+
135
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
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
11
+ end
12
+ end
13
+ self
14
+ end
15
+
16
+ end
17
+
18
+ class Array
19
+
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
26
+ end
27
+ self
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inat-get
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0.11
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Shikhalev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sqlite3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: tzinfo
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.6
41
+ description:
42
+ email:
43
+ - shkikhalev@gmail.com
44
+ executables:
45
+ - inat-get
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - LICENSE
50
+ - README.md
51
+ - Rakefile
52
+ - bin/inat-get
53
+ - docs/logo.png
54
+ - inat-get.gemspec
55
+ - lib/extra/enum.rb
56
+ - lib/extra/period.rb
57
+ - lib/extra/uuid.rb
58
+ - lib/inat/app/application.rb
59
+ - lib/inat/app/config.rb
60
+ - lib/inat/app/config/messagelevel.rb
61
+ - lib/inat/app/config/shiftage.rb
62
+ - lib/inat/app/config/updatemode.rb
63
+ - lib/inat/app/globals.rb
64
+ - lib/inat/app/info.rb
65
+ - lib/inat/app/logging.rb
66
+ - lib/inat/app/preamble.rb
67
+ - lib/inat/app/status.rb
68
+ - lib/inat/app/task.rb
69
+ - lib/inat/app/task/context.rb
70
+ - lib/inat/app/task/dsl.rb
71
+ - lib/inat/data/api.rb
72
+ - lib/inat/data/cache.rb
73
+ - lib/inat/data/db.rb
74
+ - lib/inat/data/ddl.rb
75
+ - lib/inat/data/entity.rb
76
+ - lib/inat/data/entity/comment.rb
77
+ - lib/inat/data/entity/flag.rb
78
+ - lib/inat/data/entity/identification.rb
79
+ - lib/inat/data/entity/observation.rb
80
+ - lib/inat/data/entity/observationphoto.rb
81
+ - lib/inat/data/entity/observationsound.rb
82
+ - lib/inat/data/entity/photo.rb
83
+ - lib/inat/data/entity/place.rb
84
+ - lib/inat/data/entity/project.rb
85
+ - lib/inat/data/entity/projectadmin.rb
86
+ - lib/inat/data/entity/projectobservationrule.rb
87
+ - lib/inat/data/entity/request.rb
88
+ - lib/inat/data/entity/sound.rb
89
+ - lib/inat/data/entity/taxon.rb
90
+ - lib/inat/data/entity/user.rb
91
+ - lib/inat/data/entity/vote.rb
92
+ - lib/inat/data/enums/conservationstatus.rb
93
+ - lib/inat/data/enums/geoprivacy.rb
94
+ - lib/inat/data/enums/iconictaxa.rb
95
+ - lib/inat/data/enums/identificationcategory.rb
96
+ - lib/inat/data/enums/licensecode.rb
97
+ - lib/inat/data/enums/projectadminrole.rb
98
+ - lib/inat/data/enums/projecttype.rb
99
+ - lib/inat/data/enums/qualitygrade.rb
100
+ - lib/inat/data/enums/rank.rb
101
+ - lib/inat/data/model.rb
102
+ - lib/inat/data/query.rb
103
+ - lib/inat/data/sets/dataset.rb
104
+ - lib/inat/data/sets/list.rb
105
+ - lib/inat/data/sets/listers.rb
106
+ - lib/inat/data/sets/wrappers.rb
107
+ - lib/inat/data/types/extras.rb
108
+ - lib/inat/data/types/location.rb
109
+ - lib/inat/data/types/std.rb
110
+ - lib/inat/report/table.rb
111
+ - lib/inat/utils/deep.rb
112
+ homepage: https://github.com/shikhalev/inat-get
113
+ licenses:
114
+ - GPL-3.0
115
+ metadata:
116
+ homepage_uri: https://github.com/shikhalev/inat-get
117
+ source_code_uri: https://github.com/shikhalev/inat-get
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.1.0
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.4.19
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Client for iNaturalist API.
137
+ test_files: []