rider-kick 0.0.1 → 0.0.2

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -0
  3. data/lib/generators/rider_kick/USAGE +12 -0
  4. data/lib/generators/rider_kick/clean_arch_generator.rb +160 -0
  5. data/lib/generators/rider_kick/init_generator.rb +15 -0
  6. data/lib/generators/rider_kick/scaffold_generator.rb +123 -0
  7. data/lib/generators/rider_kick/structure_generator.rb +75 -0
  8. data/lib/generators/rider_kick/templates/.gitignore +57 -0
  9. data/lib/generators/rider_kick/templates/.rspec +5 -0
  10. data/lib/generators/rider_kick/templates/.rubocop.yml +1141 -0
  11. data/lib/generators/rider_kick/templates/README.md +69 -0
  12. data/lib/generators/rider_kick/templates/config/database.yml +21 -0
  13. data/lib/generators/rider_kick/templates/config/initializers/clean_archithecture.rb.tt +10 -0
  14. data/lib/generators/rider_kick/templates/config/initializers/generators.rb.tt +14 -0
  15. data/lib/generators/rider_kick/templates/config/initializers/hashie.rb.tt +16 -0
  16. data/lib/generators/rider_kick/templates/config/initializers/pagy.rb.tt +13 -0
  17. data/lib/generators/rider_kick/templates/config/initializers/rider_kick.rb +3 -0
  18. data/lib/generators/rider_kick/templates/config/initializers/version.rb.tt +6 -0
  19. data/lib/generators/rider_kick/templates/config/initializers/zeitwerk.rb.tt +3 -0
  20. data/lib/generators/rider_kick/templates/db/migrate/20220613145533_init_database.rb +5 -0
  21. data/lib/generators/rider_kick/templates/db/structures/example.yaml.tt +58 -0
  22. data/lib/generators/rider_kick/templates/domains/core/builders/builder.rb.tt +14 -0
  23. data/lib/generators/rider_kick/templates/domains/core/builders/error.rb.tt +5 -0
  24. data/lib/generators/rider_kick/templates/domains/core/builders/pagination.rb.tt +14 -0
  25. data/lib/generators/rider_kick/templates/domains/core/entities/entity.rb.tt +9 -0
  26. data/lib/generators/rider_kick/templates/domains/core/entities/error.rb.tt +7 -0
  27. data/lib/generators/rider_kick/templates/domains/core/entities/pagination.rb.tt +8 -0
  28. data/lib/generators/rider_kick/templates/domains/core/repositories/abstract_repository.rb.tt +51 -0
  29. data/lib/generators/rider_kick/templates/domains/core/repositories/create.rb.tt +15 -0
  30. data/lib/generators/rider_kick/templates/domains/core/repositories/destroy.rb.tt +16 -0
  31. data/lib/generators/rider_kick/templates/domains/core/repositories/fetch_by_id.rb.tt +13 -0
  32. data/lib/generators/rider_kick/templates/domains/core/repositories/list.rb.tt +19 -0
  33. data/lib/generators/rider_kick/templates/domains/core/repositories/update.rb.tt +23 -0
  34. data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/default.rb.tt +17 -0
  35. data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/pagination.rb.tt +15 -0
  36. data/lib/generators/rider_kick/templates/domains/core/use_cases/create.rb.tt +18 -0
  37. data/lib/generators/rider_kick/templates/domains/core/use_cases/destroy.rb.tt +18 -0
  38. data/lib/generators/rider_kick/templates/domains/core/use_cases/fetch_by_id.rb.tt +18 -0
  39. data/lib/generators/rider_kick/templates/domains/core/use_cases/get_version.rb.tt +17 -0
  40. data/lib/generators/rider_kick/templates/domains/core/use_cases/list.rb.tt +18 -0
  41. data/lib/generators/rider_kick/templates/domains/core/use_cases/update.rb.tt +18 -0
  42. data/lib/generators/rider_kick/templates/domains/core/utils/request_methods.rb.tt +81 -0
  43. data/lib/generators/rider_kick/templates/env.development +14 -0
  44. data/lib/generators/rider_kick/templates/env.production +14 -0
  45. data/lib/generators/rider_kick/templates/env.test +14 -0
  46. data/lib/generators/rider_kick/templates/spec/fixtures/sample.pdf +5 -0
  47. data/lib/generators/rider_kick/templates/spec/rails_helper.rb +87 -0
  48. data/lib/generators/rider_kick/templates/spec/support/file_stuber.rb +13 -0
  49. data/lib/generators/rider_kick/templates/spec/support/repository_stubber.rb +10 -0
  50. data/lib/rider-kick.rb +3 -3
  51. data/lib/rider_kick/builders/abstract_active_record_entity_builder.rb +23 -21
  52. data/lib/rider_kick/builders/abstract_active_record_entity_builder_spec.rb +116 -0
  53. data/lib/rider_kick/configuration.rb +29 -0
  54. data/lib/rider_kick/matchers/use_case_result_spec.rb +1 -0
  55. data/lib/rider_kick/types.rb +0 -3
  56. data/lib/rider_kick/version.rb +1 -1
  57. metadata +52 -4
  58. data/sig/rider_kick.rbs +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2da69cd31f4ccd9814e0e568898021f35bee72c122db6e9979e6cc498fd63cff
4
- data.tar.gz: 126375cf6d4edd2c217ecfb9f8c3dd49bfc96fb1c02112768f06456ec75ce620
3
+ metadata.gz: 2202ce45cec1f54ec7ad7d7e7cea9f9cbca29644d5ea99500d5b5168198b1f55
4
+ data.tar.gz: 0b79036ead139ee15e1d3f7180be8c3c98b16453cbe9166d9185fa9eb5397d8f
5
5
  SHA512:
6
- metadata.gz: 61e7cd11f7d73d2a785467eb96259ec89d866e0edacfa48f8ec9c627f52efb2f867aa127ef71a1155fb258023924e0515fba30ff8c9b0d499bdee38577ae119d
7
- data.tar.gz: 8791510f1e262cd77ba0bfd38ee7b9e23b45676ca4bf5d15828a6bb424292e5cbd25235c71201f5ca95cf7ecdcb90f621d91b93b459e2cee700d44eaa87d35b4
6
+ metadata.gz: 45a3430a608c8ed6509f56127082c9f54545f6af7fd19105d500d1ecf9f5ff32f48f988208c1b877b52720b712b15568c85d107f5f056eee29e782b1b214d0b7
7
+ data.tar.gz: d7296b1a448f475f8c6b0a980530e2b535a7ac54e364d4ca72719012f59f6f2a6a906ef30b0c0704f1fd402c15f558fcd2fa4059ce372eeb7a7c4d6bb24b7d51
data/README.md CHANGED
@@ -15,6 +15,35 @@ And then execute:
15
15
 
16
16
  $ bundle install
17
17
  $ bundle binstubs rider-kick
18
+ $ rails generate rider_kick:clean_arch --setup
19
+ $ rails db:drop db:create db:migrate db:seed
20
+ $ rubocop -a
21
+
22
+ ## Usage
23
+ ```bash
24
+ Description:
25
+ Clean Architecture generator
26
+
27
+ Example:
28
+ To Generate Structure:
29
+ bin/rails generate rider_kick:clean_arch --setup
30
+
31
+ To undo:
32
+ bin/rails destroy rider_kick:clean_arch --setup
33
+
34
+ To Generate scaffold:
35
+ bin/rails generate rider_kick:scaffold Models::Contact actor:user
36
+
37
+ To undo:
38
+ bin/rails destroy rider_kick:scaffold Models::Contact actor:user
39
+
40
+ To Generate Domain:
41
+ bin/rails generate rider_kick:blank actor:user action:create scope:Contact --use_case --repository --builder --entity
42
+
43
+ To undo:
44
+ bin/rails destroy rider_kick:blank actor:user action:create scope:Contact --use_case --repository --builder --entity
45
+
46
+ ```
18
47
 
19
48
  ## Philosophy
20
49
 
@@ -0,0 +1,12 @@
1
+ Description:
2
+ Clean Architecture generator
3
+
4
+ Example:
5
+ To Generate Init:
6
+ bin/rails generate rider_kick:init
7
+
8
+ To Generate Pattern:
9
+ bin/rails generate rider_kick:clean_arch --setup
10
+
11
+ To Generate scaffold:
12
+ bin/rails generate rider_kick:scaffold Models::Contact actor:user
@@ -0,0 +1,160 @@
1
+ module RiderKick
2
+ class CleanArchGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('templates', __dir__)
4
+
5
+ class_option :setup, type: :boolean, default: false, desc: 'Setup domain structure'
6
+
7
+ def validate_setup_option
8
+ raise Thor::Error, 'The --setup option must be specified to create the domain structure.' unless options.setup
9
+ validation!
10
+ end
11
+
12
+ def create_gem_dependencies
13
+ append_to_file('Gemfile', gem_dependencies)
14
+ say 'Gems added to Gemfile', :green
15
+ end
16
+
17
+ def setup_configuration
18
+ setup_domain_structure
19
+
20
+ setup_initializers
21
+ setup_dotenv
22
+ setup_gitignore
23
+ setup_rubocop
24
+ setup_init_migration
25
+ setup_active_storage
26
+ setup_rspec
27
+ setup_readme
28
+ end
29
+
30
+ private
31
+
32
+ def setup_active_storage
33
+ run 'rails active_storage:install'
34
+ run 'rails db:migrate'
35
+ end
36
+
37
+ def validation!
38
+ unless File.exist?('config/initializers/rider_kick.rb')
39
+ say 'Error must create init configuration for rider_kick!'
40
+ raise Thor::Error, 'run: bin/rails generate rider_kick:init'
41
+ end
42
+ end
43
+
44
+ def setup_domain_structure
45
+ empty_directory File.join("#{path_app}/domains/core/use_cases/contract")
46
+ empty_directory File.join("#{path_app}/domains/core/repositories")
47
+ empty_directory File.join("#{path_app}/domains/core/builders")
48
+ empty_directory File.join("#{path_app}/domains/core/entities")
49
+ empty_directory File.join("#{path_app}/domains/core/utils")
50
+
51
+ # then
52
+ copy_domain_file
53
+ end
54
+
55
+ def copy_domain_file
56
+ template 'domains/core/use_cases/contract/pagination.rb.tt', File.join("#{path_app}/domains/core/use_cases/contract", 'pagination.rb')
57
+ template 'domains/core/use_cases/contract/default.rb.tt', File.join("#{path_app}/domains/core/use_cases/contract", 'default.rb')
58
+ template 'domains/core/use_cases/get_version.rb.tt', File.join("#{path_app}/domains/core/use_cases", 'get_version.rb')
59
+
60
+ template 'domains/core/builders/error.rb.tt', File.join("#{path_app}/domains/core/builders", 'error.rb')
61
+ template 'domains/core/builders/pagination.rb.tt', File.join("#{path_app}/domains/core/builders", 'pagination.rb')
62
+
63
+ template 'domains/core/entities/error.rb.tt', File.join("#{path_app}/domains/core/entities", 'error.rb')
64
+ template 'domains/core/entities/pagination.rb.tt', File.join("#{path_app}/domains/core/entities", 'pagination.rb')
65
+
66
+ template 'domains/core/repositories/abstract_repository.rb.tt', File.join("#{path_app}/domains/core/repositories", 'abstract_repository.rb')
67
+ template 'domains/core/utils/request_methods.rb.tt', File.join("#{path_app}/domains/core/utils", 'request_methods.rb')
68
+ end
69
+
70
+ def setup_initializers
71
+ copy_initializer('clean_archithecture')
72
+ copy_initializer('generators')
73
+ copy_initializer('hashie')
74
+ copy_initializer('version')
75
+ copy_initializer('zeitwerk')
76
+ copy_initializer('pagy')
77
+ end
78
+
79
+ def setup_dotenv
80
+ copy_database_config
81
+ copy_env_development
82
+ end
83
+
84
+ def setup_gitignore
85
+ template '.gitignore', File.join('.gitignore')
86
+ end
87
+
88
+ def setup_rubocop
89
+ template '.rubocop.yml', File.join('.rubocop.yml')
90
+ end
91
+
92
+ def setup_readme
93
+ template 'README.md', File.join('README.md')
94
+ end
95
+
96
+ def setup_init_migration
97
+ template 'db/migrate/20220613145533_init_database.rb', File.join('db/migrate/20220613145533_init_database.rb')
98
+ end
99
+
100
+ # Helper untuk menyalin initializers
101
+ def copy_initializer(file_name)
102
+ template "config/initializers/#{file_name}.rb.tt", File.join("config/initializers/#{file_name}.rb")
103
+ end
104
+
105
+ def copy_database_config
106
+ template 'config/database.yml', File.join('config/database.yml')
107
+ end
108
+
109
+ def copy_env_development
110
+ template 'env.production', File.join('.env.production')
111
+ template 'env.development', File.join('.env.development')
112
+ template 'env.test', File.join('.env.test')
113
+ template 'env.test', File.join('env.example')
114
+ end
115
+
116
+ def gem_dependencies
117
+ inject_into_file 'Gemfile', after: "group :development, :test do\n" do
118
+ <<-CONFIG
119
+
120
+ gem "byebug"
121
+ gem "rspec-rails"
122
+ gem "factory_bot_rails"
123
+ gem "shoulda-matchers"
124
+ CONFIG
125
+ end
126
+
127
+ <<~RUBY
128
+
129
+ # Env Variables
130
+ gem 'dotenv-rails'
131
+
132
+ # Objectable
133
+ gem 'hashie'
134
+
135
+ # uploading
136
+ gem 'image_processing', '>= 1.2'
137
+ gem 'ruby-vips'
138
+
139
+ # pagination
140
+ gem 'pagy', '~> 9.2'
141
+ RUBY
142
+ end
143
+
144
+ def setup_rspec
145
+ say 'Menjalankan bundle install...'
146
+ run 'bundle install'
147
+ say 'Menginisialisasi RSpec...'
148
+ run 'rails generate rspec:install'
149
+ template '.rspec', File.join('.rspec')
150
+ template 'spec/support/repository_stubber.rb', File.join('spec/support/repository_stubber.rb')
151
+ template 'spec/support/file_stuber.rb', File.join('spec/support/file_stuber.rb')
152
+ say 'Mengonfigurasi FactoryBot...'
153
+ template 'spec/rails_helper.rb', File.join('spec/rails_helper.rb')
154
+ end
155
+
156
+ def path_app
157
+ 'app'
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,15 @@
1
+ module RiderKick
2
+ class InitGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('templates', __dir__)
4
+
5
+ def setup_configuration
6
+ copy_initializer('rider_kick')
7
+ end
8
+
9
+ private
10
+
11
+ def copy_initializer(file_name)
12
+ template "config/initializers/#{file_name}.rb", File.join("config/initializers/#{file_name}.rb")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,123 @@
1
+ require 'yaml'
2
+ module RiderKick
3
+ class ScaffoldGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('templates', __dir__)
5
+
6
+ argument :arg_structure, type: :string, default: '', banner: ''
7
+
8
+ def generate_use_case
9
+ validation!
10
+ setup_variables
11
+
12
+ generate_files('create')
13
+ generate_files('update')
14
+ generate_files('list')
15
+ generate_files('destroy')
16
+ generate_files('fetch', '_by_id')
17
+
18
+ copy_builder_and_entity_files
19
+ end
20
+
21
+ private
22
+
23
+ def validation!
24
+ unless File.exist?('config/initializers/rider_kick.rb')
25
+ say 'Error must create init configuration for rider_kick!'
26
+ raise Thor::Error, 'run: bin/rails generate rider_kick:init'
27
+ end
28
+ end
29
+
30
+ def setup_variables
31
+ config = YAML.load_file("db/structures/#{arg_structure}_structure.yaml")
32
+ @structure = Hashie::Mash.new(config)
33
+
34
+ # Mengambil detail konfigurasi
35
+ model_name = @structure.model
36
+ resource_name = @structure.resource_name.singularize.underscore.downcase
37
+ entity = @structure.entity || {}
38
+
39
+ @actor = @structure.actor
40
+ @uploaders = @structure.uploaders || []
41
+ @search_able = @structure.search_able || []
42
+ @services = @structure.services || {}
43
+ @contract_list = @services.action_list.contract || []
44
+ @contract_fetch_by_id = @services.action_fetch_by_id.contract || []
45
+ @contract_create = @services.action_create.contract || []
46
+ @contract_update = @services.action_update.contract || []
47
+ @contract_destroy = @services.action_destroy.contract || []
48
+ @skipped_fields = entity.skipped_fields || []
49
+ @custom_fields = entity.custom_fields || []
50
+
51
+ @variable_subject = model_name.split('::').last.underscore.downcase
52
+ @scope_path = resource_name.pluralize.underscore.downcase
53
+ @model_class = model_name.camelize.constantize
54
+ @subject_class = resource_name.camelize
55
+ @fields = contract_fields
56
+
57
+ @type_mapping = {
58
+ 'uuid' => ':string',
59
+ 'string' => ':string',
60
+ 'text' => ':string',
61
+ 'integer' => ':integer',
62
+ 'boolean' => ':bool',
63
+ 'float' => ':float',
64
+ 'decimal' => ':float',
65
+ 'date' => ':date',
66
+ 'upload' => 'Types::File',
67
+ 'datetime' => ':string'
68
+ }
69
+ @entity_type_mapping = {
70
+ 'uuid' => 'Types::Strict::String',
71
+ 'string' => 'Types::Strict::String',
72
+ 'text' => 'Types::Strict::String',
73
+ 'integer' => 'Types::Strict::Integer',
74
+ 'boolean' => 'Types::Strict::Bool',
75
+ 'float' => 'Types::Strict::Float',
76
+ 'decimal' => 'Types::Strict::Decimal',
77
+ 'date' => 'Types::Strict::Date',
78
+ 'datetime' => 'Types::Strict::Time'
79
+ }
80
+ end
81
+
82
+ def generate_files(action, suffix = '')
83
+ use_case_filename = build_usecase_filename(action, suffix)
84
+ repository_filename = build_repository_filename(action, suffix)
85
+
86
+ @scope_class = @scope_path.camelize
87
+ @use_case_class = use_case_filename.camelize
88
+ @repository_class = repository_filename.camelize
89
+
90
+ template "domains/core/use_cases/#{action + suffix}.rb.tt", File.join("#{root_path_app}/domains/core/use_cases/#{@scope_path}", "#{use_case_filename}.rb")
91
+ template "domains/core/repositories/#{action + suffix}.rb.tt", File.join("#{root_path_app}/domains/core/repositories/#{@scope_path}", "#{repository_filename}.rb")
92
+ end
93
+
94
+ def copy_builder_and_entity_files
95
+ template 'domains/core/builders/builder.rb.tt', File.join("#{root_path_app}/domains/core/builders", "#{@variable_subject}.rb")
96
+ template 'domains/core/entities/entity.rb.tt', File.join("#{root_path_app}/domains/core/entities", "#{@variable_subject}.rb")
97
+ end
98
+
99
+ def contract_fields
100
+ skip_contract_fields = @skipped_fields.map(&:strip).uniq
101
+ if RiderKick.scope_owner_column.present?
102
+ skip_contract_fields << RiderKick.scope_owner_column.to_s
103
+ end
104
+ @model_class.columns.reject { |column| skip_contract_fields.include?(column.name.to_s) }.map(&:name).map(&:to_s)
105
+ end
106
+
107
+ def get_column_type(field)
108
+ @uploaders.include?(field) ? 'upload' : @model_class.columns_hash[field.to_s].type
109
+ end
110
+
111
+ def root_path_app
112
+ 'app'
113
+ end
114
+
115
+ def build_usecase_filename(action, suffix = '')
116
+ "#{@actor}_#{action}_#{@variable_subject}#{suffix}"
117
+ end
118
+
119
+ def build_repository_filename(action, suffix = '')
120
+ "#{action}_#{@variable_subject}#{suffix}"
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,75 @@
1
+ module RiderKick
2
+ class Structure < Rails::Generators::Base
3
+ source_root File.expand_path('templates', __dir__)
4
+
5
+ argument :arg_model_name, type: :string, default: '', banner: 'Models::Name'
6
+ argument :arg_settings, type: :hash, default: '', banner: 'actor:user uploader_filed:assets,images,picture,document'
7
+
8
+ def generate_use_case
9
+ validation!
10
+ setup_variables
11
+ generate_files(@scope_path)
12
+ end
13
+
14
+ private
15
+
16
+ def validation!
17
+ unless File.exist?('config/initializers/rider_kick.rb')
18
+ say 'Error must create init configuration for rider_kick!'
19
+ raise Thor::Error, 'run: bin/rails generate rider_kick:init'
20
+ end
21
+ end
22
+
23
+ def setup_variables
24
+ @variable_subject = arg_model_name.split('::').last.underscore.downcase
25
+ @model_class = arg_model_name.camelize.constantize
26
+ @subject_class = arg_model_name.split('::').last
27
+ @scope_path = @subject_class.pluralize.underscore.downcase
28
+ @scope_class = @scope_path.camelize
29
+ @fields = contract_fields
30
+ @uploaders = uploaders
31
+ @actor = arg_settings['actor'].downcase
32
+
33
+ @type_mapping = {
34
+ 'uuid' => ':string',
35
+ 'string' => ':string',
36
+ 'text' => ':string',
37
+ 'integer' => ':integer',
38
+ 'boolean' => ':bool',
39
+ 'float' => ':float',
40
+ 'decimal' => ':float',
41
+ 'date' => ':date',
42
+ 'upload' => 'Types::File',
43
+ 'datetime' => ':string'
44
+ }
45
+ @entity_type_mapping = {
46
+ 'uuid' => 'Types::Strict::String',
47
+ 'string' => 'Types::Strict::String',
48
+ 'text' => 'Types::Strict::String',
49
+ 'integer' => 'Types::Strict::Integer',
50
+ 'boolean' => 'Types::Strict::Bool',
51
+ 'float' => 'Types::Strict::Float',
52
+ 'decimal' => 'Types::Strict::Decimal',
53
+ 'date' => 'Types::Strict::Date',
54
+ 'datetime' => 'Types::Strict::Time'
55
+ }
56
+ end
57
+
58
+ def generate_files(action)
59
+ template 'db/structures/example.yaml.tt', File.join("db/structures/#{action}_structure.yaml")
60
+ end
61
+
62
+ def contract_fields
63
+ @model_class.columns.reject { |column| (['id', 'created_at', 'updated_at', 'type'] + [RiderKick.scope_owner_column.to_s]).include?(column.name.to_s) }.map(&:name).map(&:to_s)
64
+ end
65
+
66
+ def get_column_type(field)
67
+ uploaders.include?(field) ? 'upload' : @model_class.columns_hash[field].type
68
+ end
69
+
70
+ def uploaders
71
+ return [] unless arg_settings['uploader_filed'].present?
72
+ arg_settings['uploader_filed'].split(',').map(&:strip)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,57 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore all logfiles and tempfiles.
11
+ /log/*
12
+ /tmp/*
13
+ !/log/.keep
14
+ !/tmp/.keep
15
+
16
+ # Ignore pidfiles, but keep the directory.
17
+ /tmp/pids/*
18
+ !/tmp/pids/
19
+ !/tmp/pids/.keep
20
+
21
+ # Ignore uploaded files in development.
22
+ /storage/*
23
+ !/storage/.keep
24
+ /tmp/storage/*
25
+ !/tmp/storage/
26
+ !/tmp/storage/.keep
27
+
28
+ /public/assets
29
+
30
+ # Ignore master key for decrypting credentials and more.
31
+ /config/master.key
32
+
33
+ # editor
34
+ .DS_Store
35
+ .idea
36
+ .env.*
37
+ Procfile
38
+ .ruby-gemset
39
+ .irb-history
40
+ .pry_history
41
+ .byebug_history
42
+
43
+ /app/assets/builds/*
44
+ !/app/assets/builds/.keep
45
+
46
+ /node_modules
47
+
48
+ # Vite Ruby
49
+ /public/vite*
50
+ node_modules
51
+ # Vite uses dotenv and suggests to ignore local-only env files. See
52
+ # https://vitejs.dev/guide/env-and-mode.html#env-files
53
+ *.local
54
+ data
55
+ volumes
56
+ vendor/bundle/ruby/*
57
+ ssl
@@ -0,0 +1,5 @@
1
+ --require spec_helper
2
+ --require rails_helper
3
+ --color
4
+ --profile
5
+ --format documentation