lib/fhir_models/fhir.rb in fhir_models-4.3.0 vs lib/fhir_models/fhir.rb in fhir_models-5.0.0
- old
+ new
@@ -1,10 +1,23 @@
require 'nokogiri'
require 'logger'
require 'uri'
module FHIR
+ module ClassMethods
+ def from_contents(contents)
+ doc = Nokogiri::XML(contents)
+ if doc.errors.empty?
+ versioned_fhir_module::Xml.from_xml(contents)
+ else
+ versioned_fhir_module::Json.from_json(contents)
+ end
+ end
+ end
+ include ClassMethods
+ extend ClassMethods
+
def self.logger
@logger || default_logger
end
def self.logger=(logger)
@@ -13,26 +26,17 @@
def self.default_logger
@default_logger ||= Logger.new(ENV['FHIR_LOGGER'] || $stdout)
end
- def self.from_contents(contents)
- doc = Nokogiri::XML(contents)
- if doc.errors.empty?
- FHIR::Xml.from_xml(contents)
- else
- FHIR::Json.from_json(contents)
- end
- end
-
# TODO: pull regexes from metadata
def self.primitive?(datatype:, value:)
# Remaining data types: handle special cases before checking type StructureDefinitions
case datatype.downcase
when 'boolean'
!(value.to_s =~ /\A(true|false)\Z/).nil?
- when 'integer'
+ when 'integer', 'integer64'
!(value.to_s =~ /\A(0|[-+]?[1-9][0-9]*)\Z/).nil?
when 'string', 'markdown'
value.is_a?(String)
when 'decimal'
!(value.to_s =~ /\A([-+]?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?)\Z/).nil?
@@ -73,11 +77,24 @@
value.is_a?(String) && fragment.errors.size.zero?
when 'unsignedint'
!(value.to_s =~ /\A(0|([1-9][0-9]*))\Z/).nil?
when 'positiveint'
!(value.to_s =~ /\A+?[1-9][0-9]*\Z/).nil?
+ when 'canonical', 'url'
+ !(value.to_s =~ /\S*/).nil?
+ when 'uuid'
+ !(value.to_s =~ /urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/).nil?
else
FHIR.logger.warn "Unable to check #{value} for datatype #{datatype}"
false
end
+ end
+
+ # These are needed for the unit tests that call FHIR directly
+ def self.fhir_version_string
+ 'R4'
+ end
+
+ def self.versioned_fhir_module
+ FHIR::R4
end
end