brick 1.0.58 → 1.0.59

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 508d41fa8b75089e0467ece56ab53fc78b651f3951eabe62d108a62fa8b0f35e
4
- data.tar.gz: dcd419560d850fb2014aab3076a6a80f5a555320ac2c2183e3381a916d94dbc8
3
+ metadata.gz: db41c2288f8bba8f3cb9c5d2d87bacd4806d1f2401ca9709f85de1886b0db377
4
+ data.tar.gz: 42b0a7b285a3328ce922daa442e15bf994a382ad0bfc5ed8fe4370ae6b779fbb
5
5
  SHA512:
6
- metadata.gz: 49c90c7fbb1845e151f91b9df7f3b639d587e6239dae5e7f31306807a2b4dc7ac83436d78d46839accfea7c614fd2a94f2460443ea3daae424d280fae17cac77
7
- data.tar.gz: 7dd02fd9ab902cfe6359b6be95101ec3a89c47d8b7bc71692ab4537f5ffeb3a24a4ee73063fc10b3d4197ce59fd5c94380f7534f66647d8c03dd512c6ef0c334
6
+ metadata.gz: b8baacad02f8ba5c0d9bfe11182d8297c817ba46bef250e172f55a0ff949591abcadda790aecc2614515468a4da468415a8a0e62fd2a60232177dcd3cd63ca03
7
+ data.tar.gz: e84d2573ec0f95b01dfebf681cec409ec66a1e6052abbb59ebd3130728cad71015c51087f484c55e8e30f3b9a3736d3d9262b7d8cdebf23e5ab702035c0dcbfa
data/lib/brick/config.rb CHANGED
@@ -230,6 +230,11 @@ module Brick
230
230
  @mutex.synchronize { @not_nullables = columns }
231
231
  end
232
232
 
233
+ # Add status page showing all resources and what files have been built out for them
234
+ def add_status
235
+ true
236
+ end
237
+
233
238
  # Add a special page to show references to non-existent records ("orphans")
234
239
  def add_orphans
235
240
  true
@@ -646,7 +646,7 @@ Module.class_exec do
646
646
  full_class_name << "::#{self.name}" unless self == Object
647
647
  full_class_name << "::#{plural_class_name.underscore.singularize.camelize}"
648
648
  if (plural_class_name == 'BrickSwagger' ||
649
- (::Brick.config.add_orphans && plural_class_name == 'BrickGem') ||
649
+ ((::Brick.config.add_status || ::Brick.config.add_orphans) && plural_class_name == 'BrickGem') ||
650
650
  model = self.const_get(full_class_name))
651
651
  # if it's a controller and no match or a model doesn't really use the same table name, eager load all models and try to find a model class of the right name.
652
652
  Object.send(:build_controller, self, class_name, plural_class_name, model, relations)
@@ -667,45 +667,11 @@ Module.class_exec do
667
667
  elsif ::Brick.enable_models?
668
668
  # Custom inheritable Brick base model?
669
669
  class_name = (inheritable_name = class_name)[5..-1] if class_name.start_with?('Brick')
670
- # See if a file is there in the same way that ActiveSupport::Dependencies#load_missing_constant
671
- # checks for it in ~/.rvm/gems/ruby-2.7.5/gems/activesupport-5.2.6.2/lib/active_support/dependencies.rb
672
-
673
- if (base_model = ::Brick.config.sti_namespace_prefixes&.fetch("::#{base_module.name}::", nil)&.constantize) || # Are we part of an auto-STI namespace? ...
674
- base_module != Object # ... or otherwise already in some namespace?
675
- schema_name = [(singular_schema_name = name.underscore),
676
- (schema_name = singular_schema_name.pluralize),
677
- name,
678
- name.pluralize].find { |s| Brick.db_schemas.include?(s) }
679
- end
680
- plural_class_name = ActiveSupport::Inflector.pluralize(model_name = class_name)
681
- # If it's namespaced then we turn the first part into what would be a schema name
682
- singular_table_name = ActiveSupport::Inflector.underscore(model_name).gsub('/', '.')
683
-
684
- if base_model
685
- schema_name = name.underscore # For the auto-STI namespace models
686
- table_name = base_model.table_name
687
- Object.send(:build_model, base_module, inheritable_name, model_name, singular_table_name, table_name, relations, table_name)
688
- else
689
- # Adjust for STI if we know of a base model for the requested model name
690
- # %%% Does not yet work with namespaced model names. Perhaps prefix with plural_class_name when doing the lookups here.
691
- table_name = if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil) || ::Brick.existing_stis[model_name]&.constantize)
692
- base_model.table_name
693
- else
694
- ActiveSupport::Inflector.pluralize(singular_table_name)
695
- end
696
- if ::Brick.apartment_multitenant &&
697
- Apartment.excluded_models.include?(table_name.singularize.camelize)
698
- schema_name = Apartment.default_schema
699
- end
700
- # Maybe, just maybe there's a database table that will satisfy this need
701
- if (matching = [table_name, singular_table_name, plural_class_name, model_name].find { |m| relations.key?(schema_name ? "#{schema_name}.#{m}" : m) })
702
- Object.send(:build_model, schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
703
- end
704
- end
670
+ Object.send(:build_model, relations, base_module, name, class_name, inheritable_name)
705
671
  end
706
672
  if result
707
673
  built_class, code = result
708
- puts "\n#{code}"
674
+ puts "\n#{code}\n"
709
675
  built_class
710
676
  elsif ::Brick.config.sti_namespace_prefixes&.key?("::#{class_name}") && !schema_name
711
677
  # module_prefixes = type_name.split('::')
@@ -727,7 +693,42 @@ class Object
727
693
 
728
694
  private
729
695
 
730
- def build_model(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
696
+ def build_model(relations, base_module, base_name, class_name, inheritable_name = nil)
697
+ if (base_model = ::Brick.config.sti_namespace_prefixes&.fetch("::#{base_module.name}::", nil)&.constantize) || # Are we part of an auto-STI namespace? ...
698
+ base_module != Object # ... or otherwise already in some namespace?
699
+ schema_name = [(singular_schema_name = base_name.underscore),
700
+ (schema_name = singular_schema_name.pluralize),
701
+ base_name,
702
+ base_name.pluralize].find { |s| Brick.db_schemas.include?(s) }
703
+ end
704
+ plural_class_name = ActiveSupport::Inflector.pluralize(model_name = class_name)
705
+ # If it's namespaced then we turn the first part into what would be a schema name
706
+ singular_table_name = ActiveSupport::Inflector.underscore(model_name).gsub('/', '.')
707
+
708
+ if base_model
709
+ schema_name = base_name.underscore # For the auto-STI namespace models
710
+ table_name = base_model.table_name
711
+ build_model_worker(base_module, inheritable_name, model_name, singular_table_name, table_name, relations, table_name)
712
+ else
713
+ # Adjust for STI if we know of a base model for the requested model name
714
+ # %%% Does not yet work with namespaced model names. Perhaps prefix with plural_class_name when doing the lookups here.
715
+ table_name = if (base_model = ::Brick.sti_models[model_name]&.fetch(:base, nil) || ::Brick.existing_stis[model_name]&.constantize)
716
+ base_model.table_name
717
+ else
718
+ ActiveSupport::Inflector.pluralize(singular_table_name)
719
+ end
720
+ if ::Brick.apartment_multitenant &&
721
+ Apartment.excluded_models.include?(table_name.singularize.camelize)
722
+ schema_name = Apartment.default_schema
723
+ end
724
+ # Maybe, just maybe there's a database table that will satisfy this need
725
+ if (matching = [table_name, singular_table_name, plural_class_name, model_name].find { |m| relations.key?(schema_name ? "#{schema_name}.#{m}" : m) })
726
+ build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
727
+ end
728
+ end
729
+ end
730
+
731
+ def build_model_worker(schema_name, inheritable_name, model_name, singular_table_name, table_name, relations, matching)
731
732
  if ::Brick.apartment_multitenant &&
732
733
  schema_name == Apartment.default_schema
733
734
  relation = relations["#{schema_name}.#{matching}"]
@@ -893,7 +894,7 @@ class Object
893
894
  end
894
895
  end
895
896
  end
896
- code << "end # model #{full_name}\n\n"
897
+ code << "end # model #{full_name}\n"
897
898
  [built_model, code]
898
899
  end
899
900
 
@@ -1002,6 +1003,9 @@ class Object
1002
1003
  # Brick-specific pages
1003
1004
  case plural_class_name
1004
1005
  when 'BrickGem'
1006
+ self.define_method :status do
1007
+ instance_variable_set(:@resources, ::Brick.get_status_of_resources)
1008
+ end
1005
1009
  self.define_method :orphans do
1006
1010
  instance_variable_set(:@orphans, ::Brick.find_orphans(::Brick.set_db_schema(params)))
1007
1011
  end
@@ -1255,7 +1259,7 @@ class Object
1255
1259
  # Get column names for params from relations[model.table_name][:cols].keys
1256
1260
  end
1257
1261
  # end
1258
- code << "end # #{namespace_name}#{class_name}\n\n"
1262
+ code << "end # #{namespace_name}#{class_name}\n"
1259
1263
  end # class definition
1260
1264
  [built_controller, code]
1261
1265
  end
@@ -1680,6 +1684,59 @@ module Brick
1680
1684
  assoc_bt[:inverse] = assoc_hm
1681
1685
  end
1682
1686
 
1687
+ # Identify built out routes, migrations, models,
1688
+ # (and also soon controllers and views!)
1689
+ # for each resource
1690
+ def get_status_of_resources
1691
+ rails_root = ::Rails.root.to_s
1692
+ migrations = if Dir.exist?(mig_path = ActiveRecord::Migrator.migrations_paths.first || "#{rails_root}/db/migrate")
1693
+ Dir["#{mig_path}/**/*.rb"].each_with_object(Hash.new { |h, k| h[k] = [] }) do |v, s|
1694
+ File.read(v).split("\n").each do |line|
1695
+ # For all non-commented lines, look for any that have "create_table", "alter_table", or "drop_table"
1696
+ if !line.lstrip.start_with?('#') &&
1697
+ (idx = (line.index('create_table ') || line.index('create_table('))&.+(13)) ||
1698
+ (idx = (line.index('alter_table ') || line.index('alter_table('))&.+(12)) ||
1699
+ (idx = (line.index('drop_table ') || line.index('drop_table('))&.+(11))
1700
+ tbl = line[idx..-1].match(/([:'"\w\.]+)/)&.captures&.first
1701
+ if tbl
1702
+ s[tbl.tr(':\'"', '').pluralize] << v
1703
+ break
1704
+ end
1705
+ end
1706
+ end
1707
+ end
1708
+ end
1709
+ if ::ActiveSupport.version < ::Gem::Version.new('6') ||
1710
+ ::Rails.configuration.instance_variable_get(:@autoloader) == :classic
1711
+ Rails.configuration.eager_load_namespaces.select { |ns| ns < Rails::Application }.each(&:eager_load!)
1712
+ else
1713
+ Zeitwerk::Loader.eager_load_all
1714
+ end
1715
+ abstract_activerecord_bases = ActiveRecord::Base.descendants.select { |ar| ar.abstract_class? }.map(&:name)
1716
+ # abstract_activerecord_bases << ActiveRecord::Base
1717
+ models = if Dir.exist?(model_path = "#{rails_root}/app/models")
1718
+ Dir["#{model_path}/**/*.rb"].each_with_object({}) do |v, s|
1719
+ File.read(v).split("\n").each do |line|
1720
+ # For all non-commented lines, look for any that start with "class " and also "< ApplicationRecord"
1721
+ if line.lstrip.start_with?('class') && (idx = line.index('class'))
1722
+ model = line[idx + 5..-1].match(/[\s:]+([\w:]+)/)&.captures&.first
1723
+ if model && abstract_activerecord_bases.exclude?(model)
1724
+ klass = begin
1725
+ model.constantize
1726
+ rescue
1727
+ end
1728
+ s[model.underscore.tr('/', '.').pluralize] = [
1729
+ v.start_with?(rails_root) ? v[rails_root.length + 1..-1] : v,
1730
+ klass
1731
+ ]
1732
+ end
1733
+ end
1734
+ end
1735
+ end
1736
+ end
1737
+ ::Brick.relations.keys.map { |v| [(r = v.pluralize), (model = models[r])&.last&.table_name || v, migrations&.fetch(r, nil), model&.first] }
1738
+ end
1739
+
1683
1740
  # Locate orphaned records
1684
1741
  def find_orphans(multi_schema)
1685
1742
  is_default_schema = multi_schema&.==(Apartment.default_schema)
@@ -56,6 +56,7 @@ module Brick
56
56
  # Used by Rails 5.0 and above
57
57
  alias :_brick_template_exists? :template_exists?
58
58
  def template_exists?(*args, **options)
59
+ (::Brick.config.add_status && args.first == 'status') ||
59
60
  (::Brick.config.add_orphans && args.first == 'orphans') ||
60
61
  _brick_template_exists?(*args, **options) ||
61
62
  # Do not auto-create a template when it's searching for an application.html.erb, which comes in like: ["edit", ["games", "application"]]
@@ -96,11 +97,12 @@ module Brick
96
97
  @_brick_model ||
97
98
  (ActionView.version < ::Gem::Version.new('5.0') && args[1].is_a?(Array) ? set_brick_model(args) : nil)
98
99
  )&.name) ||
100
+ (is_status = ::Brick.config.add_status && args[0..1] == ['status', ['brick_gem']]) ||
99
101
  (is_orphans = ::Brick.config.add_orphans && args[0..1] == ['orphans', ['brick_gem']])
100
102
  return _brick_find_template(*args, **options)
101
103
  end
102
104
 
103
- unless is_orphans
105
+ unless is_status || is_orphans
104
106
  pk = @_brick_model._brick_primary_key(::Brick.relations.fetch(model_name, nil))
105
107
  obj_name = model_name.split('::').last.underscore
106
108
  path_obj_name = model_name.underscore.tr('/', '_')
@@ -708,6 +710,53 @@ if (headerTop) {
708
710
 
709
711
  #{"<hr><%= link_to \"New #{obj_name}\", new_#{path_obj_name}_path %>" unless @_brick_model.is_view?}
710
712
  #{script}"
713
+
714
+ when 'status'
715
+ # Status page - list of all resources and 5 things they do or don't have present, and what is turned on and off
716
+ # Must load all models, and then find what table names are represented
717
+ # Easily could be multiple files involved (STI for instance)
718
+ +"#{css}
719
+ <p style=\"color: green\"><%= notice %></p>#{"
720
+ <select id=\"schema\">#{schema_options}</select>" if ::Brick.config.schema_behavior[:multitenant] && ::Brick.db_schemas.length > 1}
721
+ <select id=\"tbl\">#{table_options}</select>
722
+ <h1>Status</h1>
723
+ <table id=\"status\"><thead><tr>
724
+ <th>Resource</th>
725
+ <th>Table</th>
726
+ <th>Migration</th>
727
+ <th>Model</th>
728
+ <th>Route</th>
729
+ <th>Controller</th>
730
+ <th>Views</th>
731
+ </tr></thead>
732
+ <tbody>
733
+ <% # (listing in schema.rb)
734
+ # Solid colour if file or route entry is present
735
+ @resources.each do |r|
736
+ %>
737
+ <tr>
738
+ <td><%= link_to(r[0], \"/#\{r[0].tr('.', '/')}\") %></td>
739
+ <td<%= if r[1]
740
+ ' class=\"orphan\"' unless ::Brick.relations.key?(r[1])
741
+ else
742
+ ' class=\"dimmed\"'
743
+ end&.html_safe %>><%= # Table
744
+ r[1] %></td>
745
+ <td<%= ' class=\"dimmed\"'.html_safe unless r[2] %>><%= # Migration
746
+ r[2]&.join('<br>')&.html_safe %></td>
747
+ <td<%= ' class=\"dimmed\"'.html_safe unless r[3] %>><%= # Model
748
+ r[3] %></td>
749
+ <td<%= ' class=\"dimmed\"'.html_safe unless r[4] %>><%= # Route
750
+ %></td>
751
+ <td<%= ' class=\"dimmed\"'.html_safe unless r[5] %>><%= # Controller
752
+ %></td>
753
+ <td<%= ' class=\"dimmed\"'.html_safe unless r[6] %>><%= # Views
754
+ %></td>
755
+ <tr>
756
+ <% end %>
757
+ </tbody><table>
758
+ #{script}"
759
+
711
760
  when 'orphans'
712
761
  if is_orphans
713
762
  +"#{css}
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 58
8
+ TINY = 59
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
data/lib/brick.rb CHANGED
@@ -484,6 +484,9 @@ In config/initializers/brick.rb appropriate entries would look something like:
484
484
  send(:resources, controller_name.to_sym, **options)
485
485
  end
486
486
  end
487
+ if ::Brick.config.add_status && instance_variable_get(:@set).named_routes.names.exclude?(:brick_status)
488
+ get('/brick_status', to: 'brick_gem#status', as: 'brick_status')
489
+ end
487
490
  if ::Brick.config.add_orphans && instance_variable_get(:@set).named_routes.names.exclude?(:brick_orphans)
488
491
  get('/brick_orphans', to: 'brick_gem#orphans', as: 'brick_orphans')
489
492
  end
@@ -85,10 +85,9 @@ module Brick
85
85
  # Generate a list of tables that can be chosen
86
86
  chosen = gets_list(list: tables, chosen: tables.dup)
87
87
  schemas = chosen.each_with_object({}) do |v, s|
88
- schema = if v.split('.').length > 1
89
- v.first
90
- end
91
- s[schema] = nil if schema && [::Brick.default_schema, 'public'].exclude?(schema)
88
+ if (v_parts = v.split('.')).length > 1
89
+ s[v_parts.first] = nil unless [::Brick.default_schema, 'public'].include?(v_parts.first)
90
+ end
92
91
  end
93
92
  # Start the timestamps back the same number of minutes from now as expected number of migrations to create
94
93
  current_mig_time = Time.now - (schemas.length + chosen.length).minutes
@@ -130,7 +129,7 @@ module Brick
130
129
  tbl_parts.first
131
130
  end
132
131
  end
133
- unless built_schemas.key?(schema)
132
+ unless schema.blank? || built_schemas.key?(schema)
134
133
  mig = +" def change\n create_schema(:#{schema}) unless schema_exists?(:#{schema})\n end\n"
135
134
  migration_file_write(mig_path, "create_db_schema_#{schema}", current_mig_time += 1.minute, ar_version, mig)
136
135
  built_schemas[schema] = nil
@@ -6,63 +6,71 @@ require 'fancy_gets'
6
6
 
7
7
  module Brick
8
8
  # Auto-generates models, controllers, or views
9
- class ModelGenerator < ::Rails::Generators::Base
9
+ class ModelsGenerator < ::Rails::Generators::Base
10
10
  include FancyGets
11
11
  # include ::Rails::Generators::Migration
12
12
 
13
- # # source_root File.expand_path('templates', __dir__)
14
- # class_option(
15
- # :with_changes,
16
- # type: :boolean,
17
- # default: false,
18
- # desc: 'Add IMPORT_TEMPLATE to model'
19
- # )
20
-
21
13
  desc 'Auto-generates models, controllers, or views.'
22
14
 
23
- def brick_model
24
- # %%% If Apartment is active, ask which schema they want
15
+ def brick_models
16
+ # %%% If Apartment is active and there's no schema_to_analyse, ask which schema they want
25
17
 
26
18
  # Load all models
27
- Rails.configuration.eager_load_namespaces.select { |ns| ns < Rails::Application }.each(&:eager_load!)
19
+ if ::ActiveSupport.version < ::Gem::Version.new('6') ||
20
+ ::Rails.configuration.instance_variable_get(:@autoloader) == :classic
21
+ Rails.configuration.eager_load_namespaces.select { |ns| ns < Rails::Application }.each(&:eager_load!)
22
+ else
23
+ Zeitwerk::Loader.eager_load_all
24
+ end
28
25
 
29
26
  # Generate a list of viable models that can be chosen
30
27
  longest_length = 0
31
28
  model_info = Hash.new { |h, k| h[k] = {} }
32
29
  tableless = Hash.new { |h, k| h[k] = [] }
33
- models = ActiveRecord::Base.descendants.reject do |m|
34
- trouble = if m.abstract_class?
35
- true
36
- elsif !m.table_exists?
37
- tableless[m.table_name] << m.name
38
- ' (No Table)'
39
- else
40
- this_f_keys = (model_info[m][:f_keys] = m.reflect_on_all_associations.select { |a| a.macro == :belongs_to }) || []
41
- column_names = (model_info[m][:column_names] = m.columns.map(&:name) - [m.primary_key, 'created_at', 'updated_at', 'deleted_at'] - this_f_keys.map(&:foreign_key))
42
- if column_names.empty? && this_f_keys && !this_f_keys.empty?
43
- fk_message = ", although #{this_f_keys.length} foreign keys"
44
- " (No columns#{fk_message})"
45
- end
46
- end
47
- # puts "#{m.name}#{trouble}" if trouble&.is_a?(String)
48
- trouble
30
+ existing_models = ActiveRecord::Base.descendants.reject do |m|
31
+ m.abstract_class? || !m.table_exists? || ::Brick.relations.key?(m.table_name)
49
32
  end
33
+ models = ::Brick.relations.keys.map do |tbl|
34
+ tbl_parts = tbl.split('.')
35
+ tbl_parts[-1] = tbl_parts[-1].singularize
36
+ tbl_parts.join('/').camelize
37
+ end - existing_models.map(&:name)
50
38
  models.sort! do |a, b| # Sort first to separate namespaced stuff from the rest, then alphabetically
51
- is_a_namespaced = a.name.include?('::')
52
- is_b_namespaced = b.name.include?('::')
39
+ is_a_namespaced = a.include?('::')
40
+ is_b_namespaced = b.include?('::')
53
41
  if is_a_namespaced && !is_b_namespaced
54
42
  1
55
43
  elsif !is_a_namespaced && is_b_namespaced
56
44
  -1
57
45
  else
58
- a.name <=> b.name
46
+ a <=> b
59
47
  end
60
48
  end
61
49
  models.each do |m| # Find longest name in the list for future use to show lists on the right side of the screen
62
- if longest_length < (len = m.name.length)
50
+ if longest_length < (len = m.length)
63
51
  longest_length = len
64
52
  end
65
53
  end
54
+ chosen = gets_list(list: models, chosen: models.dup)
55
+ relations = ::Brick.relations
56
+ chosen.each do |model_name|
57
+ # If we're in a schema then make sure the module file exists
58
+ base_module = if (model_parts = model_name.split('::')).length > 1
59
+ "::#{model_parts.first}".constantize
60
+ else
61
+ Object
62
+ end
63
+ _built_model, code = Object.send(:build_model, relations, base_module, base_module.name, model_parts.last)
64
+ path = ['models']
65
+ path.concat(model_parts.map(&:underscore))
66
+ dir = +"#{::Rails.root}/app"
67
+ path[0..-2].each do |path_part|
68
+ dir << "/#{path_part}"
69
+ Dir.mkdir(dir) unless Dir.exists?(dir)
70
+ end
71
+ File.open("#{dir}/#{path.last}.rb", 'w') { |f| f.write code }
72
+ end
73
+ puts "\n*** Created #{chosen.length} model files under app/models ***"
66
74
  end
67
75
 
68
76
  private
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.58
4
+ version: 1.0.59
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorin Thwaits
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-12 00:00:00.000000000 Z
11
+ date: 2022-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -239,7 +239,7 @@ files:
239
239
  - lib/generators/brick/USAGE
240
240
  - lib/generators/brick/install_generator.rb
241
241
  - lib/generators/brick/migrations_generator.rb
242
- - lib/generators/brick/model_generator.rb
242
+ - lib/generators/brick/models_generator.rb
243
243
  - lib/generators/brick/templates/add_object_changes_to_versions.rb.erb
244
244
  - lib/generators/brick/templates/create_versions.rb.erb
245
245
  homepage: https://github.com/lorint/brick