Model classes not as hashes.
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Wed, 22 Jun 2016 21:23:44 +0000 (23:23 +0200)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Wed, 22 Jun 2016 21:24:44 +0000 (23:24 +0200)
models/helpers/nowobject.rb [moved from models/helpers/nowhash.rb with 55% similarity]
models/network.rb
models/range.rb
spec/models/network_spec.rb

similarity index 55%
rename from models/helpers/nowhash.rb
rename to models/helpers/nowobject.rb
index e13d257..39b7a3a 100644 (file)
@@ -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
index 23e2b40..4589556 100644 (file)
@@ -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
index 0a17712..bf60019 100644 (file)
@@ -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
 
index c85a010..bb29130 100644 (file)
@@ -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