weather-forecasts 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +10 -0
  6. data/LICENSE +20 -0
  7. data/README.md +135 -0
  8. data/bin/wf-console +21 -0
  9. data/lib/weather-forecasts.rb +1 -0
  10. data/lib/weather_forecasts.rb +23 -0
  11. data/lib/weather_forecasts/client.rb +65 -0
  12. data/lib/weather_forecasts/client/error.rb +18 -0
  13. data/lib/weather_forecasts/client/help_console.rb +9 -0
  14. data/lib/weather_forecasts/client/query.rb +155 -0
  15. data/lib/weather_forecasts/client/query/query_property.rb +68 -0
  16. data/lib/weather_forecasts/client/query/query_utilities.rb +16 -0
  17. data/lib/weather_forecasts/client/query/select_by_days_query.rb +35 -0
  18. data/lib/weather_forecasts/client/query/select_coordinates_by_cities_query.rb +47 -0
  19. data/lib/weather_forecasts/client/query/select_coordinates_by_zip_query.rb +34 -0
  20. data/lib/weather_forecasts/client/query/select_corner_coordinates_query.rb +38 -0
  21. data/lib/weather_forecasts/client/query/select_gridpoint_coordinates_query.rb +35 -0
  22. data/lib/weather_forecasts/client/query/select_linepoint_coordinates_query.rb +33 -0
  23. data/lib/weather_forecasts/client/query/select_query.rb +48 -0
  24. data/lib/weather_forecasts/client/query/select_square_coordinates_query.rb +35 -0
  25. data/lib/weather_forecasts/client/query/selection_attributes.rb +19 -0
  26. data/lib/weather_forecasts/client/version.rb +5 -0
  27. data/lib/weather_forecasts/dwml.rb +38 -0
  28. data/lib/weather_forecasts/dwml/data_extractor.rb +55 -0
  29. data/lib/weather_forecasts/dwml/head_extractor.rb +49 -0
  30. data/lib/weather_forecasts/dwml/location.rb +33 -0
  31. data/lib/weather_forecasts/dwml/parameter_extractor.rb +281 -0
  32. data/lib/weather_forecasts/dwml/time_layout.rb +55 -0
  33. data/spec/fixtures/vcr_cassettes/select_by_days_query.yml +557 -0
  34. data/spec/fixtures/vcr_cassettes/select_coordinates_by_cities_query.yml +437 -0
  35. data/spec/fixtures/vcr_cassettes/select_coordinates_by_zip_query.yml +437 -0
  36. data/spec/fixtures/vcr_cassettes/select_corner_coordinates_query.yml +438 -0
  37. data/spec/fixtures/vcr_cassettes/select_gridpoint_coordinates_query.yml +467 -0
  38. data/spec/fixtures/vcr_cassettes/select_linepoint_coordinates_query.yml +440 -0
  39. data/spec/fixtures/vcr_cassettes/select_query.yml +1647 -0
  40. data/spec/fixtures/vcr_cassettes/select_square_coordinates_query.yml +443 -0
  41. data/spec/lib/ndfd/client/query/query_property_spec.rb +41 -0
  42. data/spec/lib/ndfd/client/query/select_by_days_query_spec.rb +35 -0
  43. data/spec/lib/ndfd/client/query/select_coordinates_by_cities_query_spec.rb +33 -0
  44. data/spec/lib/ndfd/client/query/select_coordinates_by_zip_query_spec.rb +34 -0
  45. data/spec/lib/ndfd/client/query/select_corner_coordinates_query_spec.rb +35 -0
  46. data/spec/lib/ndfd/client/query/select_gridpoint_coordinates_query_spec.rb +37 -0
  47. data/spec/lib/ndfd/client/query/select_linepoint_coordinates_query_spec.rb +36 -0
  48. data/spec/lib/ndfd/client/query/select_query_spec.rb +46 -0
  49. data/spec/lib/ndfd/client/query/select_square_coordinates_query_spec.rb +37 -0
  50. data/spec/lib/ndfd/client/query/selection_attributes_spec.rb +13 -0
  51. data/spec/lib/ndfd/client/query_spec.rb +91 -0
  52. data/spec/lib/ndfd/client_spec.rb +61 -0
  53. data/spec/spec_helper.rb +33 -0
  54. data/spec/support/resources/sample_document.xml +61 -0
  55. data/weather-forecasts.gemspec +39 -0
  56. metadata +224 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 371ec85a41177e5776b3a7c75403e9c6542cbc3b
4
+ data.tar.gz: 175d691d93110a1420fe7418677ea2abe0791896
5
+ SHA512:
6
+ metadata.gz: 0d418743f91fb40d802efd1bd5d7d98168df72b28c9c143046511a67b423f684eb5cf2dea4824588dd1c8086ef82fd68e2f0f3381472fd87fd27a2771c173352
7
+ data.tar.gz: 1cef93374ea71318d02dc1588d6cabe709c12a4035def8b31baf6e8a0665b7984f911d334ca46b89751e5d0e92dd1bdcab94616f3fe3e89b457e54def4f6b227
@@ -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
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
4
+ - 2.1.0
5
+ - 2.0.0
6
+ - 1.9.3
7
+ script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :test do
5
+ gem 'simplecov', '~>0.7.1', :require => false
6
+ gem 'coveralls', :require => false
7
+ gem 'webmock', '~>1.15.0'
8
+ gem 'vcr', '~>2.8.0'
9
+ gem 'rspec', '~>2.14.0'
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 greencoder
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ 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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,135 @@
1
+ # Weather Forecasts for Ruby
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/weather-forecasts.png)](http://badge.fury.io/rb/weather-forecasts)
4
+ [![Build Status](https://travis-ci.org/alakra/weather-forecasts.png?branch=master)](https://travis-ci.org/alakra/weather-forecasts)
5
+ [![Dependency Status](https://gemnasium.com/alakra/weather-forecasts.png)](https://gemnasium.com/alakra/weather-forecasts)
6
+ [![Coverage Status](https://coveralls.io/repos/alakra/weather-forecasts/badge.png?branch=master)](https://coveralls.io/r/alakra/weather-forecasts?branch=master)
7
+
8
+ [![Code Climate](https://codeclimate.com/github/alakra/weather-forecasts.png)](https://codeclimate.com/github/alakra/weather-forecasts) |
9
+ [![Inline docs](http://inch-pages.github.io/github/alakra/weather-forecasts.png)](http://inch-pages.github.io/github/alakra/weather-forecasts)
10
+
11
+ ## Summary
12
+
13
+ This library provides API client access to NOAA's NDFD database
14
+ for access to weather forecast information via Ruby.
15
+
16
+ ## NDFD Features
17
+
18
+ You can [see the available forecast information](http://www.nws.noaa.gov/ndfd/technical.htm#elements) that is accessible via the API on the NDFD technical description page.
19
+
20
+ In general, you can get the following:
21
+
22
+ * Specific forecast dimensions (min/max temperature, wind speed, etc.) out to 168 hours.
23
+ * Climate outlook probabilities (estimated averages/totals of temperature and precipitation)
24
+ * Convective Outlook Hazard Probabilities (hazard outlook, tornadoes, etc.)
25
+ * Probabilistic Tropical Cyclone Surface Wind Speed (measured in knots)
26
+
27
+ ## Client Features
28
+
29
+ The client offers a easy to use query interface and will hand back data to you in hashes, arrays and XML documents.
30
+ Validates requests and data types on execution of requests (will raise contextual errors on poorly formed data in queries)
31
+
32
+ ## Runtime Dependencies
33
+
34
+ Ruby versions supported:
35
+
36
+ * 2.1.x
37
+ * 2.0.x
38
+ * 1.9.3
39
+
40
+ Ruby versions not supported (but will be):
41
+
42
+ * JRuby 1.7+
43
+ * Rubinius 2.2+
44
+
45
+ Ruby versions that will not be supported:
46
+
47
+ * <= 1.9.2 (including REE)
48
+
49
+ Libraries used:
50
+
51
+ * savon (for SOAP support)
52
+ * activesupport (for TimeWithZone support)
53
+ * nokogiri (for XML/XSLT parsing)
54
+ * http_logger (for controlling logging output from savon)
55
+
56
+ ## Installation
57
+
58
+ gem install weather-forecasts
59
+
60
+ ## Usage
61
+
62
+ `WeatherForecasts.client` is the top-level start point from whence all API calls are executed.
63
+
64
+ Most calls follow the form of:
65
+
66
+ WeatherForecasts.client.
67
+ select(:maxt, :mint, :temp, etc.).
68
+ where(conditions).
69
+ execute
70
+
71
+ This will return an `Array` or `Hash` containing the data from the
72
+ response depending on the type of the request.
73
+
74
+ **NOTE**: Dates and times passed to the `where` must be
75
+ ActiveSupport::TimeWithZone objects.
76
+
77
+ **NOTE**: `NDFDgen` and `NDFDgenByDay` are not implemented in favor of
78
+ using the equivalent collection-based functions.
79
+
80
+ **NOTE**: `GmlLatLonList`, `GmlTimeSeries` are not implemented because
81
+ of their limited use (and my inability to figure out what parameters
82
+ to use to make a valid request). It appears to be [discontinued](http://www.nws.noaa.gov/om/notification/tin10-59ending_wfs.htm).
83
+
84
+ <table>
85
+ <tr>
86
+ <th>Query Method</th>
87
+ <th>API server function</th>
88
+ <th>Description</th>
89
+ </tr>
90
+ <tr>
91
+ <td><code>select</code></td>
92
+ <td><code>NDFDgenLatLonList</code></td>
93
+ <td>Returns a <code>Hash</code> of forecast metrics for multiple latitudes/longitudes.</td>
94
+ </tr>
95
+ <tr>
96
+ <td><code>select_by_days</code></td>
97
+ <td><code>NDFDgenByDayLatLonList</code></td>
98
+ <td>Returns a <code>Hash</code> of forecast metrics for multiple latitudes/longitudes in a 24/12 hour period for a number of days.</td>
99
+ </tr>
100
+ <tr>
101
+ <td><code>select_coordinates_by_zip</code></td>
102
+ <td><code>LatLonListZipCode</code></td>
103
+ <td>Returns a <code>Hash</code> of latitudes/longitudes for every zip code requested.</td>
104
+ </tr>
105
+ <tr>
106
+ <td><code>select_coordinates_by_cities</code></td>
107
+ <td><code>LatLonListCityNames</code></td>
108
+ <td>Returns a <code>Hash</code> of latitudes/longitudes for a pre-defined set of cities.</td>
109
+ </tr>
110
+ <tr>
111
+ <td><code>select_square_coordinates</code></td>
112
+ <td><code>LatLonListSquare</code></td>
113
+ <td>Returns a <code>Array</code> of latitudes/longitudes for the requested rectangular area.</td>
114
+ </tr>
115
+ <tr>
116
+ <td><code>select_gridpoint_coordinates</code></td>
117
+ <td><code>LatLonListSubgrid</code></td>
118
+ <td>Returns a <code>Array</code> of latitudes/longitudes for the requested subgrid.</td>
119
+ </tr>
120
+ <tr>
121
+ <td><code>select_linepoint_coordinates</code></td>
122
+ <td><code>LatLonListLine</code></td>
123
+ <td>Returns a <code>Array</code> of latitudes/longitudes between a start and end coordinate.</td>
124
+ </tr>
125
+ <tr>
126
+ <td><code>select_corner_coordinates</code></td>
127
+ <td><code>CornerPoints</code></td>
128
+ <td>Returns a <code>Array</code> of latitudes/longitudes of the corners of one of the NDFD grids.</td>
129
+ </tr>
130
+ </table>
131
+
132
+ To see a description of the NDFD Spatial Reference System (used for collecting lat/longs in an area)
133
+ http://graphical.weather.gov/docs/ndfdSRS.htm
134
+
135
+ To see more detailed documention, view the [API Documentation](http://rdoc.info/github/alakra/weather-forecasts/frames)
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'nokogiri'
7
+
8
+ $: << File.join(File.dirname(__FILE__), "..", "lib")
9
+
10
+ require 'weather_forecasts'
11
+ require 'weather_forecasts/client/help_console'
12
+
13
+ require 'irb'
14
+ require 'pp'
15
+
16
+ client = WeatherForecasts.client
17
+
18
+ h = WeatherForecasts::Client::HelpConsole.new
19
+ h.display_welcome
20
+
21
+ IRB.start
@@ -0,0 +1 @@
1
+ require 'weather_forecasts'
@@ -0,0 +1,23 @@
1
+ module WeatherForecasts
2
+ module_function
3
+
4
+ def env
5
+ @@env ||= (ENV['ENV'] || :production)
6
+ end
7
+
8
+ def client(options = {})
9
+ Client.new(options)
10
+ end
11
+
12
+ def root_path
13
+ File.expand_path(File.join(File.dirname(__FILE__), "../"))
14
+ end
15
+
16
+ def vendor_path
17
+ File.join(root_path, "vendor")
18
+ end
19
+ end
20
+
21
+ require 'weather_forecasts/dwml'
22
+ require 'weather_forecasts/client'
23
+ require 'weather_forecasts/client/version'
@@ -0,0 +1,65 @@
1
+ require 'nokogiri'
2
+ require 'savon'
3
+ require 'http_logger'
4
+
5
+ require 'weather_forecasts/client/error'
6
+ require 'weather_forecasts/client/query'
7
+
8
+ # Original web service description: http://graphical.weather.gov/xml/
9
+ module WeatherForecasts
10
+ class Client
11
+ DEFAULT_WSDL = "http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl"
12
+
13
+ def initialize(options = {})
14
+ @options = options
15
+
16
+ if options[:wsdl].blank?
17
+ @options.merge!(:wsdl => DEFAULT_WSDL)
18
+ end
19
+
20
+ if options[:logger].present?
21
+ HttpLogger.logger = options[:logger]
22
+ end
23
+ end
24
+
25
+ def soap_client
26
+ @soap_client ||= Savon.client(@options)
27
+ end
28
+
29
+ #
30
+ # Query Methods
31
+ ############################################################################
32
+
33
+ def select(*options)
34
+ SelectQuery.new(soap_client, options)
35
+ end
36
+
37
+ def select_by_days
38
+ SelectByDaysQuery.new(soap_client)
39
+ end
40
+
41
+ def select_coordinates_by_zip
42
+ SelectCoordinatesByZipQuery.new(soap_client)
43
+ end
44
+
45
+ def select_coordinates_by_cities
46
+ SelectCoordinatesByCitiesQuery.new(soap_client)
47
+ end
48
+
49
+ def select_square_coordinates
50
+ SelectSquareCoordinatesQuery.new(soap_client)
51
+ end
52
+
53
+ def select_gridpoint_coordinates
54
+ SelectGridpointCoordinatesQuery.new(soap_client)
55
+ end
56
+
57
+ def select_linepoint_coordinates
58
+ SelectLinepointCoordinatesQuery.new(soap_client)
59
+ end
60
+
61
+ def select_corner_coordinates
62
+ SelectCornerCoordinatesQuery.new(soap_client)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,18 @@
1
+ module WeatherForecasts
2
+ class Client
3
+ class InvalidSelectionAttributeError < ArgumentError
4
+ end
5
+
6
+ class InvalidPropertyTypeError < ArgumentError
7
+ end
8
+
9
+ class InvalidOptionSpecifiedError < ArgumentError
10
+ end
11
+
12
+ class RequiredPropertyError < ArgumentError
13
+ end
14
+
15
+ class RequiredKeysMissingError < ArgumentError
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module WeatherForecasts
2
+ class Client
3
+ class HelpConsole
4
+ def display_welcome
5
+ puts "Use the `NDFD.client` object to start making API calls."
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,155 @@
1
+ require 'active_support/time'
2
+ require 'active_support/time_with_zone'
3
+
4
+ Time.zone ||= "UTC"
5
+
6
+ require 'weather_forecasts/client/query/query_property'
7
+ require 'weather_forecasts/client/query/selection_attributes'
8
+ require 'weather_forecasts/client/query/query_utilities'
9
+
10
+ module WeatherForecasts
11
+ class Client
12
+ class Query
13
+ FORECAST_ELEMENTS = {
14
+ :maxt => "Maximum Temperature",
15
+ :mint => "Minimum Temperature",
16
+ :temp => "3 Hourly Temperature",
17
+ :dew => "Dewpoint Temperature",
18
+ :appt => "Apparent Temperature",
19
+ :pop12 => "12 Hour Probability of Precipitation",
20
+ :qpf => "Liquid Precipitation Amount",
21
+ :snow => "Snowfall Amount",
22
+ :sky => "Cloud Cover Amount",
23
+ :rh => "Relative Humidity",
24
+ :wspd => "Wind Speed",
25
+ :wdir => "Wind Direction",
26
+ :wx => "Weather",
27
+ :icons => "Weather Icons",
28
+ :waveh => "Wave Height",
29
+ :incw34 => "Probabilistic Tropical Cyclone Wind Speed >34 Knots (Incremental)",
30
+ :incw50 => "Probabilistic Tropical Cyclone Wind Speed >50 Knots (Incremental)",
31
+ :incw64 => "Probabilistic Tropical Cyclone Wind Speed >64 Knots (Incremental)",
32
+ :cumw34 => "Probabilistic Tropical Cyclone Wind Speed >34 Knots (Cumulative)",
33
+ :cumw50 => "Probabilistic Tropical Cyclone Wind Speed >50 Knots (Cumulative)",
34
+ :cumw64 => "Probabilistic Tropical Cyclone Wind Speed >64 Knots (Cumulative)",
35
+ :wgust => "Wind Gust",
36
+ :critfireo => "Fire Weather from Wind and Relative Humidity",
37
+ :dryfireo => "Fire Weather from Dry Thunderstorms",
38
+ :conhazo => "Convective Hazard Outlook",
39
+ :ptornado => "Probability of Tornadoes",
40
+ :phail => "Probability of Hail",
41
+ :ptstmwinds => "Probability of Damaging Thunderstorm Winds",
42
+ :pxtornado => "Probability of Extreme Tornadoes",
43
+ :pxhail => "Probability of Extreme Hail",
44
+ :pxtstmwinds => "Probability of Extreme Thunderstorm Winds",
45
+ :ptotsvrtstm => "Probability of Severe Thunderstorms",
46
+ :pxtotsvrtstm => "Probability of Extreme Severe Thunderstorms",
47
+ :tmpabv14d => "Probability of 8- To 14-Day Average Temperature Above Normal",
48
+ :tmpblw14d => "Probability of 8- To 14-Day Average Temperature Below Normal",
49
+ :tmpabv30d => "Probability of One-Month Average Temperature Above Normal",
50
+ :tmpblw30d => "Probability of One-Month Average Temperature Below Normal",
51
+ :tmpabv90d => "Probability of Three-Month Average Temperature Above Normal",
52
+ :tmpblw90d => "Probability of Three-Month Average Temperature Below Normal",
53
+ :prcpabv14d => "Probability of 8- To 14-Day Total Precipitation Above Median",
54
+ :prcpblw14d => "Probability of 8- To 14-Day Total Precipitation Below Median",
55
+ :prcpabv30d => "Probability of One-Month Total Precipitation Above Median",
56
+ :prcpblw30d => "Probability of One-Month Total Precipitation Below Median",
57
+ :prcpabv90d => "Probability of Three-Month Total Precipitation Above Median",
58
+ :prcpblw90d => "Probability of Three-Month Total Precipitation Below Median",
59
+ :precipa_r => "Real-time Mesoscale Analysis Precipitation",
60
+ :sky_r => "Real-time Mesoscale Analysis GOES Effective Cloud Amount",
61
+ :td_r => "Real-time Mesoscale Analysis Dewpoint Temperature",
62
+ :temp_r => "Real-time Mesoscale Analysis Temperature",
63
+ :wdir_r => "Real-time Mesoscale Analysis Wind Direction",
64
+ :wspd_r => "Real-time Mesoscale Analysis Wind Speed",
65
+ :wwa => "Watches, Warnings, and Advisories",
66
+ :iceaccum => "Ice Accumulation",
67
+ :maxrh => "Maximum Relative Humidity",
68
+ :minrh => "Minimum Relative Humidity"
69
+ }
70
+
71
+ attr_reader :soap_client, :select_attributes, :conditions
72
+
73
+ def initialize(soap_client, select_attributes = [])
74
+ @soap_client = soap_client
75
+ @select_attributes = select_attributes
76
+ @conditions = {}
77
+ end
78
+
79
+ def where(params)
80
+ conditions.merge!(params)
81
+ set_defaults_as_needed
82
+
83
+ self
84
+ end
85
+
86
+ def execute
87
+ raise NotImplementedError, "Must be implemented in subclass."
88
+ end
89
+
90
+ def validate
91
+ validate_selection_attributes
92
+ validate_conditions
93
+ end
94
+
95
+ class << self
96
+ def properties
97
+ @@properties ||= {}
98
+ end
99
+
100
+ def property(attr, options = {})
101
+ properties[self] ||= []
102
+ properties[self] << QueryProperty.new(attr, options)
103
+ end
104
+
105
+ def selection_attributes
106
+ @@selection_attributes ||= {}
107
+ end
108
+
109
+ def set_selection_attributes(*attrs)
110
+ selection_attributes[self] = SelectionAttributes.new(attrs)
111
+ end
112
+ end
113
+
114
+ protected
115
+
116
+ def available_selections
117
+ self.class.selection_attributes[self.class]
118
+ end
119
+
120
+ def set_defaults_as_needed
121
+ query_properties = self.class.properties[self.class]
122
+ return unless query_properties
123
+
124
+ query_properties.select(&:default).each do |query_property|
125
+ next if conditions.has_key?(query_property.name)
126
+ conditions.merge!(query_property.name => query_property.default)
127
+ end
128
+ end
129
+
130
+ def validate_selection_attributes
131
+ select_attributes.each do |attr|
132
+ available_selections && available_selections.valid?(attr)
133
+ end
134
+ end
135
+
136
+ def validate_conditions
137
+ query_properties = self.class.properties[self.class]
138
+ return unless query_properties
139
+
140
+ query_properties.each do |query_property|
141
+ query_property.valid?(conditions)
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ require 'weather_forecasts/client/query/select_by_days_query'
149
+ require 'weather_forecasts/client/query/select_coordinates_by_cities_query'
150
+ require 'weather_forecasts/client/query/select_coordinates_by_zip_query'
151
+ require 'weather_forecasts/client/query/select_corner_coordinates_query'
152
+ require 'weather_forecasts/client/query/select_gridpoint_coordinates_query'
153
+ require 'weather_forecasts/client/query/select_linepoint_coordinates_query'
154
+ require 'weather_forecasts/client/query/select_square_coordinates_query'
155
+ require 'weather_forecasts/client/query/select_query'