brick 0.1.0 → 1.0.0

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.
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require 'rails/generators/active_record'
5
+
6
+ module Brick
7
+ # Auto-generates an IMPORT_TEMPLATE entry for one or more models
8
+ class InstallGenerator < ::Rails::Generators::Base
9
+ include ::Rails::Generators::Migration
10
+
11
+ source_root File.expand_path('templates', __dir__)
12
+ class_option(
13
+ :with_changes,
14
+ type: :boolean,
15
+ default: false,
16
+ desc: 'Store changeset (diff) with each version'
17
+ )
18
+
19
+ desc 'Generates (but does not run) a migration to add a versions table.' \
20
+ ' Also generates an initializer file for configuring Brick'
21
+
22
+ def create_migration_file
23
+ add_brick_migration('create_versions')
24
+ add_brick_migration('add_object_changes_to_versions') if options.with_changes?
25
+ end
26
+
27
+ def self.next_migration_number(dirname)
28
+ ::ActiveRecord::Generators::Base.next_migration_number(dirname)
29
+ end
30
+
31
+ protected
32
+
33
+ def add_brick_migration(template)
34
+ migration_dir = File.expand_path('db/migrate')
35
+ if self.class.migration_exists?(migration_dir, template)
36
+ ::Kernel.warn "Migration already exists: #{template}"
37
+ else
38
+ migration_template(
39
+ "#{template}.rb.erb",
40
+ "db/migrate/#{template}.rb",
41
+ item_type_options: item_type_options,
42
+ migration_version: migration_version,
43
+ versions_table_options: versions_table_options
44
+ )
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ # MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
51
+ def item_type_options
52
+ opt = { null: false }
53
+ opt[:limit] = 191 if mysql?
54
+ ", #{opt}"
55
+ end
56
+
57
+ def migration_version
58
+ return unless (major = ActiveRecord::VERSION::MAJOR) >= 5
59
+
60
+ "[#{major}.#{ActiveRecord::VERSION::MINOR}]"
61
+ end
62
+
63
+ # Class names of MySQL adapters.
64
+ # - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
65
+ # - `Mysql2Adapter` - Used by `mysql2` gem.
66
+ def mysql?
67
+ [
68
+ 'ActiveRecord::ConnectionAdapters::MysqlAdapter',
69
+ 'ActiveRecord::ConnectionAdapters::Mysql2Adapter'
70
+ ].freeze.include?(ActiveRecord::Base.connection.class.name)
71
+ end
72
+
73
+ # Even modern versions of MySQL still use `latin1` as the default character
74
+ # encoding. Many users are not aware of this, and run into trouble when they
75
+ # try to use Brick in apps that otherwise tend to use UTF-8. Postgres, by
76
+ # comparison, uses UTF-8 except in the unusual case where the OS is configured
77
+ # with a custom locale.
78
+ #
79
+ # - https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
80
+ # - http://www.postgresql.org/docs/9.4/static/multibyte.html
81
+ #
82
+ # Furthermore, MySQL's original implementation of UTF-8 was flawed, and had
83
+ # to be fixed later by introducing a new charset, `utf8mb4`.
84
+ #
85
+ # - https://mathiasbynens.be/notes/mysql-utf8mb4
86
+ # - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
87
+ #
88
+ def versions_table_options
89
+ if mysql?
90
+ ', { options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci" }'
91
+ else
92
+ ''
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require 'rails/generators/active_record'
5
+ require 'fancy_gets'
6
+
7
+ module Brick
8
+ # Auto-generates models, controllers, or views
9
+ class ModelGenerator < ::Rails::Generators::Base
10
+ include FancyGets
11
+ # include ::Rails::Generators::Migration
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
+ desc 'Auto-generates models, controllers, or views.'
22
+
23
+ def brick_model
24
+ # %%% If Apartment is active, ask which schema they want
25
+
26
+ # Load all models
27
+ Rails.configuration.eager_load_namespaces.select { |ns| ns < Rails::Application }.each(&:eager_load!)
28
+
29
+ # Generate a list of viable models that can be chosen
30
+ longest_length = 0
31
+ model_info = Hash.new { |h, k| h[k] = {} }
32
+ 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
49
+ end
50
+ 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?('::')
53
+ if is_a_namespaced && !is_b_namespaced
54
+ 1
55
+ elsif !is_a_namespaced && is_b_namespaced
56
+ -1
57
+ else
58
+ a.name <=> b.name
59
+ end
60
+ end
61
+ models.each do |m| # Find longest name in the list for future use to show lists on the right side of the screen
62
+ # Strangely this can't be inlined since it assigns to "len"
63
+ if longest_length < (len = m.name.length)
64
+ longest_length = len
65
+ end
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ # # MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
72
+ # def item_type_options
73
+ # opt = { null: false }
74
+ # opt[:limit] = 191 if mysql?
75
+ # ", #{opt}"
76
+ # end
77
+
78
+ # def migration_version
79
+ # return unless (major = ActiveRecord::VERSION::MAJOR) >= 5
80
+
81
+ # "[#{major}.#{ActiveRecord::VERSION::MINOR}]"
82
+ # end
83
+
84
+ # # Class names of MySQL adapters.
85
+ # # - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
86
+ # # - `Mysql2Adapter` - Used by `mysql2` gem.
87
+ # def mysql?
88
+ # [
89
+ # 'ActiveRecord::ConnectionAdapters::MysqlAdapter',
90
+ # 'ActiveRecord::ConnectionAdapters::Mysql2Adapter'
91
+ # ].freeze.include?(ActiveRecord::Base.connection.class.name)
92
+ # end
93
+
94
+ # # Even modern versions of MySQL still use `latin1` as the default character
95
+ # # encoding. Many users are not aware of this, and run into trouble when they
96
+ # # try to use Brick in apps that otherwise tend to use UTF-8. Postgres, by
97
+ # # comparison, uses UTF-8 except in the unusual case where the OS is configured
98
+ # # with a custom locale.
99
+ # #
100
+ # # - https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
101
+ # # - http://www.postgresql.org/docs/9.4/static/multibyte.html
102
+ # #
103
+ # # Furthermore, MySQL's original implementation of UTF-8 was flawed, and had
104
+ # # to be fixed later by introducing a new charset, `utf8mb4`.
105
+ # #
106
+ # # - https://mathiasbynens.be/notes/mysql-utf8mb4
107
+ # # - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
108
+ # #
109
+ # def versions_table_options
110
+ # if mysql?
111
+ # ', { options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci" }'
112
+ # else
113
+ # ''
114
+ # end
115
+ # end
116
+ end
117
+ end
@@ -0,0 +1,12 @@
1
+ # This migration adds the optional `object_changes` column, in which DutyFree
2
+ # will store the `changes` diff for each update event. See the readme for
3
+ # details.
4
+ class AddObjectChangesToVersions < ActiveRecord::Migration<%= migration_version %>
5
+ # The largest text column available in all supported RDBMS.
6
+ # See `create_versions.rb` for details.
7
+ TEXT_BYTES = 1_073_741_823
8
+
9
+ def change
10
+ add_column :versions, :object_changes, :text, limit: TEXT_BYTES
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ # This migration creates the `versions` table, the only schema Brick requires.
2
+ # All other migrations Brick provides are optional.
3
+ class CreateVersions < ActiveRecord::Migration<%= migration_version %>
4
+
5
+ # The largest text column available in all supported RDBMS is
6
+ # 1024^3 - 1 bytes, roughly one gibibyte. We specify a size
7
+ # so that MySQL will use `longtext` instead of `text`. Otherwise,
8
+ # when serializing very large objects, `text` might not be big enough.
9
+ TEXT_BYTES = 1_073_741_823
10
+
11
+ def change
12
+ create_table :versions<%= versions_table_options %> do |t|
13
+ t.string :item_type<%= item_type_options %>
14
+ t.integer :item_id, null: false
15
+ t.string :event, null: false
16
+ t.string :whodunnit
17
+ t.text :object, limit: TEXT_BYTES
18
+
19
+ # Known issue in MySQL: fractional second precision
20
+ # -------------------------------------------------
21
+ #
22
+ # MySQL timestamp columns do not support fractional seconds unless
23
+ # defined with "fractional seconds precision". MySQL users should manually
24
+ # add fractional seconds precision to this migration, specifically, to
25
+ # the `created_at` column.
26
+ # (https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html)
27
+ #
28
+ # MySQL users should also upgrade to rails 4.2, which is the first
29
+ # version of ActiveRecord with support for fractional seconds in MySQL.
30
+ # (https://github.com/rails/rails/pull/14359)
31
+ #
32
+ t.datetime :created_at
33
+ end
34
+ add_index :versions, %i(item_type item_id)
35
+ end
36
+ end
metadata CHANGED
@@ -1,95 +1,242 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brick
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
- - Esad Hajdarevic
9
- autorequire:
7
+ - Lorin Thwaits
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-31 00:00:00.000000000 Z
11
+ date: 2022-03-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: activesupport
14
+ name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: '3.2'
19
+ version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.1'
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - "<"
28
31
  - !ruby/object:Gem::Version
29
- version: '3.2'
32
+ version: '7.1'
30
33
  - !ruby/object:Gem::Dependency
31
- name: clamp
34
+ name: appraisal
32
35
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
36
  requirements:
35
- - - ! '>='
37
+ - - "~>"
36
38
  - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :runtime
39
+ version: '2.2'
40
+ type: :development
39
41
  prerelease: false
40
42
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
43
  requirements:
43
- - - ! '>='
44
+ - - "~>"
44
45
  - !ruby/object:Gem::Version
45
- version: '0'
46
+ version: '2.2'
46
47
  - !ruby/object:Gem::Dependency
47
- name: pry
48
+ name: pry-byebug
48
49
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
50
  requirements:
51
- - - ! '>='
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :runtime
53
+ version: 3.7.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 3.7.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: ffaker
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.11'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.11'
75
+ - !ruby/object:Gem::Dependency
76
+ name: generator_spec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.9.4
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.9.4
89
+ - !ruby/object:Gem::Dependency
90
+ name: memory_profiler
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.9.14
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.9.14
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '13.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '13.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec-rails
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '4.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '4.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.93'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.93'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubocop-rspec
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 1.42.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 1.42.0
159
+ - !ruby/object:Gem::Dependency
160
+ name: pg
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0.18'
166
+ - - "<"
167
+ - !ruby/object:Gem::Version
168
+ version: '2.0'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0.18'
176
+ - - "<"
177
+ - !ruby/object:Gem::Version
178
+ version: '2.0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: sqlite3
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '1.4'
186
+ type: :development
55
187
  prerelease: false
56
188
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
189
  requirements:
59
- - - ! '>='
190
+ - - "~>"
60
191
  - !ruby/object:Gem::Version
61
- version: '0'
62
- description: Minimal ruby antiframework
63
- email:
64
- - esad@esse.at
65
- executables:
66
- - brick
192
+ version: '1.4'
193
+ description: 'Auto-create models, views, controllers, and routes with this slick Rails
194
+ extension
195
+
196
+ '
197
+ email: lorint@gmail.com
198
+ executables: []
67
199
  extensions: []
68
200
  extra_rdoc_files: []
69
201
  files:
70
- - bin/brick
71
- homepage: https://github.com/esad/brick
72
- licenses: []
73
- post_install_message:
202
+ - lib/brick.rb
203
+ - lib/brick/config.rb
204
+ - lib/brick/extensions.rb
205
+ - lib/brick/frameworks/cucumber.rb
206
+ - lib/brick/frameworks/rails.rb
207
+ - lib/brick/frameworks/rails/controller.rb
208
+ - lib/brick/frameworks/rails/engine.rb
209
+ - lib/brick/frameworks/rspec.rb
210
+ - lib/brick/serializers/json.rb
211
+ - lib/brick/serializers/yaml.rb
212
+ - lib/brick/util.rb
213
+ - lib/brick/version_number.rb
214
+ - lib/generators/brick/USAGE
215
+ - lib/generators/brick/install_generator.rb
216
+ - lib/generators/brick/model_generator.rb
217
+ - lib/generators/brick/templates/add_object_changes_to_versions.rb.erb
218
+ - lib/generators/brick/templates/create_versions.rb.erb
219
+ homepage: https://github.com/lorint/brick
220
+ licenses:
221
+ - MIT
222
+ metadata: {}
223
+ post_install_message:
74
224
  rdoc_options: []
75
225
  require_paths:
76
226
  - lib
77
227
  required_ruby_version: !ruby/object:Gem::Requirement
78
- none: false
79
228
  requirements:
80
- - - ! '>='
229
+ - - ">="
81
230
  - !ruby/object:Gem::Version
82
- version: '0'
231
+ version: 2.3.5
83
232
  required_rubygems_version: !ruby/object:Gem::Requirement
84
- none: false
85
233
  requirements:
86
- - - ! '>='
234
+ - - ">="
87
235
  - !ruby/object:Gem::Version
88
- version: '0'
236
+ version: 1.3.6
89
237
  requirements: []
90
- rubyforge_project:
91
- rubygems_version: 1.8.24
92
- signing_key:
93
- specification_version: 3
94
- summary: In the real world we call that a library
238
+ rubygems_version: 3.1.6
239
+ signing_key:
240
+ specification_version: 4
241
+ summary: Import and Export Data
95
242
  test_files: []
data/bin/brick DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- def find_script
4
- previous = nil
5
- current = File.expand_path(Dir.pwd)
6
-
7
- until !File.directory?(current) || current == previous
8
- filename = File.join(current, 'script', 'brick')
9
- return filename if File.file?(filename)
10
- current, previous = File.expand_path("..", current), current
11
- end
12
- end
13
-
14
- script = find_script || abort("Can't find script/brick")
15
- exec(script, *ARGV)