dwml 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bd148c3dd2ef35a098cdaab6f8dc37e7c35276ee
4
+ data.tar.gz: c4844f0451e8cba714da7af6837aad3756d713b8
5
+ SHA512:
6
+ metadata.gz: c8f59e69faa76af529e15c2b1722b7e26fdeb4d380dd93d36ebe6fde37419a4ef94cfd92ea32b606f0830741d53a7abb1ec83895a2e631820a37b1bd8fa62213
7
+ data.tar.gz: 3e17350c0a31ee30197f2c3beef7914043f02b30e6903d6226fce9d06f4f9a0c5b71b51d254f6adf900c6f1841a3e275272e11848870015d71a5f915873d2060
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ .ruby-version
3
+ coverage/*
4
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :test do
5
+ gem 'simplecov', '~>0.8.2', :require => false
6
+ gem 'coveralls', :require => false
7
+ gem 'webmock', '~>1.17.4'
8
+ gem 'vcr', '~>2.9.0'
9
+ gem 'rspec', '~>2.14.0'
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Angelo Lakra
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ dwml
2
+ ====
3
+
4
+ A parser for NOAA's Digital Weather Markup Language (DWML)
data/dwml.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'dwml/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "dwml"
8
+ s.version = DWML::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Angelo Lakra"]
11
+ s.email = ["angelo.lakra@gmail.com"]
12
+ s.summary = "A parser for NOAA's Digital Weather Markup Language (DWML)"
13
+
14
+ s.description = <<-EOT
15
+ Parses DWML and outputs it into ruby arrays/hashes
16
+ EOT
17
+
18
+ s.homepage = "https://github.com/alakra/dwml"
19
+ s.licenses = ['MIT']
20
+
21
+ s.extra_rdoc_files = ['README.md']
22
+
23
+ s.add_runtime_dependency 'nokogiri', '~> 1.6.1', '>= 1.6.1'
24
+ s.add_runtime_dependency 'multi_json', '~> 1.9.0', '>= 1.9.0'
25
+ s.add_runtime_dependency 'activesupport', '~> 4.1.0', '>= 4.1.0'
26
+
27
+ s.required_ruby_version = '>= 1.9.3'
28
+
29
+ s.files = `git ls-files`.split("\n")
30
+ s.test_files = `git ls-files -- spec/*`.split("\n")
31
+ s.require_path = 'lib'
32
+ end
@@ -0,0 +1,53 @@
1
+ require 'dwml/location'
2
+ require 'dwml/time_layout'
3
+ require 'dwml/parameter_extractor'
4
+
5
+ class DWML
6
+ class DataExtractor
7
+ attr_reader :output, :element
8
+
9
+ def initialize(element)
10
+ @element = element
11
+ @locations = []
12
+ @time_layouts = []
13
+ @output = {}
14
+ end
15
+
16
+ def process
17
+ extract_locations
18
+ extract_time_layouts
19
+ extract_parameters
20
+
21
+ output
22
+ end
23
+
24
+ protected
25
+
26
+ def extract_locations
27
+ @locations = Location.extract(element.xpath("location"))
28
+ end
29
+
30
+ def extract_time_layouts
31
+ @time_layouts = TimeLayout.extract(element.xpath("time-layout"))
32
+ end
33
+
34
+ def extract_parameters
35
+ parameters = element.xpath("parameters")
36
+
37
+ @output.merge!(
38
+ :parameters => parameters.inject({}) do |memo, parameter|
39
+ location = location_for_parameter(parameter)
40
+ extractor = ParameterExtractor.new(parameter, location, @time_layouts)
41
+ memo.merge!(location.location_key => extractor.process)
42
+ memo
43
+ end
44
+ )
45
+ end
46
+
47
+ def location_for_parameter(parameter)
48
+ @locations.detect do |location|
49
+ parameter.attributes["applicable-location"].text == location.location_key
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,47 @@
1
+ class DWML
2
+ class HeadExtractor
3
+ attr_reader :output, :element
4
+
5
+ def initialize(element)
6
+ @element = element
7
+ @output = {}
8
+ end
9
+
10
+ def process
11
+ build_product
12
+ build_source
13
+ output
14
+ end
15
+
16
+ protected
17
+
18
+ def build_product
19
+ creation_date = Time.zone.parse(element.xpath('product/creation-date').text)
20
+
21
+ @output.merge!(
22
+ :product => {
23
+ :title => element.xpath('product/title').text,
24
+ :field => element.xpath('product/field').text,
25
+ :category => element.xpath('product/category').text,
26
+ :creation_date => creation_date
27
+ }
28
+ )
29
+ end
30
+
31
+ def build_source
32
+ sub_center = element.xpath('source/production-center/sub-center').text
33
+ production_center = element.xpath('source/production-center').text
34
+
35
+ @output.merge!(
36
+ :source => {
37
+ :more_information => element.xpath('source/more-information').text,
38
+ :product_center => production_center.gsub(sub_center, " - #{sub_center}"),
39
+ :disclaimer => element.xpath('source/disclaimer').text,
40
+ :credit => element.xpath('source/credit').text,
41
+ :credit_logo => element.xpath('source/credit-logo').text,
42
+ :feedback => element.xpath('source/feedback').text
43
+ }
44
+ )
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ class DWML
2
+ class Location
3
+ class << self
4
+ def extract(elements)
5
+ elements.map { |element| new(element) }
6
+ end
7
+ end
8
+
9
+ attr_reader :element, :location_key, :latitude, :longitude
10
+
11
+ def initialize(element)
12
+ @element = element
13
+
14
+ extract_key
15
+ extract_coords
16
+ end
17
+
18
+ protected
19
+
20
+ def extract_key
21
+ @location_key = element.xpath("location-key").first.text
22
+ end
23
+
24
+ def extract_coords
25
+ point = element.xpath('point').first
26
+
27
+ @latitude = point.attributes["latitude"].text.to_f
28
+ @longitude = point.attributes["longitude"].text.to_f
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,279 @@
1
+ class DWML
2
+ class ParameterExtractor
3
+ attr_reader :output, :element, :location, :time_layouts
4
+
5
+ def initialize(element, location, time_layouts)
6
+ @element = element
7
+ @location = location
8
+ @time_layouts = time_layouts
9
+
10
+ @output = {
11
+ :latitude => location.latitude,
12
+ :longitude => location.longitude
13
+ }
14
+ end
15
+
16
+ def process
17
+ extract_temperatures
18
+ extract_precipitation
19
+ extract_wind_speed
20
+ extract_wind_direction
21
+ extract_cloud_cover
22
+ extract_probability_of_precipitation
23
+ extract_fire_weather
24
+ extract_convective_hazard
25
+ extract_climate_anomaly
26
+ extract_humidity
27
+ extract_weather
28
+ extract_conditions_icons
29
+ extract_hazards
30
+ extract_water_state
31
+
32
+ output
33
+ end
34
+
35
+ protected
36
+
37
+ def extract_temperatures
38
+ extract_basic_time_series(:temperature)
39
+ end
40
+
41
+ def extract_precipitation
42
+ extract_basic_time_series(:precipitation)
43
+ end
44
+
45
+ def extract_wind_speed
46
+ extract_basic_time_series(:"wind-speed")
47
+ end
48
+
49
+ def extract_wind_direction
50
+ extract_basic_time_series(:direction)
51
+ end
52
+
53
+ def extract_cloud_cover
54
+ extract_basic_time_series(:"cloud-amount")
55
+ end
56
+
57
+ def extract_probability_of_precipitation
58
+ extract_basic_time_series(:"probability-of-precipitation")
59
+ end
60
+
61
+ def extract_humidity
62
+ extract_basic_time_series(:humidity)
63
+ end
64
+
65
+ def extract_fire_weather
66
+ extract_basic_time_series(:"fire-weather")
67
+ end
68
+
69
+ def extract_water_state
70
+ node = element.xpath("water-state").first
71
+ return if node.blank?
72
+
73
+ @output[:"water-state"] = {}
74
+ layout = lookup_time_layout(node)
75
+
76
+ waves_node = node.xpath("waves").first
77
+ @output[:"water-state"][:type] = waves_node.attributes["type"].text
78
+ @output[:"water-state"][:unit] = waves_node.attributes["units"].text
79
+ @output[:"water-state"][:values] = []
80
+
81
+ waves_node.xpath("value").each_with_index do |value, index|
82
+ @output[:"water-state"][:values] << {
83
+ :value => value.text,
84
+ :start_time => layout.valid_times[index].start
85
+ }
86
+ end
87
+ end
88
+
89
+ def extract_hazards
90
+ node = element.xpath("hazards").first
91
+ return if node.blank?
92
+
93
+ layout = lookup_time_layout(node)
94
+
95
+ @output[:hazards] = {
96
+ :name => node.xpath("name").first.text,
97
+ :conditions => node.xpath("hazard-conditions").each_with_index.map do |condition_node, index|
98
+ hazard_node = condition_node.xpath("hazard").first
99
+ next if hazard_node.blank?
100
+
101
+ {
102
+ :code => hazard_node.attributes["hazardCode"].text,
103
+ :phenomena => hazard_node.attributes["phenomena"].text,
104
+ :significance => hazard_node.attributes["significance"].text,
105
+ :type => hazard_node.attributes["hazardType"].text,
106
+ :url => hazard_node.xpath("hazardTextURL").first.text,
107
+ :start_time => layout.valid_times[index].start
108
+ }
109
+ end.compact
110
+ }
111
+ end
112
+
113
+ def extract_conditions_icons
114
+ node = element.xpath("conditions-icon").first
115
+ return if node.blank?
116
+
117
+ layout = lookup_time_layout(node)
118
+
119
+ @output[:"conditions-icon"] = {
120
+ :name => node.xpath("name").text,
121
+ :type => node.attributes["type"].text,
122
+ :links => node.xpath("icon-link").each_with_index.map do |icon_node, index|
123
+ {
124
+ :link => icon_node.text,
125
+ :start_time => layout.valid_times[index].start
126
+ }
127
+ end
128
+ }
129
+ end
130
+
131
+ def extract_convective_hazard
132
+ return if element.xpath("convective-hazard").blank?
133
+
134
+ @output[:"convective-hazard"] ||= {
135
+ :outlook => { :name => nil, :values => []},
136
+ :"severe-component" => []
137
+ }
138
+
139
+ extract_convective_hazard_outlook
140
+ extract_convective_hazard_severity
141
+ end
142
+
143
+ def extract_convective_hazard_outlook
144
+ outlook_node = element.xpath("convective-hazard/outlook").first
145
+ layout = lookup_time_layout(outlook_node)
146
+
147
+ @output[:"convective-hazard"][:outlook][:name] = outlook_node.xpath("node").text
148
+
149
+ outlook_node.xpath("value").each_with_index do |value, index|
150
+ @output[:"convective-hazard"][:outlook][:values] << {
151
+ :start_time => layout.valid_times[index].start,
152
+ :end_time => layout.valid_times[index].stop,
153
+ :value => value.text
154
+ }
155
+ end
156
+ end
157
+
158
+ def extract_convective_hazard_severity
159
+ element.xpath("convective-hazard/severe-component").each do |node|
160
+ layout = lookup_time_layout(node)
161
+
162
+ hsh = {
163
+ :name => node.xpath("name").first.text,
164
+ :type => node.attributes["type"].text,
165
+ :unit => node.attributes["units"].text,
166
+ :values => node.xpath("value").each_with_index.map do |value, index|
167
+ {
168
+ :value => value.text,
169
+ :start_time => layout.valid_times[index].start,
170
+ :end_time => layout.valid_times[index].stop
171
+ }
172
+ end
173
+ }
174
+
175
+ @output[:"convective-hazard"][:"severe-component"] << hsh
176
+ end
177
+ end
178
+
179
+ def extract_climate_anomaly
180
+ return if element.xpath("climate-anomaly").blank?
181
+
182
+ [:weekly, :monthly, :seasonal].each do |period|
183
+ element.xpath("climate-anomaly/#{period.to_s}").each_with_index do |node|
184
+ layout = lookup_time_layout(node)
185
+ valid_time = layout.valid_times.first
186
+
187
+ @output[:"climate-anomaly"] ||= {}
188
+ @output[:"climate-anomaly"][period] ||= []
189
+ @output[:"climate-anomaly"][period] << {
190
+ :name => node.xpath("name").first.text,
191
+ :value => node.xpath("value").first.text,
192
+ :type => node.attributes["type"].text,
193
+ :unit => node.attributes["units"].text,
194
+ :start_time => valid_time.start,
195
+ :end_time => valid_time.stop
196
+ }
197
+ end
198
+ end
199
+ end
200
+
201
+ def extract_weather
202
+ node = element.xpath("weather")
203
+ return if node.blank?
204
+
205
+ node.map do |weather_node|
206
+ @output[:weather] ||= {}
207
+ @output[:weather][:name] = weather_node.xpath("name").text
208
+ @output[:weather][:conditions] ||= []
209
+
210
+ layout = lookup_time_layout(weather_node)
211
+
212
+ weather_node.xpath("weather-conditions").each_with_index do |condition, index|
213
+ value = condition.xpath("value").first
214
+ next if value.blank?
215
+
216
+ visibility_node = value.xpath("visibility").first
217
+ visibility = if visibility_node.present? && visibility_node.text.present?
218
+ {
219
+ :unit => visibility_node.attributes["units"].text,
220
+ :value => visibility_node.text.to_f
221
+ }
222
+ else
223
+ ""
224
+ end
225
+
226
+ hsh = {
227
+ :start_time => layout.valid_times[index].start,
228
+ :coverage => value.attributes["coverage"].text,
229
+ :intensity => value.attributes["intensity"].text,
230
+ :"weather-type" => value.attributes["weather-type"].text,
231
+ :qualifier => value.attributes["qualifier"].text,
232
+ :visibility => visibility
233
+ }
234
+
235
+ additive = value.attributes["additive"]
236
+ hsh.merge!(:additive => additive) if additive.present?
237
+
238
+ @output[:weather][:conditions] << hsh
239
+ end
240
+ end
241
+ end
242
+
243
+ def extract_basic_time_series(metric)
244
+ metric_node = element.xpath(metric.to_s)
245
+ return if metric_node.blank?
246
+
247
+ metric_node.map do |node|
248
+ layout = lookup_time_layout(node)
249
+ type = node.attributes["type"].text.to_sym
250
+ unit = node.attributes["units"].try(:text)
251
+
252
+ @output[metric] ||= {}
253
+ @output[metric][type] ||= {}
254
+ @output[metric][type][:name] = node.xpath("name").text
255
+ @output[metric][type][:values] = []
256
+
257
+ node.xpath("value").each_with_index do |value, index|
258
+ hsh = {
259
+ :value => value.text.to_f,
260
+ :start_time => layout.valid_times[index].start
261
+ }
262
+
263
+ end_time = layout.valid_times[index].stop
264
+
265
+ hsh.merge!(:unit => unit) if unit.present?
266
+ hsh.merge!(:end_time => end_time) if end_time.present?
267
+
268
+ @output[metric][type][:values] << hsh
269
+ end
270
+ end
271
+ end
272
+
273
+ def lookup_time_layout(node)
274
+ @time_layouts.detect do |layout|
275
+ node.attributes["time-layout"].text == layout.layout_key
276
+ end
277
+ end
278
+ end
279
+ end
@@ -0,0 +1,53 @@
1
+ class DWML
2
+ class TimeLayout
3
+ class << self
4
+ def extract(elements)
5
+ elements.map { |element| new(element) }
6
+ end
7
+ end
8
+
9
+ attr_reader :element, :time_coordinate, :summarization, :layout_key, :valid_times
10
+
11
+ def initialize(element)
12
+ @element = element
13
+ @valid_times = []
14
+
15
+ extract_time_coordinate
16
+ extract_summarization
17
+ extract_layout_key
18
+ extract_valid_times
19
+ end
20
+
21
+ protected
22
+
23
+ def extract_time_coordinate
24
+ @time_coordinate = element.attributes["time-coordinate"].text
25
+ end
26
+
27
+ def extract_summarization
28
+ @summarization = element.attributes["summarization"].text
29
+ end
30
+
31
+ def extract_layout_key
32
+ @layout_key = element.xpath("layout-key").first.text
33
+ end
34
+
35
+ def extract_valid_times
36
+ start_times = element.xpath("start-valid-time")
37
+ stop_times = element.xpath("end-valid-time")
38
+
39
+ start_times.each_with_index do |start_time, index|
40
+ @valid_times << ValidTime.new(start_time.text, stop_times[index].try(:text))
41
+ end
42
+ end
43
+
44
+ class ValidTime
45
+ attr_reader :start, :stop
46
+
47
+ def initialize(start, stop)
48
+ @start = Time.zone.parse(start.to_s)
49
+ @stop = Time.zone.parse(stop.to_s)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ class DWML
2
+ VERSION = "1.0.0"
3
+ end
data/lib/dwml.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'multi_json'
2
+
3
+ require 'dwml/head_extractor'
4
+ require 'dwml/data_extractor'
5
+
6
+ #
7
+ # Note: See http://graphical.weather.gov/xml/mdl/XML/Design/MDL_XML_Design.pdf
8
+ # for authoritative type definitions
9
+ ################################################################################
10
+
11
+ class DWML
12
+ attr_reader :output, :xmldoc
13
+
14
+ def initialize(xmldoc)
15
+ @xmldoc = xmldoc
16
+ @output = {}
17
+ end
18
+
19
+ def process
20
+ build_head
21
+ build_data
22
+ output
23
+ end
24
+
25
+ protected
26
+
27
+ def build_head
28
+ extractor = HeadExtractor.new(xmldoc.xpath("//dwml/head").first)
29
+ @output.merge!(extractor.process)
30
+ end
31
+
32
+ def build_data
33
+ extractor = DataExtractor.new(xmldoc.xpath("//dwml/data").first)
34
+ @output.merge!(extractor.process)
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe DWML::Location do
4
+ describe ".extract" do
5
+ end
6
+
7
+ context "after initialization" do
8
+ describe "#element" do
9
+ it "returns original element"
10
+ end
11
+
12
+ describe "#location_key" do
13
+ it "returns the location_key"
14
+ end
15
+
16
+ describe "#latitude" do
17
+ it "returns the correct latitude"
18
+ end
19
+
20
+ describe "#longitude" do
21
+ it "returns the correct longitude"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe DWML::ParameterExtractor do
4
+ describe "after initialize" do
5
+ describe "#element" do
6
+ it "returns the original XML element"
7
+ end
8
+
9
+ describe "#location" do
10
+ it "returns the location"
11
+ end
12
+
13
+ describe "#time_layouts" do
14
+ it "returns time layouts"
15
+ end
16
+
17
+ describe "#output" do
18
+ it "returns a pair of lat/longs"
19
+ end
20
+ end
21
+
22
+ describe "#process" do
23
+ context "for temperatures" do
24
+ it "returns valid temperatures with associated timestamps"
25
+ end
26
+
27
+ context "for extracting precipitation" do
28
+ it "returns valid precipitation with associated timestamps"
29
+ end
30
+
31
+ context "for extracting wind speed" do
32
+ it "returns valid wind speed with associated timestamps"
33
+ end
34
+
35
+ context "for extracting wind direction" do
36
+ it "returns valid wind direction with associated timestamps"
37
+ end
38
+
39
+ context "for extracting cloud cover" do
40
+ it "returns valid cloud cover with associated timestamps"
41
+ end
42
+
43
+ context "for extracting probability of precipitation" do
44
+ it "returns valid probability of precipitation with associated timestamps"
45
+ end
46
+
47
+ context "for extracting fire weather" do
48
+ it "returns valid fire weather with associated timestamps"
49
+ end
50
+
51
+ context "for extracting convective hazard" do
52
+ it "returns valid convective hazard with associated timestamps"
53
+ end
54
+
55
+ context "for extracting climate anomaly" do
56
+ it "returns valid climate anomaly with associated timestamps"
57
+ end
58
+
59
+ context "for extracting humidity" do
60
+ it "returns valid humidity with associated timestamps"
61
+ end
62
+
63
+ context "for extracting weather" do
64
+ it "returns valid weather with associated timestamps"
65
+ end
66
+
67
+ context "for extracting conditions icons" do
68
+ it "returns valid conditions icons with associated timestamps"
69
+ end
70
+
71
+ context "for extracting hazards" do
72
+ it "returns valid hazards with associated timestamps"
73
+ end
74
+
75
+ context "for extracting water state" do
76
+ it "returns valid water state with associated timestamps"
77
+ end
78
+
79
+
80
+ end
81
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe DWML::TimeLayout do
4
+ describe ".extract" do
5
+ it "returns a list of parsed XML elements"
6
+ end
7
+
8
+ describe "#element" do
9
+ it "returns the original XML element"
10
+ end
11
+
12
+ describe "#time_coordinate" do
13
+ it "returns the extracted time coordinate"
14
+ end
15
+
16
+ describe "#summarization" do
17
+ it "returns the extracted summarization"
18
+ end
19
+
20
+ describe "#layout_key" do
21
+ it "returns the extracted layout_key"
22
+ end
23
+
24
+ describe "#valid_times" do
25
+ it "returns the valid start and stop times as a ValidTime"
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ require 'dwml'
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # Require this file using `require "spec_helper"` to ensure that it is only
6
+ # loaded once.
7
+ #
8
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
9
+ RSpec.configure do |config|
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+ config.filter_run :focus
13
+
14
+ # Run specs in random order to surface order dependencies. If you find an
15
+ # order dependency and want to debug it, you can fix the order by providing
16
+ # the seed, which is printed after each run.
17
+ # --seed 1234
18
+ config.order = 'random'
19
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dwml
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Angelo Lakra
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.1
20
+ - - '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.6.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.6.1
30
+ - - '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.6.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: multi_json
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: 1.9.0
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: 1.9.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: 1.9.0
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: 1.9.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: activesupport
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: 4.1.0
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 4.1.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 4.1.0
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 4.1.0
73
+ description: |2
74
+ Parses DWML and outputs it into ruby arrays/hashes
75
+ email:
76
+ - angelo.lakra@gmail.com
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files:
80
+ - README.md
81
+ files:
82
+ - .gitignore
83
+ - .rspec
84
+ - Gemfile
85
+ - LICENSE
86
+ - README.md
87
+ - dwml.gemspec
88
+ - lib/dwml.rb
89
+ - lib/dwml/data_extractor.rb
90
+ - lib/dwml/head_extractor.rb
91
+ - lib/dwml/location.rb
92
+ - lib/dwml/parameter_extractor.rb
93
+ - lib/dwml/time_layout.rb
94
+ - lib/dwml/version.rb
95
+ - spec/lib/dwml/location_spec.rb
96
+ - spec/lib/dwml/parameter_extractor_spec.rb
97
+ - spec/lib/dwml/time_layout_spec.rb
98
+ - spec/spec_helper.rb
99
+ homepage: https://github.com/alakra/dwml
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: 1.9.3
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.3
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: A parser for NOAA's Digital Weather Markup Language (DWML)
123
+ test_files:
124
+ - spec/lib/dwml/location_spec.rb
125
+ - spec/lib/dwml/parameter_extractor_spec.rb
126
+ - spec/lib/dwml/time_layout_spec.rb
127
+ - spec/spec_helper.rb
128
+ has_rdoc: