Class: PeakFlowUtils::ModelInspector

Inherits:
Object
  • Object
show all
Defined in:
app/services/peak_flow_utils/model_inspector.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clazz) ⇒ ModelInspector

Returns a new instance of ModelInspector.



24
25
26
# File 'app/services/peak_flow_utils/model_inspector.rb', line 24

def initialize(clazz)
  @clazz = clazz
end

Instance Attribute Details

#clazzObject (readonly)

Returns the value of attribute clazz.



2
3
4
# File 'app/services/peak_flow_utils/model_inspector.rb', line 2

def clazz
  @clazz
end

Class Method Details

.enginesObject



120
121
122
# File 'app/services/peak_flow_utils/model_inspector.rb', line 120

def self.engines
  ::Rails::Engine.subclasses.map(&:instance)
end

.find_subclasses(clazz, &blk) ⇒ Object



95
96
97
98
99
100
101
102
103
104
# File 'app/services/peak_flow_utils/model_inspector.rb', line 95

def self.find_subclasses(clazz, &blk)
  return if @scanned[clazz.name]

  @scanned[clazz.name] = true

  clazz.subclasses.each do |subclass|
    blk.call ::PeakFlowUtils::ModelInspector.new(subclass)
    find_subclasses(subclass, &blk)
  end
end

.load_modelsObject

Preloads all models for Rails app and all engines (if they aren’t loaded, then they cant be inspected).



107
108
109
110
111
112
113
114
115
116
117
118
# File 'app/services/peak_flow_utils/model_inspector.rb', line 107

def self.load_models
  return false if PeakFlowUtils::ModelInspector.models_loaded

  PeakFlowUtils::ModelInspector.models_loaded = true

  load_models_for(Rails.root)
  engines.each do |engine|
    load_models_for(engine.root)
  end

  true
end

.load_models_for(root) ⇒ Object

Loads models for the given app-directory (Rails-root or engine).



125
126
127
128
129
130
131
132
133
# File 'app/services/peak_flow_utils/model_inspector.rb', line 125

def self.load_models_for(root)
  Dir.glob("#{root}/app/models/**/*.rb").sort.each do |model_path|
    require model_path
  rescue StandardError => e
    warn "Could not load model in #{model_path}"
    warn e.inspect
    warn e.backtrace
  end
end

.model_classesObject

Yields a model-inspector for each model found in the application.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'app/services/peak_flow_utils/model_inspector.rb', line 7

def self.model_classes
  # Make sure all models are loaded.
  load_models

  @scanned = {}
  @yielded = {}
  @skip = ["ActiveRecord::SchemaMigration"]

  ArrayEnumerator.new do |yielder|
    find_subclasses(ActiveRecord::Base) do |model_inspector|
      next if !model_inspector.clazz.name || @skip.include?(model_inspector.clazz.name)

      yielder << model_inspector
    end
  end
end

Instance Method Details

#attribute_key(attribute_name) ⇒ Object



83
84
85
# File 'app/services/peak_flow_utils/model_inspector.rb', line 83

def attribute_key(attribute_name)
  "activerecord.attributes.#{snake_name}.#{attribute_name}"
end

#attributesObject



28
29
30
31
32
33
34
# File 'app/services/peak_flow_utils/model_inspector.rb', line 28

def attributes
  ArrayEnumerator.new do |yielder|
    @clazz.attribute_names.each do |attribute_name|
      yielder << PeakFlowUtils::AttributeService.new(self, attribute_name)
    end
  end
end

#class_keyObject



64
65
66
# File 'app/services/peak_flow_utils/model_inspector.rb', line 64

def class_key
  "activerecord.models.#{snake_name}"
end

#class_key_oneObject



68
69
70
# File 'app/services/peak_flow_utils/model_inspector.rb', line 68

def class_key_one
  "#{class_key}.one"
end

#class_key_otherObject



72
73
74
# File 'app/services/peak_flow_utils/model_inspector.rb', line 72

def class_key_other
  "#{class_key}.other"
end

#globalize_attributesObject



52
53
54
55
56
57
58
# File 'app/services/peak_flow_utils/model_inspector.rb', line 52

def globalize_attributes
  return if !::Kernel.const_defined?("Globalize") || !@clazz.respond_to?(:translated_attribute_names)

  @clazz.translated_attribute_names.each do |attribute|
    yield attribute.to_s
  end
end

#inspectObject



91
92
93
# File 'app/services/peak_flow_utils/model_inspector.rb', line 91

def inspect
  to_s
end

#money_attributesObject



44
45
46
47
48
49
50
# File 'app/services/peak_flow_utils/model_inspector.rb', line 44

def money_attributes
  return if !::Kernel.const_defined?("Money") || !@clazz.respond_to?(:monetized_attributes)

  @clazz.monetized_attributes.each do |attribute|
    yield attribute[0].to_s
  end
end

#paperclip_attachmentsObject



36
37
38
39
40
41
42
# File 'app/services/peak_flow_utils/model_inspector.rb', line 36

def paperclip_attachments
  return unless ::Kernel.const_defined?("Paperclip")

  Paperclip::AttachmentRegistry.names_for(@clazz).each do |name|
    yield name
  end
end

#relationshipsObject

TODO: Maybe this should yield a ModelInspector::Relationship instead?



77
78
79
80
81
# File 'app/services/peak_flow_utils/model_inspector.rb', line 77

def relationships
  @clazz.reflections.each do |key, reflection|
    yield key, reflection
  end
end

#snake_nameObject



60
61
62
# File 'app/services/peak_flow_utils/model_inspector.rb', line 60

def snake_name
  clazz.name.gsub("::", "/").split("/").map(&:underscore).join("/")
end

#to_sObject



87
88
89
# File 'app/services/peak_flow_utils/model_inspector.rb', line 87

def to_s
  "<PeakFlowUtils::ModelInspector class-name: \"#{@clazz.name}\">"
end