brick 1.0.58 → 1.0.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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