Class: PrefabC::AbstractResource

Inherits:
Object
  • Object
show all
Defined in:
lib/prefabc/abstract_resource.rb

Direct Known Subclasses

Account, Book, Entity, Transaction

Constant Summary collapse

KEYS_TO_PARSE_AS_DATETIME =
Set.new(%i[date])
IMMUTABLE_PARAMETERS =
Set.new(%i[account amount book currency date entity])

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw_params = {}) ⇒ AbstractResource

Returns a new instance of AbstractResource.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/prefabc/abstract_resource.rb', line 29

def initialize(raw_params = {})
  @dirty_params = {}
  raise 'Argument is expected to be a Hash.' unless raw_params.is_a?(Hash)
  @params = AbstractResource.rubify_raw_params(raw_params)

  @params.each do |key, value|
    unless methods.include?(key.to_sym)
      self.class.class_eval { attr_reader key.to_sym }
      self.class.send(:define_method, "#{key}=") do |args|
        resetting_immutable = IMMUTABLE_PARAMETERS.include?(key) &&
                              instance_variable_get("@#{key}")
        raise "`#{key}` is an immutable property." if resetting_immutable
        @dirty_params[key] = args
        instance_variable_set("@#{key}", args)
      end
    end
    if KEYS_TO_PARSE_AS_DATETIME.include?(key)
      instance_variable_set("@#{key}", Time.parse(value))
    else
      instance_variable_set("@#{key}", value)
    end
  end
end

Class Method Details

.collection_nameObject



6
7
8
# File 'lib/prefabc/abstract_resource.rb', line 6

def self.collection_name
  "#{resource_name}s"
end

.hierarchyObject



14
15
16
# File 'lib/prefabc/abstract_resource.rb', line 14

def self.hierarchy
  [Entity, Book, Account, Transaction]
end

.resource_nameObject



10
11
12
# File 'lib/prefabc/abstract_resource.rb', line 10

def self.resource_name
  name.split('::').last.downcase
end

.rubify_raw_params(raw_params) ⇒ Object



22
23
24
25
26
27
# File 'lib/prefabc/abstract_resource.rb', line 22

def self.rubify_raw_params(raw_params)
  tags = raw_params[:tags]
  params = raw_params.to_snake_keys
  params[:tags] = tags if tags
  params
end

.subresourceObject



18
19
20
# File 'lib/prefabc/abstract_resource.rb', line 18

def self.subresource
  raise 'This should be implemented in the subclass.'
end

Instance Method Details

#collection_pathObject



61
62
63
# File 'lib/prefabc/abstract_resource.rb', line 61

def collection_path
  "#{parent_path}/#{self.class.collection_name}"
end

#parent_pathObject



65
66
67
68
69
70
71
72
73
# File 'lib/prefabc/abstract_resource.rb', line 65

def parent_path
  @parent_path ||= begin
    hierarchy = self.class.hierarchy
    parents = hierarchy[0...hierarchy.index(self.class)]
    parents.inject('') do |partial, klass|
      "#{partial}/#{klass.collection_name}/#{send(klass.resource_name)}"
    end
  end
end

#resource_pathObject



57
58
59
# File 'lib/prefabc/abstract_resource.rb', line 57

def resource_path
  "#{collection_path}/#{id}"
end

#subresource_collection_pathObject



53
54
55
# File 'lib/prefabc/abstract_resource.rb', line 53

def subresource_collection_path
  "#{resource_path}/#{self.class.subresource.collection_name}"
end