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
@@ -1,49 +1,67 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
3
  require_relative 'errors'
4
+ require_relative 'file_writer'
5
+ require_relative 'hash_like'
5
6
  require_relative 'link'
6
7
  require_relative 'spec_version'
7
8
 
8
9
  module STAC
9
- # Base class for \STAC objects (i.e. Catalog, Collection and Item).
10
+ # Raised when a STAC object does not have rel="self" link HREF.
11
+ class NoSelfHrefError < Error
12
+ attr_reader :stac_object
13
+
14
+ def initialize(msg = nil, stac_object:)
15
+ super(msg)
16
+ @stac_object = stac_object
17
+ end
18
+ end
19
+
20
+ # Base class for \STAC objects (i.e. Catalog, Collection, and Item).
10
21
  class STACObject
22
+ include HashLike
23
+
24
+ @@extendables = {} # rubocop:disable Style/ClassVars
25
+
26
+ # Returns available extension modules.
27
+ def self.extendables
28
+ @@extendables.values.uniq
29
+ end
30
+
31
+ # Adds the given extension module to .extendables.
32
+ def self.add_extendable(extendable)
33
+ @@extendables[extendable.identifier] = extendable
34
+ self
35
+ end
36
+
11
37
  class << self
12
- attr_accessor :type # :nodoc:
38
+ attr_reader :type # :nodoc:
13
39
 
14
40
  # Base method to deserialize shared fields from a Hash.
15
41
  #
16
42
  # Raises ArgumentError when any required fields are missing.
17
43
  def from_hash(hash)
18
- raise TypeError, "type field is not '#{type}': #{hash['type']}" if hash.fetch('type') != type
44
+ h = hash.transform_keys(&:to_sym)
45
+ raise TypeError, "type field is not '#{type}': #{h[:type]}" if h.fetch(:type) != type
19
46
 
20
- transformed = hash.transform_keys(&:to_sym).except(:type, :stac_version)
21
- transformed[:links] = transformed.fetch(:links).map { |link| Link.from_hash(link) }
22
- new(**transformed)
23
- rescue KeyError => e
24
- raise ArgumentError, "required field not found: #{e.key}"
47
+ new(**h.except(:type, :stac_version))
25
48
  end
26
49
  end
27
50
 
28
- attr_accessor :stac_extensions, :extra
29
-
30
51
  # HTTP Client to fetch objects from HTTP HREF links.
31
52
  attr_accessor :http_client
32
53
 
33
- attr_reader :links
54
+ attr_reader :stac_extensions, :links
34
55
 
35
- def initialize(links:, stac_extensions: nil, **extra)
56
+ def initialize(links: [], stac_extensions: [], **extra)
36
57
  @links = []
37
58
  links.each do |link|
38
- add_link(link) # to set `owner`
59
+ add_link(**link.transform_keys(&:to_sym)) # to set `owner`
39
60
  end
40
61
  @stac_extensions = stac_extensions
41
62
  @extra = extra.transform_keys(&:to_s)
42
63
  @http_client = STAC.default_http_client
43
- end
44
-
45
- def type
46
- self.class.type
64
+ apply_extensions!
47
65
  end
48
66
 
49
67
  # Serializes self to a Hash.
@@ -51,34 +69,41 @@ module STAC
51
69
  {
52
70
  'type' => type,
53
71
  'stac_version' => SPEC_VERSION,
54
- 'stac_extensions' => stac_extensions,
72
+ 'stac_extensions' => stac_extensions.empty? ? nil : stac_extensions,
55
73
  'links' => links.map(&:to_h),
56
74
  }.merge(extra).compact
57
75
  end
58
76
 
59
- # Serializes self to a JSON string.
60
- def to_json(...)
61
- to_h.to_json(...)
77
+ def deep_dup
78
+ super.tap do |obj|
79
+ obj.http_client = http_client.dup
80
+ end
62
81
  end
63
82
 
64
- # Adds a link with setting Link#owner as self.
65
- def add_link(link)
66
- link.owner = self
67
- links << link
83
+ def type
84
+ self.class.type.to_s
68
85
  end
69
86
 
70
- # Reterns HREF of the rel="self" link.
71
- def self_href
72
- find_link(rel: 'self')&.href
87
+ # Returns extended extension modules.
88
+ def extended
89
+ @extended ||= []
73
90
  end
74
91
 
75
- # Adds a link with the give HREF as rel="self".
92
+ # Adds the given extension identifier to #stac_extensions.
76
93
  #
77
- # When any ref="self" links already exist, removes them.
78
- def self_href=(absolute_href)
79
- self_link = Link.new(rel: 'self', href: absolute_href, type: 'application/json')
80
- remove_link(rel: 'self')
81
- add_link(self_link)
94
+ # When the given argument is extendable, the item extends the module.
95
+ def add_extension(extension)
96
+ case extension
97
+ when Extension
98
+ stac_extensions << extension.identifier
99
+ apply_extension!(extension)
100
+ else
101
+ stac_extensions << extension
102
+ if (extension = @@extendables[extension]) && extension.scope.include?(self.class)
103
+ apply_extension!(extension)
104
+ end
105
+ end
106
+ self
82
107
  end
83
108
 
84
109
  # Returns a link matching the arguments.
@@ -92,9 +117,86 @@ module STAC
92
117
  end
93
118
  end
94
119
 
120
+ # Adds a link with setting Link#owner as self.
121
+ #
122
+ # Raises ArgumentError when both target and href are not given.
123
+ def add_link(target = nil, rel:, href: nil, type: nil, title: nil, **extra)
124
+ raise ArgumentError, 'target or href must be given' if target.nil? && href.nil?
125
+
126
+ link = Link.new(target, rel: rel, href: href, type: type, title: title, **extra)
127
+ link.owner = self
128
+ links << link
129
+ self
130
+ end
131
+
132
+ # Reterns HREF of the rel="self" link.
133
+ def self_href
134
+ find_link(rel: 'self')&.href
135
+ end
136
+
137
+ # Overwrites rel="self" link with the given HREF.
138
+ #
139
+ # When any ref="self" links already exist, removes them.
140
+ def self_href=(absolute_href)
141
+ remove_links(rel: 'self')
142
+ add_link(rel: 'self', href: absolute_href, type: 'application/json')
143
+ end
144
+
145
+ # Returns a rel="root" link as a catalog/collection object if it exists.
146
+ def root
147
+ find_link(rel: 'root')&.target
148
+ end
149
+
150
+ # Overwrites rel="root" link.
151
+ def root=(catalog)
152
+ remove_links(rel: 'root')
153
+ add_link(catalog, rel: 'root', type: 'application/json', title: catalog.title) if catalog
154
+ end
155
+
156
+ # Returns a rel="parent" link as a catalog/collection object if it exists.
157
+ def parent
158
+ find_link(rel: 'parent')&.target
159
+ end
160
+
161
+ # Overwrites rel="parent" link.
162
+ def parent=(catalog)
163
+ remove_links(rel: 'parent')
164
+ add_link(catalog, rel: 'parent', type: 'application/json', title: catalog.title) if catalog
165
+ end
166
+
167
+ # Writes self on `dest` with the given writer.
168
+ #
169
+ # The default writer is a FileWriter.
170
+ def save(dest = nil, writer: FileWriter.new)
171
+ writer.write(to_h, dest: dest || self_href!)
172
+ end
173
+
174
+ protected
175
+
176
+ def self_href!
177
+ self_href or raise NoSelfHrefError.new('no rel="self" link href', stac_object: self)
178
+ end
179
+
95
180
  private
96
181
 
97
- def remove_link(rel:)
182
+ def extensions
183
+ stac_extensions
184
+ .map { |extension_id| @@extendables[extension_id] }
185
+ .compact
186
+ .select { |extension| extension.scope.include?(self.class) }
187
+ end
188
+
189
+ def apply_extensions!
190
+ extensions.each do |extension|
191
+ apply_extension!(extension)
192
+ end
193
+ end
194
+
195
+ def apply_extension!(extension)
196
+ extended << extension
197
+ end
198
+
199
+ def remove_links(rel:)
98
200
  links.reject! { |link| link.rel == rel }
99
201
  end
100
202
  end
data/lib/stac/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module STAC
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/stac.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'stac/simple_http_client'
4
3
  require_relative 'stac/object_resolver'
4
+ require_relative 'stac/simple_http_client'
5
+ require_relative 'stac/stac_object'
6
+ require_relative 'stac/extensions/electro_optical'
7
+ require_relative 'stac/extensions/projection'
8
+ require_relative 'stac/extensions/scientific_citation'
9
+ require_relative 'stac/extensions/view_geometry'
5
10
  require_relative 'stac/version'
6
11
 
7
12
  # Gem namespace.
@@ -27,4 +32,10 @@ module STAC
27
32
  end
28
33
 
29
34
  self.default_http_client = SimpleHTTPClient.new
35
+
36
+ STACObject
37
+ .add_extendable(Extensions::ElectroOptical)
38
+ .add_extendable(Extensions::Projection)
39
+ .add_extendable(Extensions::ScientificCitation)
40
+ .add_extendable(Extensions::ViewGeometry)
30
41
  end
data/sig/stac/asset.rbs CHANGED
@@ -1,5 +1,6 @@
1
1
  module STAC
2
2
  class Asset
3
+ include HashLike
3
4
  include CommonMetadata
4
5
 
5
6
  def self.from_hash: (Hash[String, untyped] hash) -> Asset
@@ -9,12 +10,9 @@ module STAC
9
10
  attr_accessor description: String?
10
11
  attr_accessor type: String?
11
12
  attr_accessor roles: Array[String]?
12
- attr_accessor extra: Hash[String, untyped]
13
13
 
14
14
  def initialize: (
15
15
  href: String, ?title: String?, ?description: String?, ?type: String?, ?roles: Array[String]?, **untyped
16
16
  ) -> void
17
-
18
- def to_h: -> Hash[String, untyped]
19
17
  end
20
18
  end
data/sig/stac/catalog.rbs CHANGED
@@ -1,21 +1,44 @@
1
1
  module STAC
2
2
  class Catalog < STACObject
3
- def self.from_hash: (Hash[String, untyped] hash) -> Catalog
3
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Catalog
4
+ def self.root: (
5
+ id: String,
6
+ description: String,
7
+ href: String,
8
+ ?links: Array[Hash[String, String]],
9
+ ?title: String?,
10
+ ?stac_extensions: Array[String],
11
+ **untyped
12
+ ) -> Catalog
4
13
 
5
14
  attr_accessor id: String
6
15
  attr_accessor description: String
7
16
  attr_accessor title: String?
8
17
 
9
18
  def initialize: (
10
- id: String, description: String, links: Array[Link], ?title: String?, ?stac_extensions: Array[String]?, **untyped
19
+ id: String,
20
+ description: String,
21
+ ?links: Array[Hash[String, String]],
22
+ ?title: String?,
23
+ ?stac_extensions: Array[String],
24
+ **untyped
11
25
  ) -> void
12
26
 
13
- def to_h: -> Hash[String, untyped]
14
- def children: -> Enumerator::Lazy[Catalog | Collection, void]
27
+ def children: -> Enumerator::Lazy[Catalog, void]
28
+ def all_children: -> Enumerator::Lazy[Catalog, void]
15
29
  def collections: -> Enumerator::Lazy[Collection, void]
16
- def find_child: (String id, ?recursive: bool) -> (Catalog | Collection | nil)
30
+ def all_collections: -> Enumerator::Lazy[Collection, void]
31
+ def find_child: (String id, ?recursive: bool) -> Catalog?
17
32
  def items: -> Enumerator::Lazy[Item, void]
18
33
  def all_items: -> Enumerator::Lazy[Item, void]
19
34
  def find_item: (String id, ?recursive: bool) -> Item?
35
+ def add_child: (Catalog catalog, ?href: String, ?title: String?) -> self
36
+ def add_item: (Item item, ?href: String, ?title: String?) -> self
37
+ def export: (?String? dest_dir, ?writer: _Writer) -> void
38
+
39
+ private
40
+
41
+ def child_links: -> Array[Link]
42
+ def item_links: -> Array[Link]
20
43
  end
21
44
  end
@@ -1,29 +1,37 @@
1
1
  module STAC
2
2
  class Collection < Catalog
3
- def self.from_hash: (Hash[String, untyped] hash) -> Collection
3
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Collection
4
4
 
5
5
  attr_accessor license: String
6
6
  attr_accessor extent: Extent
7
7
  attr_accessor keywords: Array[String]?
8
8
  attr_accessor providers: Array[Provider]?
9
9
  attr_accessor summaries: Hash[String, untyped]?
10
- attr_accessor assets: Hash[String, Asset]?
10
+ attr_reader assets: Hash[String, Asset]?
11
11
 
12
12
  def initialize: (
13
13
  id: String,
14
14
  description: String,
15
- links: Array[Link],
16
15
  license: String,
17
16
  extent: Extent,
17
+ ?links: Array[Hash[String, String]],
18
18
  ?title: String?,
19
19
  ?keywords: Array[String]?,
20
20
  ?providers: Array[Provider]?,
21
21
  ?summaries: Hash[String, untyped]?,
22
22
  ?assets: Hash[String, Asset]?,
23
- ?stac_extensions: Array[String]?,
23
+ ?stac_extensions: Array[String],
24
24
  **untyped
25
25
  ) -> void
26
26
 
27
- def to_h: -> Hash[String, untyped]
27
+ def add_asset: (
28
+ key: String,
29
+ href: String,
30
+ ?title: String?,
31
+ ?description: String?,
32
+ ?type: String?,
33
+ ?roles: Array[String]?,
34
+ **untyped
35
+ ) -> self
28
36
  end
29
37
  end
@@ -1,6 +1,6 @@
1
1
  module STAC
2
2
  module CommonMetadata
3
- attr_accessor extra: Hash[String, untyped]
3
+ attr_reader extra: Hash[String, untyped]
4
4
 
5
5
  def title: -> String?
6
6
  def title=: (String) -> void
@@ -19,7 +19,7 @@ module STAC
19
19
  def license: -> String?
20
20
  def license=: (String) -> void
21
21
  def providers: -> Array[Provider]
22
- def providers=: (Array[Provider]) -> void
22
+ def providers=: (Array[Provider | Hash[String, untyped]]) -> void
23
23
  def platform: -> String?
24
24
  def platform=: (String) -> void
25
25
  def instruments: -> Array[String]?
data/sig/stac/errors.rbs CHANGED
@@ -5,9 +5,6 @@ module STAC
5
5
  class TypeError < Error
6
6
  end
7
7
 
8
- class UnknownURISchemeError < Error
9
- end
10
-
11
- class HTTPError < Error
8
+ class NotSupportedURISchemeError < Error
12
9
  end
13
10
  end
@@ -0,0 +1,12 @@
1
+ module STAC
2
+ class ExtensionWithoutIdentifierError < Error
3
+ end
4
+
5
+ module Extension
6
+ @identifier: String?
7
+ @scope: Array[Class]?
8
+
9
+ def identifier: -> String | (String) -> String
10
+ def scope: -> Array[Class] | (*Class) -> Array[Class]
11
+ end
12
+ end
@@ -0,0 +1,40 @@
1
+ module STAC
2
+ module Extensions
3
+ module ElectroOptical
4
+ extend Extension
5
+
6
+ module Properties
7
+ attr_reader extra: Hash[String, untyped]
8
+
9
+ def eo_bands: -> Array[Band]
10
+ def eo_bands=: (Array[Hash[String, untyped] | Band]) -> void
11
+ def eo_cloud_cover: -> Numeric?
12
+ def eo_cloud_cover=: (Numeric) -> void
13
+ end
14
+
15
+ module Asset
16
+ include Properties
17
+ end
18
+
19
+ class Band
20
+ attr_reader raw_hash: Hash[String, untyped]
21
+
22
+ def initialize: (Hash[String, untyped] raw_hash) -> void
23
+
24
+ def to_h: -> Hash[String, untyped]
25
+ def name: -> String?
26
+ def name=: (String) -> void
27
+ def common_name: -> String?
28
+ def common_name=: (String) -> void
29
+ def description: -> String?
30
+ def description=: (String) -> void
31
+ def center_wavelength: -> Numeric?
32
+ def center_wavelength=: (Numeric) -> void
33
+ def full_width_half_max: -> Numeric?
34
+ def full_width_half_max=: (Numeric) -> void
35
+ def solar_illumination: -> Numeric?
36
+ def solar_illumination=: (Numeric) -> void
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ module STAC
2
+ module Extensions
3
+ module Projection
4
+ extend Extension
5
+
6
+ module Properties
7
+ attr_reader extra: Hash[String, untyped]
8
+
9
+ def proj_epsg: -> Numeric?
10
+ def proj_epsg=: (Numeric) -> void
11
+ def proj_wkt2: -> String?
12
+ def proj_wkt2=: (String) -> void
13
+ def proj_projjson: -> Hash[String, untyped]?
14
+ def proj_projjson=: (Hash[String, untyped]) -> void
15
+ def proj_geometry: -> Hash[String, untyped]?
16
+ def proj_geometry=: (Hash[String, untyped]) -> void
17
+ def proj_bbox: -> Array[Numeric]?
18
+ def proj_bbox=: (Array[Numeric]) -> void
19
+ def proj_centroid: -> {'lat' => Numeric, 'lon' => Numeric}?
20
+ def proj_centroid=: ({'lat' => Numeric, 'lon' => Numeric}) -> void
21
+ def proj_shape: -> Array[Integer]?
22
+ def proj_shape=: (Array[Integer]) -> void
23
+ def proj_transform: -> Array[Numeric]?
24
+ def proj_transform=: (Array[Numeric]) -> void
25
+ end
26
+
27
+ module Asset
28
+ include Properties
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ module STAC
2
+ module Extensions
3
+ module ScientificCitation
4
+ extend Extension
5
+
6
+ module Properties
7
+ attr_reader extra: Hash[String, untyped]
8
+
9
+ def sci_doi: -> String?
10
+ def sci_doi=: (String) -> void
11
+ def sci_citation: -> String?
12
+ def sci_citation=: (String) -> void
13
+ def sci_publications: -> Array[Publication]
14
+ def sci_publications=: (Array[Hash[String, String] | Publication]) -> void
15
+ end
16
+
17
+ module Asset
18
+ include Properties
19
+ end
20
+
21
+ module Collection
22
+ include Properties
23
+ end
24
+
25
+ class Publication
26
+ attr_reader raw_hash: Hash[String, String]
27
+
28
+ def initialize: (Hash[String, String] raw_hash) -> void
29
+
30
+ def to_h: -> Hash[String, String]
31
+ def doi: -> String?
32
+ def doi=: (String) -> void
33
+ def citation: -> String?
34
+ def citation=: (String) -> void
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,22 @@
1
+ module STAC
2
+ module Extensions
3
+ module ViewGeometry
4
+ extend Extension
5
+
6
+ module Properties
7
+ attr_reader extra: Hash[String, untyped]
8
+
9
+ def view_off_nadir: -> Numeric?
10
+ def view_off_nadir=: (Numeric) -> void
11
+ def view_incidence_angle: -> Numeric?
12
+ def view_incidence_angle=: (Numeric) -> void
13
+ def view_azimuth: -> Numeric?
14
+ def view_azimuth=: (Numeric) -> void
15
+ def view_sun_azimuth: -> Numeric?
16
+ def view_sun_azimuth=: (Numeric) -> void
17
+ def view_sun_elevation: -> Numeric?
18
+ def view_sun_elevation=: (Numeric) -> void
19
+ end
20
+ end
21
+ end
22
+ end
data/sig/stac/extent.rbs CHANGED
@@ -1,35 +1,32 @@
1
1
  module STAC
2
2
  class Extent
3
+ include HashLike
4
+
5
+ def self.from_hash: (Hash[String, untyped] hash) -> Extent
6
+
7
+ attr_accessor spatial: Spatial
8
+ attr_accessor temporal: Temporal
9
+
10
+ def initialize: (spatial: Spatial, temporal: Temporal, **untyped) -> void
11
+
3
12
  class Spatial
13
+ include HashLike
14
+
4
15
  def self.from_hash: (Hash[String, untyped] hash) -> Spatial
5
16
 
6
17
  attr_accessor bbox: Array[Array[Numeric]]
7
- attr_accessor extra: Hash[String, untyped]
8
18
 
9
19
  def initialize: (bbox: Array[Array[Numeric]], **untyped) -> void
10
-
11
- def to_h: -> Hash[String, untyped]
12
20
  end
13
21
 
14
22
  class Temporal
23
+ include HashLike
24
+
15
25
  def self.from_hash: (Hash[String, untyped] hash) -> Temporal
16
26
 
17
27
  attr_accessor interval: Array[Array[String?]]
18
- attr_accessor extra: Hash[String, untyped]
19
28
 
20
29
  def initialize: (interval: Array[Array[String?]], **untyped) -> void
21
-
22
- def to_h: -> Hash[String, untyped]
23
30
  end
24
-
25
- def self.from_hash: (Hash[String, untyped] hash) -> Extent
26
-
27
- attr_accessor spatial: Spatial
28
- attr_accessor temporal: Temporal
29
- attr_accessor extra: Hash[String, untyped]
30
-
31
- def initialize: (spatial: Spatial, temporal: Temporal, **untyped) -> void
32
-
33
- def to_h: -> Hash[String, untyped]
34
31
  end
35
32
  end
@@ -0,0 +1,13 @@
1
+ module STAC
2
+ class FileWriter
3
+ @hash_to_json: ^(Hash[String, untyped]) -> String
4
+
5
+ def initialize: (?hash_to_json: ^(Hash[String, untyped]) -> String) -> void
6
+
7
+ def write: (Hash[String, untyped], dest: String) -> void
8
+ end
9
+
10
+ interface _Writer
11
+ def write: (Hash[String, untyped], dest: String) -> void
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module STAC
2
+ module HashLike
3
+ attr_reader extra: Hash[String, untyped]
4
+
5
+ def []: (String | Symbol key) -> untyped
6
+ def []=: (String | Symbol key, untyped value) -> untyped
7
+ def update: (**untyped) -> self
8
+ def to_hash: -> Hash[String, untyped]
9
+ def to_h: -> Hash[String, untyped]
10
+ def to_json: -> String
11
+ def deep_dup: -> self
12
+ end
13
+ end
data/sig/stac/item.rbs CHANGED
@@ -1,28 +1,37 @@
1
1
  module STAC
2
2
  class Item < STACObject
3
- def self.from_hash: (Hash[String, untyped] hash) -> Item
3
+ def self.from_hash: (Hash[String | Symbol, untyped] hash) -> Item
4
4
 
5
5
  attr_accessor id: String
6
6
  attr_accessor geometry: Hash[String, untyped]?
7
- attr_accessor properties: Properties
8
- attr_accessor assets: Hash[String, Asset]
9
7
  attr_accessor bbox: Array[Numeric]?
10
8
  attr_accessor collection_id: String?
11
9
 
10
+ attr_reader properties: Properties
11
+ attr_reader assets: Hash[String, Asset]
12
+
12
13
  def initialize: (
13
14
  id: String,
14
15
  geometry: Hash[String, untyped]?,
15
16
  properties: Properties,
16
- links: Array[Link],
17
- assets: Hash[String, Asset],
17
+ ?links: Array[Hash[String, String]],
18
+ ?assets: Hash[String, Asset],
18
19
  ?bbox: Array[Numeric]?,
19
20
  ?collection: String | Collection | nil,
20
- ?stac_extensions: Array[String]?,
21
+ ?stac_extensions: Array[String],
21
22
  **untyped
22
23
  ) -> void
23
24
 
24
- def datetime: -> Time?
25
25
  def collection: -> Collection?
26
26
  def collection=: (Collection collection) -> void
27
+ def add_asset: (
28
+ key: String,
29
+ href: String,
30
+ ?title: String?,
31
+ ?description: String?,
32
+ ?type: String?,
33
+ ?roles: Array[String]?,
34
+ **untyped
35
+ ) -> self
27
36
  end
28
37
  end