From: František Dvořák Date: Wed, 22 Jun 2016 21:23:44 +0000 (+0200) Subject: Model classes not as hashes. X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=aacf6ab587e7e3ab9385a6b58b4b2c5f16ac643c;p=now.git Model classes not as hashes. --- diff --git a/models/helpers/nowhash.rb b/models/helpers/nowobject.rb similarity index 55% rename from models/helpers/nowhash.rb rename to models/helpers/nowobject.rb index e13d257..39b7a3a 100644 --- a/models/helpers/nowhash.rb +++ b/models/helpers/nowobject.rb @@ -1,26 +1,10 @@ module Now # Generic hash class with custom accessors and helper methods - class NowHash < ::Hash - def self.my_accessor(*keys) - keys.each do |key| - define_method(key) do - return nil if !key?(key) - fetch(key) - end - define_method("#{key}=") do |new_value| - if new_value.nil? - delete(key) - else - store(key, new_value) - end - end - end - end + class NowObject def initialize(parameters = {}) - parameters.select! { |_k, v| !v.nil? } - replace(parameters) + parameters.select { |_k, v| !v.nil? }.each_pair { |k, v| instance_variable_set("@#{k}", v) } end # Conversion of the data structure to hash. Arrays and hashes are browsed, the leafs are converted by calling to_hash method or directly copied. @@ -29,8 +13,7 @@ module Now def _to_hash(value) if value.is_a?(Array) value.map { |v| _to_hash(v) } - # beware we're the Hash!!! - elsif value.is_a?(Hash) && !value.is_a?(Now::NowHash) + elsif value.is_a?(Hash) {}.tap do |hash| value.each { |k, v| hash[k] = _to_hash(v) } end @@ -40,6 +23,7 @@ module Now value end end + end end diff --git a/models/network.rb b/models/network.rb index 23e2b40..4589556 100644 --- a/models/network.rb +++ b/models/network.rb @@ -3,41 +3,38 @@ require 'date' module Now # Network object - class Network < NowHash + class Network < NowObject # OpenNebula ID - my_accessor :id + attr_accessor :id # Network title - my_accessor :title + attr_accessor :title # Network summary - my_accessor :description + attr_accessor :description # Owner - my_accessor :user + attr_accessor :user # VLAN ID - my_accessor :vlan + attr_accessor :vlan # IP address range (reader) - def range - return nil if !key?(:range) - fetch(:range) - end + attr_reader :range # IP address range (writer) def range=(new_value) if !valid_range?(new_value) raise NowError.new(500), 'Invalid range type' end - store(:range, new_value) + @range = new_value end # Network state (active, inactive, error) - my_accessor :state + attr_accessor :state # Availability zone (cluster) - my_accessor :zone + attr_accessor :zone def initialize(parameters = {}) if !parameters.key?(:id) @@ -93,12 +90,15 @@ module Now # Returns the object in the form of hash # @return [Hash] Returns the object in the form of hash def to_hash - hash = {} - each_pair do |attr, value| - hash[attr] = _to_hash(value) + h = {} + [:id, :title, :description, :user, :vlan, :range, :state, :zone].each do |k| + v = instance_variable_get "@#{k}" + if !v.nil? + h[k] = _to_hash(v) + end end - return hash + return h end private diff --git a/models/range.rb b/models/range.rb index 0a17712..bf60019 100644 --- a/models/range.rb +++ b/models/range.rb @@ -3,23 +3,21 @@ require 'ipaddress' module Now # Address range - class Range < NowHash + class Range < NowObject # Address range in CIDR notation (reader) - def address - fetch(:address) - end + attr_reader :address # Address range in CIDR notation (writer) def address=(new_value) if !valid_address?(new_value) raise NowError.new(500), 'Internal error: Invalid IP network address' end - store(:address, new_value) + @address = new_value end # Address allocation type (static, dynamic) - my_accessor :allocation + attr_accessor :allocation def initialize(parameters = {}) if !parameters.key?(:address) @@ -69,10 +67,10 @@ module Now # @return [Hash] Returns the object in the form of hash def to_hash h = {} - if key?(:address) + if !address.nil? h[:address] = "#{address}/#{address.prefix}" end - if key?(:allocation) + if !allocation.nil? h[:allocation] = allocation end diff --git a/spec/models/network_spec.rb b/spec/models/network_spec.rb index c85a010..bb29130 100644 --- a/spec/models/network_spec.rb +++ b/spec/models/network_spec.rb @@ -10,7 +10,7 @@ describe Now::Network do end end - context '#no addess range' do + context '#no address range' do let(:network) { Now::Network.new(id: 0) } let(:range) { Now::Range.new(address: IPAddress.parse('fd00::/8')) } let(:range2) { Now::Range.new(address: IPAddress.parse('fd00::/8')) } @@ -38,7 +38,7 @@ describe Now::Network do it 'is valid' do expect(network.valid?).to be true end - it 'still valid with addess range' do + it 'still valid with address range' do network.range = range expect(network.valid?).to be true end