Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions lib/cdss/models/analysis.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,13 @@ class CallAnalysis < Analysis
class SourceRoute < Analysis
attributes :gnis_id,
:gnis_name,
:stream_name,
:division,
:water_district,
:county,
:start_mile,
:end_mile,
:total_length,
:modified,
:stream_length,
:tributary_to_level,
:tributary_to_gnis_id,
:tributary_gnis_name,
:tributary_to_stream_mile,
:metadata
end

Expand Down
27 changes: 25 additions & 2 deletions lib/cdss/models/reference_table.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,48 @@ class ReferenceTable
description
division
water_district
water_district_name
division_name
county
management_district
management_district_name
designated_basin
designated_basin_name
parameter
flag
flag_column
divrectype
div_rec_type_long
additional_info
data_source
publication_name
action_name
action_descr
ciu_code
ciu_code_long
obs_code
obs_code_long
obs_descr
start_iyr
end_iyr
not_used_code
not_used_code_descr
submission_type
metadata
]

attr_accessor(*ATTRIBUTES)

def initialize(**attrs)
attrs[:metadata] ||= {}

ATTRIBUTES.each do |attr|
instance_variable_set(:"@#{attr}", attrs[attr]) if attrs.key?(attr)
instance_variable_set(:"@#{attr}", attrs[attr]) if attrs.key?(attr) && !blank_or_nil?(attrs[attr])
end
end

def blank_or_nil?(value)
value.nil? || value.to_s.strip.empty?
end
end
end
end
20 changes: 9 additions & 11 deletions lib/cdss/models/structure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,17 @@ def initialize(**attrs)

class DiversionRecord < Structure
ATTRIBUTES = %i[
meas_date
wdid
water_class_num
wc_identifier
meas_interval
meas_count
amt_cfs
amt_af
data_source
data_meas_date
data_value
meas_units
obs_code
approval_status
modified
div_type
wc_identifier
stage
volume
start_date
end_date
metadata
]

Expand All @@ -64,7 +63,6 @@ class DiversionRecord < Structure
def initialize(**attrs)
super
attrs[:metadata] ||= {}

ATTRIBUTES.each do |attr|
instance_variable_set(:"@#{attr}", attrs[attr]) if attrs.key?(attr)
end
Expand Down
15 changes: 7 additions & 8 deletions lib/cdss/parsers/analysis_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ module AnalysisParser
class << self
def parse_call_analyses(response, type:)
parse_collection(response) do |data|
# Cdss::Models::CallAnalysis.new(build_call_analysis_params(data, type))
params = build_call_analysis_params(data, type)
Cdss::Models::CallAnalysis.new(**params)
end
Expand All @@ -21,7 +20,8 @@ def parse_source_routes(response)

def parse_route_analyses(response)
parse_collection(response) do |data|
Cdss::Models::RouteAnalysis.new(build_route_analysis_params(data))
params = build_route_analysis_params(data)
Cdss::Models::RouteAnalysis.new(**params)
end
end

Expand Down Expand Up @@ -85,14 +85,13 @@ def build_source_route_params(data)
{
gnis_id: data['gnisId'],
gnis_name: data['gnisName'],
stream_name: data['streamName'],
division: safe_integer(data['division']),
water_district: safe_integer(data['waterDistrict']),
county: data['county'],
start_mile: safe_float(data['startMile']),
end_mile: safe_float(data['endMile']),
total_length: safe_float(data['totalLength']),
modified: parse_timestamp(data['modified']),
stream_length: safe_float(data['streamLength']),
tributary_to_level: safe_integer(data['tributaryToLevel']),
tributary_to_gnis_id: data['TributaryToGnisId'],
tributary_gnis_name: data['tribGnisName'],
tributary_to_stream_mile: safe_float(data['tributaryToStreamMile']),
metadata: {}
}.compact
end
Expand Down
20 changes: 20 additions & 0 deletions lib/cdss/parsers/reference_tables_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,33 @@ def build_reference(data)
description: data['description'],
division: safe_integer(data['division']),
water_district: safe_integer(data['waterDistrict']),
water_district_name: data['waterDistrictName'],
division_name: data['divisionName'],
county: data['county'],
management_district: data['managementDistrict'],
management_district_name: data['managementDistrictName'],
designated_basin: data['designatedBasin'],
designated_basin_name: data['designatedBasinName'],
parameter: data['parameter'] || data['measType'],
flag: data['flag'],
flag_column: data['flagColumn'],
divrectype: data['divRecType'],
div_rec_type_long: data['divRecTypeLong'],
additional_info: data['additionalInfo'],
data_source: data['dataSource'],
publication_name: data['publicationName'],
action_name: data['actionName'],
action_descr: data['actionDescr'],
ciu_code: data['ciuCode'],
ciu_code_long: data['ciuCodeLong'],
obs_code: data['obsCode'],
obs_code_long: data['obsCodeLong'],
obs_descr: data['obsDescr'],
start_iyr: safe_integer(data['startIyr']),
end_iyr: safe_integer(data['endIyr']),
not_used_code: data['notUsedCode'],
not_used_code_descr: data['notUsedCodeDescr'],
submission_type: data['submissionType'],
metadata: {}
)
end
Expand Down
51 changes: 23 additions & 28 deletions lib/cdss/parsers/structures_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,38 +43,20 @@ def build_structure(data)
end

def build_diversion_record(data, type)
params = {
Models::DiversionRecord.new(
wdid: data['wdid'],
div_type: data['divrectype'],
water_class_num: safe_integer(data['waterClassNum']),
wc_identifier: data['wcIdentifier'],
data_source: data['dataSource'],
meas_interval: data['measInterval'],
meas_count: safe_integer(data['measCount']),
data_meas_date: parse_data_meas_date(data['dataMeasDate'], type),
data_value: safe_float(data['dataValue']),
meas_units: data['measUnits'],
obs_code: data['obsCode'],
approval_status: data['approvalStatus'],
modified: parse_timestamp(data['modified']),
metadata: {}
}

case type
when :day
params.merge!(
meas_date: parse_timestamp(data['dataMeasDate']),
amt_cfs: safe_float(data['amtCfs']),
amt_af: safe_float(data['amtAf'])
)
when :month, :year
params.merge!(
start_date: parse_timestamp(data['startDate']),
end_date: parse_timestamp(data['endDate']),
amt_af: safe_float(data['amtAf']),
meas_count: safe_integer(data['measCount'])
)
when :stage_volume
params.merge!(
meas_date: parse_timestamp(data['dataMeasDate']),
stage: safe_float(data['stage']),
volume: safe_float(data['volume'])
)
end

Models::DiversionRecord.new(**params)
)
end

def build_water_class(data)
Expand All @@ -93,6 +75,19 @@ def build_water_class(data)
metadata: {}
)
end

def parse_data_meas_date(date_str, type)
return nil if date_str.nil?

case type
when :year
parse_timestamp("#{date_str}-01-01 00:00:00")
when :month
parse_timestamp("#{date_str}-01 00:00:00")
else
parse_timestamp(date_str)
end
end
end
end
end
Expand Down
5 changes: 2 additions & 3 deletions lib/cdss/reference_tables.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,10 @@ module ReferenceTables
# managementdistricts, telemetryparams, climateparams, divrectypes, flags
# @return [Array<Cdss::Models::ReferenceTable>] Array of reference table records.
# @raise [ArgumentError] If an invalid table name is provided.
def get_reference_table(table_name)
def get_reference_table(table_name, **params)
validate_table_name!(table_name)

method_name = "fetch_#{table_name}_reference"
send(method_name)
send(method_name, **params)
end

private
Expand Down
29 changes: 17 additions & 12 deletions test/cdss/test_analysis.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def test_get_call_analysis_wdid_with_batching
def test_get_call_analysis_gnisid
VCR.use_cassette('cdss_get_call_analysis_gnisid') do
analyses = @client.get_call_analysis_gnisid(
gnis_id: '123456',
gnis_id: '00010001',
admin_no: '12941.00000',
stream_mile: 9.76,
start_date: Date.parse('2023-01-01'),
Expand All @@ -60,16 +60,20 @@ def test_get_call_analysis_gnisid

analysis = analyses.first
assert_kind_of Cdss::Models::CallAnalysis, analysis
assert_equal '123456', analysis.gnis_id
assert_kind_of Float, analysis.stream_mile
assert_kind_of DateTime, analysis.analysis_date
assert_kind_of Float, analysis.admin_number
assert_kind_of Float, analysis.percent_time_out_of_priority
assert_kind_of Float, analysis.downstream_call_stream_mile
assert_kind_of Float, analysis.downstream_call_admin_number

assert_equal 12941.0, analysis.admin_number
end
end

def test_get_call_analysis_gnisid_with_batching
VCR.use_cassette('cdss_get_call_analysis_gnisid_batch') do
analyses = @client.get_call_analysis_gnisid(
gnis_id: '123456',
gnis_id: '00010001',
admin_no: '12941.00000',
stream_mile: 9.76,
start_date: Date.parse('2022-01-01'),
Expand All @@ -90,24 +94,25 @@ def test_get_call_analysis_gnisid_with_batching
def test_get_source_route_framework
VCR.use_cassette('cdss_get_source_route_framework') do
routes = @client.get_source_route_framework(division: 1)

assert_kind_of Array, routes
refute_empty routes

route = routes.first
assert_kind_of Cdss::Models::SourceRoute, route
assert_kind_of Integer, route.division
assert_kind_of String, route.stream_name
assert_kind_of Float, route.start_mile unless route.start_mile.nil?
assert_kind_of Float, route.end_mile unless route.end_mile.nil?
assert_kind_of Integer, route.water_district
assert_kind_of String, route.gnis_name
assert_kind_of Float, route.stream_length unless route.stream_length.nil?
assert_kind_of Integer, route.tributary_to_level unless route.tributary_to_level.nil?
assert_kind_of Float, route.tributary_to_stream_mile unless route.tributary_to_stream_mile.nil?
end
end

def test_get_source_route_framework_with_filters
VCR.use_cassette('cdss_get_source_route_framework_filtered') do
routes = @client.get_source_route_framework(
division: 1,
gnis_name: 'SOUTH BOULDER CREEK',
gnis_name: 'South Boulder Creek',
water_district: 6
)

Expand All @@ -116,17 +121,17 @@ def test_get_source_route_framework_with_filters

route = routes.first
assert_equal 1, route.division
assert_equal 'SOUTH BOULDER CREEK', route.gnis_name
assert_equal 'South Boulder Creek', route.gnis_name
assert_equal 6, route.water_district
end
end

def test_get_source_route_analysis
VCR.use_cassette('cdss_get_source_route_analysis') do
analyses = @client.get_source_route_analysis(
lt_gnis_id: '123456',
lt_gnis_id: '00180489',
lt_stream_mile: 0.0,
ut_gnis_id: '789012',
ut_gnis_id: '00010001',
ut_stream_mile: 10.5
)

Expand Down
Loading
Loading