Skip to content

Commit 6d49dff

Browse files
authored
Merge pull request #8 from mgm702/develop
Develop -> Main
2 parents 18cec8b + 0a3ca09 commit 6d49dff

4 files changed

Lines changed: 290 additions & 101 deletions

File tree

lib/cdss/client.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Client
44
base_uri Cdss.config.base_url
55

66
include AdminCalls
7+
include Analysis
78
include Climate
89
include GroundWater
910
include Structures

lib/cdss/models/analysis.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ def attribute_list
1919
end
2020
end
2121

22-
def initialize(**attrs)
23-
attrs[:metadata] ||= {}
24-
22+
def initialize(**kwargs)
23+
kwargs[:metadata] ||= {}
2524
self.class.attribute_list.each do |attr|
26-
instance_variable_set(:"@#{attr}", attrs[attr]) if attrs.key?(attr)
25+
instance_variable_set(:"@#{attr}", kwargs[attr]) if kwargs.key?(attr)
2726
end
2827
end
2928
end
Lines changed: 106 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,119 @@
1+
require_relative '../models/analysis'
2+
13
module Cdss
2-
module Parsers
3-
# Parses analysis-related data from CDSS API responses into appropriate model objects.
4-
# Handles call analyses, source routes, and route analyses.
5-
module AnalysisParser
6-
extend BaseParser
4+
module Parsers
5+
module AnalysisParser
6+
class << self
7+
def parse_call_analyses(response, type:)
8+
parse_collection(response) do |data|
9+
# Cdss::Models::CallAnalysis.new(build_call_analysis_params(data, type))
10+
params = build_call_analysis_params(data, type)
11+
Cdss::Models::CallAnalysis.new(**params)
12+
end
13+
end
14+
15+
def parse_source_routes(response)
16+
parse_collection(response) do |data|
17+
params = build_source_route_params(data)
18+
Cdss::Models::SourceRoute.new(**params)
19+
end
20+
end
21+
22+
def parse_route_analyses(response)
23+
parse_collection(response) do |data|
24+
Cdss::Models::RouteAnalysis.new(build_route_analysis_params(data))
25+
end
26+
end
727

8-
class << self
9-
# Parses call analysis data from API response.
10-
#
11-
# @param response [Hash] The API response containing call analysis data
12-
# @param type [Symbol] The type of analysis (:wdid or :gnis)
13-
# @return [Array<Cdss::Models::CallAnalysis>] Array of call analysis objects
14-
def parse_call_analyses(response, type:)
15-
parse_collection(response) { |data| build_analysis(Cdss::Models::CallAnalysis, data, type) }
16-
end
28+
private
1729

18-
# Parses source route data from API response.
19-
#
20-
# @param response [Hash] The API response containing source route data
21-
# @return [Array<Cdss::Models::SourceRoute>] Array of source route objects
22-
def parse_source_routes(response)
23-
parse_collection(response) { |data| build_analysis(Cdss::Models::SourceRoute, data) }
24-
end
30+
def parse_collection(response)
31+
return [] unless response && response['ResultList']
32+
response['ResultList'].map { |data| yield(data) }
33+
end
2534

26-
# Parses route analysis data from API response.
27-
#
28-
# @param response [Hash] The API response containing route analysis data
29-
# @return [Array<Cdss::Models::RouteAnalysis>] Array of route analysis objects
30-
def parse_route_analyses(response)
31-
parse_collection(response) { |data| build_analysis(Cdss::Models::RouteAnalysis, data) }
32-
end
35+
def parse_timestamp(value)
36+
return nil if value.nil? || value.to_s.empty?
37+
DateTime.parse(value)
38+
rescue
39+
nil
40+
end
3341

34-
private
42+
def safe_float(value)
43+
Float(value) rescue nil
44+
end
3545

36-
def build_analysis(klass, data, type = nil)
37-
params = case klass
38-
when Cdss::Models::CallAnalysis
39-
build_call_analysis_params(data, type)
40-
when Cdss::Models::SourceRoute
41-
build_source_route_params(data)
42-
when Cdss::Models::RouteAnalysis
43-
build_route_analysis_params(data)
44-
end
46+
def safe_integer(value)
47+
Integer(value) rescue nil
48+
end
4549

46-
klass.new(**params)
47-
end
50+
def build_call_analysis_params(data, type)
51+
return {} unless data
4852

49-
def build_call_analysis_params(data, type)
50-
params = {
51-
analysis_date: parse_timestamp(data['analysisDate']),
52-
admin_number: safe_float(data['adminNo']),
53-
percent_time_out_of_priority: safe_float(data['percentTimeOutOfPriority']),
54-
downstream_call_wdid: data['downstreamCallWdid'],
55-
downstream_call_right: data['downstreamCallRight'],
56-
downstream_call_stream_mile: safe_float(data['downstreamCallStreamMile']),
57-
downstream_call_admin_number: safe_float(data['downstreamCallAdminNo']),
58-
downstream_call_decreed_amount: safe_float(data['downstreamCallDecreedAmount']),
59-
downstream_call_decreed_unit: data['downstreamCallDecreedUnit'],
60-
downstream_call_appropriation_date: parse_timestamp(data['downstreamCallAppropriationDate']),
61-
downstream_call_status: data['downstreamCallStatus'],
62-
modified: parse_timestamp(data['modified']),
63-
metadata: {}
64-
}
53+
{
54+
analysis_date: parse_timestamp(data['analysisDate']),
55+
wdid: data['analysisWdid'],
56+
admin_number: safe_float(data['analysisWrAdminNo']),
57+
percent_time_out_of_priority: safe_float(data['analysisOutOfPriorityPercentOfDay']),
58+
downstream_call_wdid: data['locationWdid'],
59+
downstream_call_right: data['priorityStructure'],
60+
downstream_call_stream_mile: safe_float(data['locationWdidStreamMile']),
61+
downstream_call_admin_number: safe_float(data['priorityAdminNo']),
62+
downstream_call_decreed_amount: nil,
63+
downstream_call_decreed_unit: nil,
64+
downstream_call_appropriation_date: parse_timestamp(data['priorityDate']),
65+
downstream_call_status: data['callType'],
66+
modified: parse_timestamp(data['dateTimeSet']),
67+
metadata: {
68+
division: safe_integer(data['division']),
69+
date_time_released: parse_timestamp(data['dateTimeReleased']),
70+
water_source_name: data['waterSourceName'],
71+
location_structure: data['locationStructure'],
72+
priority_order_no: safe_integer(data['priorityOrderNo']),
73+
priority_no: data['priorityNo'],
74+
bounding_wdid: data['boundingWdid'],
75+
bounding_structure_name: data['boundingStructureName'],
76+
set_comments: data['setComments'],
77+
release_comment: data['releaseComment']
78+
}
79+
}.compact
80+
end
6581

66-
case type
67-
when :wdid
68-
params[:wdid] = data['wdid']
69-
when :gnis
70-
params[:gnis_id] = data['gnisId']
71-
params[:stream_mile] = safe_float(data['streamMile'])
72-
end
82+
def build_source_route_params(data)
83+
return {} unless data
7384

74-
params
75-
end
85+
{
86+
gnis_id: data['gnisId'],
87+
gnis_name: data['gnisName'],
88+
stream_name: data['streamName'],
89+
division: safe_integer(data['division']),
90+
water_district: safe_integer(data['waterDistrict']),
91+
county: data['county'],
92+
start_mile: safe_float(data['startMile']),
93+
end_mile: safe_float(data['endMile']),
94+
total_length: safe_float(data['totalLength']),
95+
modified: parse_timestamp(data['modified']),
96+
metadata: {}
97+
}.compact
98+
end
7699

77-
def build_source_route_params(data)
78-
{
79-
gnis_id: data['gnisId'],
80-
gnis_name: data['gnisName'],
81-
stream_name: data['streamName'],
82-
division: safe_integer(data['division']),
83-
water_district: safe_integer(data['waterDistrict']),
84-
county: data['county'],
85-
start_mile: safe_float(data['startMile']),
86-
end_mile: safe_float(data['endMile']),
87-
total_length: safe_float(data['totalLength']),
88-
modified: parse_timestamp(data['modified']),
89-
metadata: {}
90-
}
91-
end
100+
def build_route_analysis_params(data)
101+
return {} unless data
92102

93-
def build_route_analysis_params(data)
94-
{
95-
wdid: data['wdid'],
96-
structure_name: data['structureName'],
97-
stream_mile: safe_float(data['streamMile']),
98-
structure_type: data['structureType'],
99-
decreed_amount: safe_float(data['decreedAmount']),
100-
decreed_unit: data['decreedUnit'],
101-
appropriation_date: parse_timestamp(data['appropriationDate']),
102-
admin_number: safe_float(data['adminNo']),
103-
modified: parse_timestamp(data['modified']),
104-
metadata: {}
105-
}
106-
end
107-
end
108-
end
109-
end
103+
{
104+
wdid: data['wdid'],
105+
structure_name: data['structureName'],
106+
stream_mile: safe_float(data['streamMile']),
107+
structure_type: data['structureType'],
108+
decreed_amount: safe_float(data['decreedAmount']),
109+
decreed_unit: data['decreedUnit'],
110+
appropriation_date: parse_timestamp(data['appropriationDate']),
111+
admin_number: safe_float(data['adminNo']),
112+
modified: parse_timestamp(data['modified']),
113+
metadata: {}
114+
}.compact
115+
end
116+
end
117+
end
118+
end
110119
end

0 commit comments

Comments
 (0)