inat-get 0.8.0.11

Sign up to get free protection for your applications and to get access to all the features.
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: []