stac 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +10 -0
  4. data/GETTING_STARTED.md +384 -0
  5. data/Gemfile.lock +48 -37
  6. data/README.md +12 -59
  7. data/Rakefile +62 -4
  8. data/Steepfile +2 -0
  9. data/lib/stac/asset.rb +3 -1
  10. data/lib/stac/catalog.rb +78 -8
  11. data/lib/stac/collection.rb +43 -9
  12. data/lib/stac/common_metadata.rb +1 -1
  13. data/lib/stac/errors.rb +2 -5
  14. data/lib/stac/extension.rb +34 -0
  15. data/lib/stac/extensions/electro_optical.rb +67 -0
  16. data/lib/stac/extensions/projection.rb +42 -0
  17. data/lib/stac/extensions/scientific_citation.rb +84 -0
  18. data/lib/stac/extensions/view_geometry.rb +38 -0
  19. data/lib/stac/extent.rb +39 -31
  20. data/lib/stac/file_writer.rb +31 -0
  21. data/lib/stac/hash_like.rb +74 -0
  22. data/lib/stac/item.rb +56 -22
  23. data/lib/stac/link.rb +51 -9
  24. data/lib/stac/object_resolver.rb +4 -4
  25. data/lib/stac/properties.rb +3 -1
  26. data/lib/stac/provider.rb +5 -1
  27. data/lib/stac/simple_http_client.rb +3 -0
  28. data/lib/stac/stac_object.rb +138 -36
  29. data/lib/stac/version.rb +1 -1
  30. data/lib/stac.rb +12 -1
  31. data/sig/stac/asset.rbs +1 -3
  32. data/sig/stac/catalog.rbs +28 -5
  33. data/sig/stac/collection.rbs +13 -5
  34. data/sig/stac/common_metadata.rbs +2 -2
  35. data/sig/stac/errors.rbs +1 -4
  36. data/sig/stac/extension.rbs +12 -0
  37. data/sig/stac/extensions/electro_optical.rbs +40 -0
  38. data/sig/stac/extensions/projection.rbs +32 -0
  39. data/sig/stac/extensions/scientific_citation.rbs +38 -0
  40. data/sig/stac/extensions/view_geometry.rbs +22 -0
  41. data/sig/stac/extent.rbs +13 -16
  42. data/sig/stac/file_writer.rbs +13 -0
  43. data/sig/stac/hash_like.rbs +13 -0
  44. data/sig/stac/item.rbs +16 -7
  45. data/sig/stac/link.rbs +20 -12
  46. data/sig/stac/object_resolver.rbs +2 -2
  47. data/sig/stac/properties.rbs +1 -3
  48. data/sig/stac/provider.rbs +2 -3
  49. data/sig/stac/simple_http_client.rbs +3 -0
  50. data/sig/stac/stac_object.rbs +33 -10
  51. data/stac.gemspec +1 -1
  52. metadata +18 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2627d9a703e290a75afaa175182cffdb596a75e64219d5078b609747606edc7
4
- data.tar.gz: b9fbc61200079233af6e820faaee550bb9eb3bf98cb5a4e30536342e6ac932fd
3
+ metadata.gz: 63e6934e16a8ff0f70fb3e7c9770d84b2a69b423b2ec00e21a217562a1a22438
4
+ data.tar.gz: 92dba6bb4fe3ce5a8952cd7b9a5ef3de35d7accf9d35ca7a10469b62596e6b5d
5
5
  SHA512:
6
- metadata.gz: f2ea9eff6cfa3171f1a96ec8973184fd361226d7e6afaefd28d9e96286a4991f7c3e3968f5baa69b49330e98229bd927b53d70e1a2613f52dddbc7d9d12358a5
7
- data.tar.gz: 3c556bac6620eef51f7756087a507236dd35cf97906751044d630df9d18c94faf20333d15c24f3d93e81c7fd417b9d0d0bf5ab8ab61464deb1fd786030481eec
6
+ metadata.gz: cd77e8737745c7cbe084fb43f654db060605891385d3494a263523e16d997a9a96913d4bd72fcee488036102c6dc98595fbb9973a04138f066531ca351095705
7
+ data.tar.gz: efe10bba8bc91a59b74ee5b04b2d5f0d1cee86d7b47c49c920ffb456b48b32770fa436d2cf756b076986245fc720143e9c6304016008d9bfdcdbf0f62602cb64
data/.rubocop.yml CHANGED
@@ -9,6 +9,9 @@ AllCops:
9
9
  Style/GuardClause:
10
10
  Enabled: false
11
11
 
12
+ Style/NumericLiterals:
13
+ Enabled: false
14
+
12
15
  Style/TrailingCommaInArguments:
13
16
  EnforcedStyleForMultiline: consistent_comma
14
17
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0] - 2022-12-16
4
+
5
+ - Add extension modules from the current stable extensions (`ElectroOptical`, `Projection`, `ScientificCitation` and `ViewGeometry`).
6
+ - Make `STACObject` extend extension modules from `stac_extensions` value automatically.
7
+ - Introduce `HashLike` module and make STAC Object classes include it.
8
+ - Fix a bug that `Catalog#all_items` returns only direct children's items.
9
+ - Improve documentation.
10
+ - Add methods `#add_child` and `#add_item` to `STAC::Catalog`
11
+ - Add `STAC::Catalog#export`
12
+
3
13
  ## [0.2.0] - 2022-11-02
4
14
 
5
15
  - Add `STAC::CommonMetadata` and make `Asset` and `Properties` include it.
@@ -0,0 +1,384 @@
1
+ # Getting Started
2
+
3
+ - [Reading STAC Objects](#reading-stac-objects)
4
+ - [STAC Object Classes](#stac-object-classes)
5
+ - [STAC::Catalog](#staccatalog)
6
+ - [Crawling Catalog Links](#crawling-catalog-links)
7
+ - [Exporting Catalog](#exporting-catalog)
8
+ - [STAC::Collection](#staccollection)
9
+ - [STAC::Item](#stacitem)
10
+ - [Common Metadata](#common-metadata)
11
+ - [Extensions](#extensions)
12
+ - [Adding Extensions](#adding-extensions)
13
+ - [Using Custom HTTP Client](#using-custom-http-client)
14
+
15
+ ## Reading STAC Objects
16
+
17
+ You can read any STAC objects from URL by `STAC.from_url`:
18
+
19
+ ```ruby
20
+ catalog = STAC.from_url('https://raw.githubusercontent.com/radiantearth/stac-spec/master/examples/catalog.json')
21
+ catalog.class #=> STAC::Catalog
22
+ catalog.type #=> "Catalog"
23
+
24
+ collection = STAC.from_url('https://raw.githubusercontent.com/radiantearth/stac-spec/master/examples/collection.json')
25
+ collection.class #=> STAC::Collection
26
+ collection.type #=> "Collection"
27
+
28
+ item = STAC.from_item('https://raw.githubusercontent.com/radiantearth/stac-spec/master/examples/core-item.json')
29
+ item.class #=> STAC::Item
30
+ item.type #=> "Feature"
31
+ ```
32
+
33
+ Also, from a local file by `STAC.from_file`:
34
+
35
+ ```ruby
36
+ catalog = STAC.from_file('/path/to/local/catalog.json')
37
+ collection = STAC.from_file('/path/to/local/collection.json')
38
+ item = STAC.from_file('/path/to/local/item.json')
39
+ ```
40
+
41
+ ## STAC Object Classes
42
+
43
+ There are 3 core STAC object classes: `STAC::Catalog`, `STAC::Collection`, and `STAC::Item`.
44
+
45
+ They have a class method `from_hash(hash)`, which returns its instance converted from the given Hash.
46
+
47
+ ```ruby
48
+ catalog = STAC::Catalog.from_hash(
49
+ {
50
+ 'stac_version' => '1.0.0',
51
+ 'type' => 'Catalog',
52
+ 'id' => '20201211_223832_CS2',
53
+ 'description' => 'A simple catalog example',
54
+ 'links' => [],
55
+ }
56
+ )
57
+ ```
58
+
59
+ And they have the following instance methods in common:
60
+
61
+ - `extra: -> Hash[String, untyped]` returns extra fields that do not belong to the core specification like STAC extensions fields
62
+ - `to_h: -> Hash[String, untyped]`
63
+ - `to_json: -> String`
64
+ - `deep_dup: -> self` returns a deep copy of self.
65
+ - `stac_extensions: -> Array[String]`
66
+ - `add_extension: (String extension_id) -> self | (Module extension) -> self` (see [Extensions](#extensions))
67
+ - `links: -> Array[STAC::Link]`
68
+ - `find_link: (rel: String, ?type: String?) -> STAC::Link?`
69
+ - `add_link: (rel: String, href: String, ?type: String?, ?title: String?) -> self`
70
+
71
+ Followings are shorthand methods for core links:
72
+
73
+ - `self_href: -> String?` returns rel="self" link's href value
74
+ - `self_href=: (String absolute_href) -> void` adds rel="self" link with the given href
75
+ - `root: -> Catalog?` returns rel="root" link as a catalog object
76
+ - `root=: (Catalog? catalog) -> void` overwrites rel="root" link
77
+ - `parent: -> Catalog?` returns rel="parent" link as a catalog object
78
+ - `parent=: (Catalog? catalog) -> void` overwrites rel="parent" link
79
+
80
+ ### STAC::Catalog
81
+
82
+ `STAC::Catalog` has the following attributes:
83
+
84
+ - `attr_accessor id: String`
85
+ - `attr_accessor description: String`
86
+ - `attr_accessor title: String?`
87
+
88
+ ```ruby
89
+ catalog.id = 'awesome_catalog'
90
+ catalog.id #=> "awesome_catalog"
91
+ ```
92
+
93
+ See [STAC Catalog Specification](https://github.com/radiantearth/stac-spec/blob/master/catalog-spec/catalog-spec.md) for the details.
94
+
95
+ #### Crawling Catalog Links
96
+
97
+ `STAC::Catalog` also has methods to crawl its `links`:
98
+
99
+ - `children: -> Enumerator::Lazy[STAC::Catalog, void]` returns catalog/collection objects from rel="child" links
100
+ - `collections: -> Enumerator::Lazy[STAC::Collection, void]` filters only collections from #children
101
+ - `all_collections: -> Enumerator::Lazy[STAC::Collection, void]` returns all collections from the catalog and its children recursively
102
+ - `items: -> Enumerator::Lazy[STAC::Item, void]` returns item objects from rel="items" links
103
+ - `all_items: -> Enumerator::Lazy[STAC::Item, void]` returns all items from the catalog and its children recursively
104
+ - `find_child: (String id, ?recursive: bool) -> STAC::Catalog?`
105
+ - `find_item: (String id, ?recursive: bool) -> STAC::Item?`
106
+
107
+ Note that the first 5 methods return [`Enumerator::Lazy`](https://rubyapi.org/3.1/o/enumerator/lazy).
108
+ This is to prevent making a large number of HTTP requests when calling the methods.
109
+
110
+ ```ruby
111
+ catalog.collections.each do |collection|
112
+ puts collection.id
113
+ end
114
+ collection = catalog.find_child('awesome_collection')
115
+
116
+ catalog.all_items.first(100).each do |item|
117
+ puts item.id
118
+ end
119
+ item = catalog.find_item('awesome_item', recursive: true)
120
+ ```
121
+
122
+ #### Exporting Catalog
123
+
124
+ Furthermore, `STAC::Catalog` has methods to create a new static STAC catalog:
125
+
126
+ - `add_child: (Catalog catalog, ?href: String, ?title: String?) -> self`
127
+ - `add_item: (Item item, ?href: String, ?title: String?) -> self`
128
+ - `export: (?String? dest_dir) -> void`
129
+
130
+ ```ruby
131
+ catalog = STAC::Catalog.new(id: 'root', description: 'The root catalog')
132
+ catalog.self_href = 'https://example.com/catalog.json'
133
+ catalog.root = catalog
134
+
135
+ item = STAC::Item.from_hash(
136
+ {
137
+ 'stac_version' => '1.0.0',
138
+ 'type' => 'Feature',
139
+ 'id' => 'item',
140
+ 'geometry' => nil,
141
+ 'properties' => {
142
+ 'datetime' => Time.now.iso8601
143
+ },
144
+ 'links' => [],
145
+ 'assets' => {}
146
+ }
147
+ )
148
+
149
+ # Add rel="item" link to catalog with href="#{item.id}.json" (based on best practice).
150
+ # And add rel="self", rel="root", and rel="parent" links to item.
151
+ catalog.add_item(item)
152
+
153
+ item.links.each { |l| puts "#{l.rel}: #{l.href}" }
154
+ # self: https://example.com/item.json
155
+ # root: https://example.com/catalog.json
156
+ # parent: https://example.com/catalog.json
157
+
158
+ sub_catalog = STAC::Catalog.new(id: 'sub-catalog', description: 'The sub catalog')
159
+
160
+ # Add rel="child" link to catalog with href="#{catalog.id}/catalog.json".
161
+ # Also add rel="self", rel="root", and rel="parent" links to sub-catalog.
162
+ catalog.add_child(sub_catalog)
163
+
164
+ sub_catalog.add_item(item.deep_dup.update(id: 'sub-item'))
165
+ sub_catalog.links.each { |l| puts "#{l.rel}: #{l.href}" }
166
+ # self: https://example.com/sub-catalog/catalog.json
167
+ # root: https://example.com/catalog.json
168
+ # parent: https://example.com/catalog.json
169
+ # item: https://example.com/sub-catalog/sub-item.json
170
+
171
+ catalog.links.each { |l| puts "#{l.rel}: #{l.href}" }
172
+ # self: https://example.com/catalog.json
173
+ # root: https://example.com/catalog.json
174
+ # item: https://example.com/item.json
175
+ # child: https://example.com/sub-catalog/catalog.json
176
+
177
+ # Exports the catalog and its children/item recursively to the given directory.
178
+ catalog.export('path/to/dest')
179
+
180
+ # $ tree path/to/dest
181
+ # path/to/dest
182
+ # ├── catalog.json
183
+ # ├── item.json
184
+ # └── sub-catalog
185
+ # ├── catalog.json
186
+ # └── sub-item.json
187
+ ```
188
+
189
+ ### STAC::Collection
190
+
191
+ `STAC::Collection` inherits `STAC::Catalog`.
192
+
193
+ The followings are `STAC::Collection` specific attributes:
194
+
195
+ - `attr_accessor license: String`
196
+ - `attr_accessor extent: STAC::Extent`
197
+ - `attr_accessor keywords: Array[String]?`
198
+ - `attr_accessor providers: Array[STAC::Provider]?`
199
+ - `attr_accessor summaries: Hash[String, untyped]?`
200
+ - `attr_reader assets: Hash[String, STAC::Asset]?`
201
+
202
+ To add an asset, use:
203
+
204
+ - `add_asset: (key: String, href: String, ?title: String?, ?description: String?, ?type: String?, ?roles: Array[String]?) -> self`
205
+
206
+ `STAC::Extent`, `STAC::Provider`, and `STAC::Asset` provide accessors for the corresponding object's fields.
207
+
208
+ ```ruby
209
+ collection.extent.spatial.bbox = [-180, -90, 180, 90]
210
+ collection.extent.spatial.bbox #=> [-180, -90, 180, 90]
211
+ collection.extent.temporal.interval = ['2022-12-01T00:00:00Z', null]
212
+ collection.extent.temporal.interval #=> ["2022-12-01T00:00:00Z", null]
213
+
214
+ collection.providers << STAC::Provider.new(name: 'sankichi92')
215
+ collection.providers.last.name #=> "sankichi92"
216
+ ```
217
+
218
+ See [STAC Collection Specification](https://github.com/radiantearth/stac-spec/blob/master/collection-spec/collection-spec.md) for the details.
219
+
220
+ ### STAC::Item
221
+
222
+ `STAC::Item` has the following attributes:
223
+
224
+ - `attr_accessor id: String`
225
+ - `attr_reader properties: STAC::Properties`
226
+ - `attr_reader assets: Hash[String, STAC::Asset]`
227
+ - `attr_accessor geometry: Hash[String, untyped]?`
228
+ - `attr_accessor bbox: Array[Numeric]?`
229
+ - `attr_accessor collection_id: String?`
230
+
231
+ And has the following methods:
232
+
233
+ - `add_asset: (key: String, href: String, ?title: String?, ?description: String?, ?type: String?, ?roles: Array[String]?) -> self`
234
+ - `collection: -> Collection?` returns a rel="collection" link as a collection object
235
+ - `collection=: (Collection collection) -> void` overwrites rel="collection" link and collection_id attribute
236
+
237
+ See [STAC Item Specification](https://github.com/radiantearth/stac-spec/blob/master/collection-spec/collection-spec.md) for the details.
238
+
239
+ #### Common Metadata
240
+
241
+ `STAC::Properties` and `STAC::Asset` includes `STAC::CommonMetadata`, which provides read/write methods for [STAC Common Metadata](https://github.com/radiantearth/stac-spec/blob/master/item-spec/common-metadata.md) fields:
242
+
243
+ - `title: -> String?`
244
+ - `title=: (String) -> void`
245
+ - `description: -> String?`
246
+ - `description=: (String) -> void`
247
+ - `created: -> Time?`
248
+ - `created=: (Time | String) -> void`
249
+ - `updated: -> Time?`
250
+ - `updated=: (Time | String) -> void`
251
+ - `start_datetime: -> Time?`
252
+ - `start_datetime=: (Time | String) -> void`
253
+ - `end_datetime: -> Time?`
254
+ - `end_datetime=: (Time | String) -> void`
255
+ - `datetime_range: -> Range[Time]?` returns a range from #start_datetime to #end_datetime
256
+ - `datetime_range=: (Range[Time]) -> void` sets #start_datetime and #end_datetime by the given range
257
+ - `license: -> String?`
258
+ - `license=: (String) -> void`
259
+ - `providers: -> Array[Provider]`
260
+ - `providers=: (Array[Provider | Hash[String, untyped]]) -> void`
261
+ - `platform: -> String?`
262
+ - `platform=: (String) -> void`
263
+ - `instruments: -> Array[String]?`
264
+ - `instruments=: (Array[String]) -> void`
265
+ - `constellation: -> String?`
266
+ - `constellation=: (String) -> void`
267
+ - `mission: -> String?`
268
+ - `mission=: (String) -> void`
269
+ - `gsd: -> Numeric`
270
+ - `gsd=: (Numeric) -> void`
271
+
272
+ These methods are shorthand accessors of `#extra` hash:
273
+
274
+ ```ruby
275
+ item.properties.extra #=> {}
276
+ item.properties.title = 'Awesome Item' # same as `item.properties.extra['title'] = 'Awesome Item'`
277
+ item.properties.title #=> "Awesome Item"
278
+ item.properties.extra #=> {"title"=>"Awesome Item"}
279
+ ```
280
+
281
+ ## Extensions
282
+
283
+ When an extension is added to a STAC object, methods corresponding to the extension will be added **dynamically** by [`Object#extend`](https://rubyapi.org/3.1/o/object#method-i-extend).
284
+
285
+ These methods are also shorthand accessors of `extra` hash same as `STAC::CommonMetadata`.
286
+
287
+ ```ruby
288
+ item.stac_extensions #=> []
289
+ item.properties.extra #=> {}
290
+ item.properties.eo_cloud_cover #=> raises NoMethodError
291
+
292
+ item.add_extension('https://stac-extensions.github.io/eo/v1.0.0/schema.json')
293
+ # same as `item.add_extension(STAC::Extensions::ElectroOptical)`
294
+
295
+ item.stac_extensions #=> ["https://stac-extensions.github.io/eo/v1.0.0/schema.json"]
296
+ item.properties.eo_cloud_cover = 1.2
297
+ item.properties.eo_cloud_cover #=> 1.2
298
+ item.properties.extra #=> {"eo:cloud_cover"=>1.2}
299
+
300
+ # item.properties extends STAC::Extensions::ElectroOptical::Properties
301
+ item.properties.is_a?(STAC::Extensions::ElectroOptical::Properties) #=> true
302
+ ```
303
+
304
+ Currently, only 4 stable extensions have been implemented:
305
+
306
+ ```ruby
307
+ puts STAC::STACObject.extendables
308
+ # STAC::Extensions::ElectroOptical
309
+ # STAC::Extensions::Projection
310
+ # STAC::Extensions::ScientificCitation
311
+ # STAC::Extensions::ViewGeometry
312
+ ```
313
+
314
+ ### Adding Extensions
315
+
316
+ You can add custom extensions.
317
+
318
+ Extension modules must extend `STAC::Extension` and set `identifier` and `scope`.
319
+ And you must register it by `STAC::STACObject.add_extendable(extension_module)`.
320
+
321
+ ```ruby
322
+ module MyExtension
323
+ extend STAC::Extension
324
+
325
+ identifier 'https://sankichi92.github.io/my_extension/v1.0.0/schema.json'
326
+ scope STAC::Item, STAC::Collection
327
+ end
328
+
329
+ STAC::STACObject.add_extendable(MyExtension)
330
+ ```
331
+
332
+ Then you can add methods to `STAC::Properties`, `STAC::Asset`, and `STAC::Collection` by defining modules with corresponding names **under the extension namespace**:
333
+
334
+ ```ruby
335
+ module MyExtension
336
+ module Properties
337
+ def my_field
338
+ extra['my:field']
339
+ end
340
+
341
+ def my_field(val)
342
+ extra['my:field'] = val
343
+ end
344
+ end
345
+
346
+ module Asset
347
+ include Properties
348
+ end
349
+ end
350
+ ```
351
+
352
+ See [`lib/stac/extensions`](https://github.com/sankichi92/stac-ruby/tree/main/lib/stac/extensions) for examples.
353
+
354
+ ## Using Custom HTTP Client
355
+
356
+ Custom HTTP client class must implement `get: (URI | String url) -> Hash[String, untyped]`, which returns response JSON as a Hash:
357
+
358
+ ```ruby
359
+ class MyHTTPClient
360
+ def get(url)
361
+ # ...
362
+ end
363
+ end
364
+ ```
365
+
366
+ You can pass the custom HTTP client to `STAC.from_url` for a specific STAC object instance:
367
+
368
+ ```ruby
369
+ catalog = STAC.from_url('https://example.com/catalog.json', http_client: MyHTTPClient.new)
370
+ ```
371
+
372
+ Or you can set it as the global default by `STAC.default_http_client=`:
373
+
374
+ ```ruby
375
+ STAC.default_http_client = MyHTTPClient.new
376
+ ```
377
+
378
+ If you want to only add custom HTTP headers, you can use `STAC::SimpleHTTPClient`:
379
+
380
+ ```ruby
381
+ http_client = STAC::SimpleHTTPClient.new({ 'X-Foo' => 'Bar' })
382
+ catalog = STAC.from_url('https://example.com/catalog.json', http_client:)
383
+ STAC.default_http_client = http_client
384
+ ```
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stac (0.2.0)
4
+ stac (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,84 +17,95 @@ GEM
17
17
  concurrent-ruby (1.1.10)
18
18
  crack (0.4.5)
19
19
  rexml
20
- debug (1.6.2)
21
- irb (>= 1.3.6)
20
+ csv (3.2.6)
21
+ debug (1.7.0)
22
+ irb (>= 1.5.0)
22
23
  reline (>= 0.3.1)
23
24
  diff-lcs (1.5.0)
24
25
  ffi (1.15.5)
26
+ fileutils (1.7.0)
25
27
  hashdiff (1.0.1)
26
28
  i18n (1.12.0)
27
29
  concurrent-ruby (~> 1.0)
28
- io-console (0.5.11)
29
- irb (1.4.2)
30
+ io-console (0.6.0)
31
+ irb (1.6.1)
30
32
  reline (>= 0.3.0)
31
- json (2.6.2)
32
- language_server-protocol (3.17.0.1)
33
+ json (2.6.3)
34
+ language_server-protocol (3.17.0.2)
33
35
  listen (3.7.1)
34
36
  rb-fsevent (~> 0.10, >= 0.10.3)
35
37
  rb-inotify (~> 0.9, >= 0.9.10)
38
+ logger (1.5.3)
36
39
  minitest (5.16.3)
37
40
  parallel (1.22.1)
38
- parser (3.1.2.1)
41
+ parser (3.1.3.0)
39
42
  ast (~> 2.4.1)
40
- prettier_print (0.1.0)
41
- public_suffix (5.0.0)
43
+ prettier_print (1.1.0)
44
+ public_suffix (5.0.1)
42
45
  rainbow (3.1.1)
43
46
  rake (13.0.6)
44
47
  rb-fsevent (0.11.2)
45
48
  rb-inotify (0.10.1)
46
49
  ffi (~> 1.0)
47
- rbs (2.6.0)
48
- regexp_parser (2.6.0)
49
- reline (0.3.1)
50
+ rbs (2.8.1)
51
+ regexp_parser (2.6.1)
52
+ reline (0.3.2)
50
53
  io-console (~> 0.5)
51
54
  rexml (3.2.5)
52
- rspec (3.11.0)
53
- rspec-core (~> 3.11.0)
54
- rspec-expectations (~> 3.11.0)
55
- rspec-mocks (~> 3.11.0)
56
- rspec-core (3.11.0)
57
- rspec-support (~> 3.11.0)
58
- rspec-expectations (3.11.1)
55
+ rspec (3.12.0)
56
+ rspec-core (~> 3.12.0)
57
+ rspec-expectations (~> 3.12.0)
58
+ rspec-mocks (~> 3.12.0)
59
+ rspec-core (3.12.0)
60
+ rspec-support (~> 3.12.0)
61
+ rspec-expectations (3.12.1)
59
62
  diff-lcs (>= 1.2.0, < 2.0)
60
- rspec-support (~> 3.11.0)
61
- rspec-mocks (3.11.1)
63
+ rspec-support (~> 3.12.0)
64
+ rspec-mocks (3.12.1)
62
65
  diff-lcs (>= 1.2.0, < 2.0)
63
- rspec-support (~> 3.11.0)
64
- rspec-support (3.11.1)
65
- rubocop (1.36.0)
66
+ rspec-support (~> 3.12.0)
67
+ rspec-support (3.12.0)
68
+ rubocop (1.40.0)
66
69
  json (~> 2.3)
67
70
  parallel (~> 1.10)
68
71
  parser (>= 3.1.2.1)
69
72
  rainbow (>= 2.2.2, < 4.0)
70
73
  regexp_parser (>= 1.8, < 3.0)
71
74
  rexml (>= 3.2.5, < 4.0)
72
- rubocop-ast (>= 1.20.1, < 2.0)
75
+ rubocop-ast (>= 1.23.0, < 2.0)
73
76
  ruby-progressbar (~> 1.7)
74
77
  unicode-display_width (>= 1.4.0, < 3.0)
75
- rubocop-ast (1.21.0)
78
+ rubocop-ast (1.24.0)
76
79
  parser (>= 3.1.1.0)
77
80
  rubocop-rake (0.6.0)
78
81
  rubocop (~> 1.0)
79
- rubocop-rspec (2.13.2)
82
+ rubocop-rspec (2.16.0)
80
83
  rubocop (~> 1.33)
81
- ruby-lsp (0.3.3)
84
+ ruby-lsp (0.3.7)
82
85
  language_server-protocol (~> 3.17.0)
83
86
  sorbet-runtime
84
- syntax_tree (>= 3.4)
87
+ syntax_tree (>= 4.0.2, < 5.0.0)
85
88
  ruby-progressbar (1.11.0)
86
- sorbet-runtime (0.5.10479)
87
- steep (1.1.1)
89
+ securerandom (0.2.2)
90
+ sorbet-runtime (0.5.10594)
91
+ steep (1.3.0)
88
92
  activesupport (>= 5.1)
93
+ csv (>= 3.0.9)
94
+ fileutils (>= 1.1.0)
95
+ json (>= 2.1.0)
89
96
  language_server-protocol (>= 3.15, < 4.0)
90
97
  listen (~> 3.0)
98
+ logger (>= 1.3.0)
91
99
  parallel (>= 1.0.0)
92
100
  parser (>= 3.1)
93
101
  rainbow (>= 2.2.2, < 4.0)
94
- rbs (>= 2.3.2)
102
+ rbs (>= 2.8.0)
103
+ securerandom (>= 0.1)
104
+ strscan (>= 1.0.0)
95
105
  terminal-table (>= 2, < 4)
96
- syntax_tree (3.6.2)
97
- prettier_print
106
+ strscan (3.0.5)
107
+ syntax_tree (4.3.0)
108
+ prettier_print (>= 1.0.2)
98
109
  terminal-table (3.0.2)
99
110
  unicode-display_width (>= 1.1.1, < 3)
100
111
  tzinfo (2.0.5)
@@ -106,7 +117,7 @@ GEM
106
117
  hashdiff (>= 0.4.0, < 2.0.0)
107
118
 
108
119
  PLATFORMS
109
- x86_64-darwin-21
120
+ x86_64-darwin-22
110
121
  x86_64-linux
111
122
 
112
123
  DEPENDENCIES
@@ -123,4 +134,4 @@ DEPENDENCIES
123
134
  webmock
124
135
 
125
136
  BUNDLED WITH
126
- 2.3.24
137
+ 2.3.26
data/README.md CHANGED
@@ -5,6 +5,17 @@ See [satc-client-ruby](https://github.com/sankichi92/stac-client-ruby) for [STAC
5
5
 
6
6
  This gem's implementation refers to [PySTAC](https://github.com/stac-utils/pystac).
7
7
 
8
+ ### STAC Spec Version Support
9
+
10
+ v1.0.0
11
+
12
+ ### STAC Extensions Support
13
+
14
+ - [Electro-Optical](https://github.com/stac-extensions/eo) v1.0.0
15
+ - [Projection](https://github.com/stac-extensions/projection) v1.0.0
16
+ - [Scientific Citation](https://github.com/stac-extensions/scientific) v1.0.0
17
+ - [View Geometry](https://github.com/stac-extensions/view) v1.0.0
18
+
8
19
  ## Installation
9
20
 
10
21
  Install the gem and add to the application's Gemfile by executing:
@@ -17,65 +28,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
17
28
 
18
29
  ## Getting Started
19
30
 
20
- ```ruby
21
- require 'stac'
22
-
23
- # Reading a Catalog
24
- # ================
25
-
26
- # Read the example catalog.
27
- catalog = STAC.from_url('https://raw.githubusercontent.com/radiantearth/stac-spec/master/examples/catalog.json')
28
-
29
- # Print some basic metadata.
30
- puts "ID: #{catalog.id}"
31
- puts "Title: #{catalog.title}"
32
- puts "Description: #{catalog.description}"
33
-
34
- # Crawling Child Catalogs/Collections
35
- # ================
36
-
37
- # List Collections in the Catalog.
38
- puts 'Collections IDs:'
39
- catalog.collections.each do |collection|
40
- puts "- #{collection.id}"
41
- end
42
-
43
- # Get a child Catalog or Collection by ID.
44
- _collection = catalog.find_child('extensions-collection')
45
-
46
- # Crawling Items
47
- # ================
48
-
49
- # List all items associated with the Catalog recursively.
50
- puts 'Item IDs:'
51
- catalog.all_items.each do |item|
52
- puts "- #{item.id}"
53
- end
54
-
55
- # Item Metadata
56
- # ================
57
-
58
- # Get an Item by ID.
59
- item = catalog.find_item('CS3-20160503_132131_08')
60
-
61
- # Print core Item metadeata.
62
- puts 'geometry:'
63
- p item.geometry
64
- puts 'bbox:'
65
- p item.bbox
66
- puts 'datetime:'
67
- p item.datetime
68
- puts 'collection_id:'
69
- p item.collection_id
70
-
71
- # Get actual Collection instance instead of ID.
72
- _collection = item.collection
73
-
74
- # Print common metadata.
75
- puts "instruments: #{item.properties.instruments}"
76
- puts "platform: #{item.properties.platform}"
77
- puts "gsd: #{item.properties.gsd}"
78
- ```
31
+ [GETTING_STARTED.md](GETTING_STARTED.md)
79
32
 
80
33
  ## Documentation
81
34