stac 0.1.0 → 0.3.0

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/CHANGELOG.md +18 -0
  4. data/GETTING_STARTED.md +384 -0
  5. data/Gemfile.lock +48 -37
  6. data/README.md +16 -57
  7. data/Rakefile +62 -4
  8. data/Steepfile +2 -0
  9. data/lib/stac/asset.rb +7 -1
  10. data/lib/stac/catalog.rb +81 -9
  11. data/lib/stac/collection.rb +43 -9
  12. data/lib/stac/common_metadata.rb +162 -0
  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 +58 -22
  23. data/lib/stac/link.rb +50 -14
  24. data/lib/stac/object_resolver.rb +14 -20
  25. data/lib/stac/properties.rb +6 -1
  26. data/lib/stac/provider.rb +5 -1
  27. data/lib/stac/{default_http_client.rb → simple_http_client.rb} +9 -4
  28. data/lib/stac/stac_object.rb +142 -31
  29. data/lib/stac/version.rb +1 -1
  30. data/lib/stac.rb +18 -2
  31. data/sig/stac/asset.rbs +3 -3
  32. data/sig/stac/catalog.rbs +29 -5
  33. data/sig/stac/collection.rbs +13 -5
  34. data/sig/stac/common_metadata.rbs +34 -0
  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 +17 -7
  45. data/sig/stac/link.rbs +21 -12
  46. data/sig/stac/object_resolver.rbs +5 -9
  47. data/sig/stac/properties.rbs +3 -3
  48. data/sig/stac/provider.rbs +2 -3
  49. data/sig/stac/{default_http_client.rbs → simple_http_client.rbs} +5 -2
  50. data/sig/stac/stac_object.rbs +34 -11
  51. data/sig/stac.rbs +7 -1
  52. data/stac.gemspec +1 -1
  53. metadata +26 -9
@@ -1,23 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
3
4
  require 'open-uri'
4
5
  require_relative 'errors'
5
6
  require_relative 'version'
6
7
 
7
8
  module STAC
9
+ # Raised when a HTTP request failed.
10
+ class HTTPError < Error; end
11
+
8
12
  # Simple HTTP Client using OpenURI.
9
- class DefaultHTTPClient
13
+ class SimpleHTTPClient
10
14
  attr_reader :options
11
15
 
12
16
  def initialize(options = { 'User-Agent' => "stac-ruby v#{VERSION}" })
13
17
  @options = options
14
18
  end
15
19
 
16
- # Makes a HTTP request and returns the response body as String.
20
+ # Makes a HTTP request and returns the responded JSON as Hash.
17
21
  #
18
22
  # Raises STAC::HTTPError when the response status is not 2XX.
19
- def get(uri)
20
- uri.read(options)
23
+ def get(url)
24
+ body = URI(url).read(options)
25
+ JSON.parse(body)
21
26
  rescue OpenURI::HTTPError => e
22
27
  raise HTTPError, e.message
23
28
  end
@@ -1,46 +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 'Catalog': #{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 :id, :stac_extensions, :extra
51
+ # HTTP Client to fetch objects from HTTP HREF links.
52
+ attr_accessor :http_client
29
53
 
30
- attr_reader :links
54
+ attr_reader :stac_extensions, :links
31
55
 
32
- def initialize(id:, links:, stac_extensions: nil, **extra)
33
- @id = id
56
+ def initialize(links: [], stac_extensions: [], **extra)
34
57
  @links = []
35
58
  links.each do |link|
36
- add_link(link) # to set `owner`
59
+ add_link(**link.transform_keys(&:to_sym)) # to set `owner`
37
60
  end
38
61
  @stac_extensions = stac_extensions
39
62
  @extra = extra.transform_keys(&:to_s)
40
- end
41
-
42
- def type
43
- self.class.type
63
+ @http_client = STAC.default_http_client
64
+ apply_extensions!
44
65
  end
45
66
 
46
67
  # Serializes self to a Hash.
@@ -48,21 +69,64 @@ module STAC
48
69
  {
49
70
  'type' => type,
50
71
  'stac_version' => SPEC_VERSION,
51
- 'stac_extensions' => stac_extensions,
52
- 'id' => id,
72
+ 'stac_extensions' => stac_extensions.empty? ? nil : stac_extensions,
53
73
  'links' => links.map(&:to_h),
54
74
  }.merge(extra).compact
55
75
  end
56
76
 
57
- # Serializes self to a JSON string.
58
- def to_json(...)
59
- to_h.to_json(...)
77
+ def deep_dup
78
+ super.tap do |obj|
79
+ obj.http_client = http_client.dup
80
+ end
81
+ end
82
+
83
+ def type
84
+ self.class.type.to_s
85
+ end
86
+
87
+ # Returns extended extension modules.
88
+ def extended
89
+ @extended ||= []
90
+ end
91
+
92
+ # Adds the given extension identifier to #stac_extensions.
93
+ #
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
107
+ end
108
+
109
+ # Returns a link matching the arguments.
110
+ def find_link(rel:, type: nil)
111
+ links.find do |link|
112
+ if type
113
+ link.rel == rel && link.type == type
114
+ else
115
+ link.rel == rel
116
+ end
117
+ end
60
118
  end
61
119
 
62
120
  # Adds a link with setting Link#owner as self.
63
- def add_link(link)
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)
64
127
  link.owner = self
65
128
  links << link
129
+ self
66
130
  end
67
131
 
68
132
  # Reterns HREF of the rel="self" link.
@@ -70,22 +134,69 @@ module STAC
70
134
  find_link(rel: 'self')&.href
71
135
  end
72
136
 
73
- # Adds a link with the give HREF as rel="self".
137
+ # Overwrites rel="self" link with the given HREF.
74
138
  #
75
139
  # When any ref="self" links already exist, removes them.
76
140
  def self_href=(absolute_href)
77
- self_link = Link.new(rel: 'self', href: absolute_href, type: 'application/json')
78
- remove_link(rel: 'self')
79
- add_link(self_link)
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)
80
178
  end
81
179
 
82
180
  private
83
181
 
84
- def find_link(rel:)
85
- links.find { |link| link.rel == 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
86
197
  end
87
198
 
88
- def remove_link(rel:)
199
+ def remove_links(rel:)
89
200
  links.reject! { |link| link.rel == rel }
90
201
  end
91
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.1.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/stac.rb CHANGED
@@ -1,6 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
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'
4
10
  require_relative 'stac/version'
5
11
 
6
12
  # Gem namespace.
@@ -8,6 +14,8 @@ require_relative 'stac/version'
8
14
  # Provides some utility methods.
9
15
  module STAC
10
16
  class << self
17
+ attr_accessor :default_http_client
18
+
11
19
  # Returns a \STAC object resolved from the given file path.
12
20
  def from_file(path)
13
21
  from_url("file://#{File.expand_path(path)}")
@@ -16,10 +24,18 @@ module STAC
16
24
  # Returns a \STAC object resolved from the given URL.
17
25
  #
18
26
  # When the resolved object does not have rel="self" link, adds a rel="self" link with the give url.
19
- def from_url(url, resolver: ObjectResolver.new)
20
- object = resolver.resolve(url)
27
+ def from_url(url, http_client: default_http_client)
28
+ object = ObjectResolver.new(http_client: http_client).resolve(url)
21
29
  object.self_href = url unless object.self_href
22
30
  object
23
31
  end
24
32
  end
33
+
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)
25
41
  end
data/sig/stac/asset.rbs CHANGED
@@ -1,5 +1,8 @@
1
1
  module STAC
2
2
  class Asset
3
+ include HashLike
4
+ include CommonMetadata
5
+
3
6
  def self.from_hash: (Hash[String, untyped] hash) -> Asset
4
7
 
5
8
  attr_accessor href: String
@@ -7,12 +10,9 @@ module STAC
7
10
  attr_accessor description: String?
8
11
  attr_accessor type: String?
9
12
  attr_accessor roles: Array[String]?
10
- attr_accessor extra: Hash[String, untyped]
11
13
 
12
14
  def initialize: (
13
15
  href: String, ?title: String?, ?description: String?, ?type: String?, ?roles: Array[String]?, **untyped
14
16
  ) -> void
15
-
16
- def to_h: -> Hash[String, untyped]
17
17
  end
18
18
  end
data/sig/stac/catalog.rbs CHANGED
@@ -1,20 +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
 
14
+ attr_accessor id: String
5
15
  attr_accessor description: String
6
16
  attr_accessor title: String?
7
17
 
8
18
  def initialize: (
9
- 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
10
25
  ) -> void
11
26
 
12
- def to_h: -> Hash[String, untyped]
13
- def children: -> Enumerator::Lazy[Catalog | Collection, void]
27
+ def children: -> Enumerator::Lazy[Catalog, void]
28
+ def all_children: -> Enumerator::Lazy[Catalog, void]
14
29
  def collections: -> Enumerator::Lazy[Collection, void]
15
- 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?
16
32
  def items: -> Enumerator::Lazy[Item, void]
17
33
  def all_items: -> Enumerator::Lazy[Item, void]
18
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]
19
43
  end
20
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
@@ -0,0 +1,34 @@
1
+ module STAC
2
+ module CommonMetadata
3
+ attr_reader extra: Hash[String, untyped]
4
+
5
+ def title: -> String?
6
+ def title=: (String) -> void
7
+ def description: -> String?
8
+ def description=: (String) -> void
9
+ def created: -> Time?
10
+ def created=: (Time | String) -> void
11
+ def updated: -> Time?
12
+ def updated=: (Time | String) -> void
13
+ def start_datetime: -> Time?
14
+ def start_datetime=: (Time | String) -> void
15
+ def end_datetime: -> Time?
16
+ def end_datetime=: (Time | String) -> void
17
+ def datetime_range: -> Range[Time]?
18
+ def datetime_range=: (Range[Time]) -> void
19
+ def license: -> String?
20
+ def license=: (String) -> void
21
+ def providers: -> Array[Provider]
22
+ def providers=: (Array[Provider | Hash[String, untyped]]) -> void
23
+ def platform: -> String?
24
+ def platform=: (String) -> void
25
+ def instruments: -> Array[String]?
26
+ def instruments=: (Array[String]) -> void
27
+ def constellation: -> String?
28
+ def constellation=: (String) -> void
29
+ def mission: -> String?
30
+ def mission=: (String) -> void
31
+ def gsd: -> Numeric
32
+ def gsd=: (Numeric) -> void
33
+ end
34
+ end
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