dirty_seed 0.1.4

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 (118) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +44 -0
  4. data/Rakefile +22 -0
  5. data/lib/dirty_seed.rb +23 -0
  6. data/lib/dirty_seed/assigners/dirty_assigner.rb +32 -0
  7. data/lib/dirty_seed/assigners/dirty_boolean.rb +14 -0
  8. data/lib/dirty_seed/assigners/dirty_date.rb +14 -0
  9. data/lib/dirty_seed/assigners/dirty_float.rb +28 -0
  10. data/lib/dirty_seed/assigners/dirty_integer.rb +86 -0
  11. data/lib/dirty_seed/assigners/dirty_string.rb +49 -0
  12. data/lib/dirty_seed/assigners/dirty_time.rb +14 -0
  13. data/lib/dirty_seed/data_model.rb +80 -0
  14. data/lib/dirty_seed/dirty_association.rb +106 -0
  15. data/lib/dirty_seed/dirty_attribute.rb +64 -0
  16. data/lib/dirty_seed/dirty_model.rb +123 -0
  17. data/lib/dirty_seed/engine.rb +11 -0
  18. data/lib/dirty_seed/exceptions.rb +6 -0
  19. data/lib/dirty_seed/method_missing_helper.rb +49 -0
  20. data/lib/dirty_seed/sorter.rb +118 -0
  21. data/lib/dirty_seed/version.rb +6 -0
  22. data/lib/tasks/dirty_seed_tasks.rake +8 -0
  23. data/spec/dummy/Rakefile +6 -0
  24. data/spec/dummy/app/assets/config/manifest.js +3 -0
  25. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  26. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  27. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  28. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  29. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  30. data/spec/dummy/app/javascript/packs/application.js +15 -0
  31. data/spec/dummy/app/jobs/application_job.rb +7 -0
  32. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  33. data/spec/dummy/app/models/alfa.rb +5 -0
  34. data/spec/dummy/app/models/application_record.rb +3 -0
  35. data/spec/dummy/app/models/bravo.rb +3 -0
  36. data/spec/dummy/app/models/charlie.rb +5 -0
  37. data/spec/dummy/app/models/delta.rb +4 -0
  38. data/spec/dummy/app/models/echo.rb +3 -0
  39. data/spec/dummy/app/models/foxtrot.rb +2 -0
  40. data/spec/dummy/app/models/golf.rb +2 -0
  41. data/spec/dummy/app/models/hotel.rb +4 -0
  42. data/spec/dummy/app/models/india.rb +4 -0
  43. data/spec/dummy/app/models/juliett.rb +21 -0
  44. data/spec/dummy/app/models/kilo.rb +2 -0
  45. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  46. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  47. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  48. data/spec/dummy/bin/rails +4 -0
  49. data/spec/dummy/bin/rake +4 -0
  50. data/spec/dummy/bin/setup +33 -0
  51. data/spec/dummy/config.ru +5 -0
  52. data/spec/dummy/config/application.rb +18 -0
  53. data/spec/dummy/config/boot.rb +5 -0
  54. data/spec/dummy/config/cable.yml +10 -0
  55. data/spec/dummy/config/database.yml +25 -0
  56. data/spec/dummy/config/environment.rb +5 -0
  57. data/spec/dummy/config/environments/development.rb +62 -0
  58. data/spec/dummy/config/environments/production.rb +112 -0
  59. data/spec/dummy/config/environments/test.rb +49 -0
  60. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  61. data/spec/dummy/config/initializers/assets.rb +12 -0
  62. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  63. data/spec/dummy/config/initializers/content_security_policy.rb +28 -0
  64. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  65. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  66. data/spec/dummy/config/initializers/inflections.rb +27 -0
  67. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  68. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  69. data/spec/dummy/config/locales/en.yml +33 -0
  70. data/spec/dummy/config/puma.rb +38 -0
  71. data/spec/dummy/config/routes.rb +3 -0
  72. data/spec/dummy/config/spring.rb +6 -0
  73. data/spec/dummy/config/storage.yml +34 -0
  74. data/spec/dummy/db/development.sqlite3 +0 -0
  75. data/spec/dummy/db/migrate/20200923100317_create_alfas.rb +15 -0
  76. data/spec/dummy/db/migrate/20200923100328_create_bravos.rb +12 -0
  77. data/spec/dummy/db/migrate/20200923100329_create_charlies.rb +9 -0
  78. data/spec/dummy/db/migrate/20200923100330_create_deltas.rb +10 -0
  79. data/spec/dummy/db/migrate/20200923100331_create_echos.rb +9 -0
  80. data/spec/dummy/db/migrate/20200923100332_create_foxtrots.rb +9 -0
  81. data/spec/dummy/db/migrate/20200923100334_create_hotels.rb +7 -0
  82. data/spec/dummy/db/migrate/20200923100335_create_indias.rb +11 -0
  83. data/spec/dummy/db/migrate/20200923100336_create_julietts.rb +11 -0
  84. data/spec/dummy/db/migrate/20200923100337_create_kilos.rb +13 -0
  85. data/spec/dummy/db/schema.rb +105 -0
  86. data/spec/dummy/db/test.sqlite3 +0 -0
  87. data/spec/dummy/log/development.log +217 -0
  88. data/spec/dummy/log/test.log +95379 -0
  89. data/spec/dummy/public/404.html +67 -0
  90. data/spec/dummy/public/422.html +67 -0
  91. data/spec/dummy/public/500.html +66 -0
  92. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  93. data/spec/dummy/public/apple-touch-icon.png +0 -0
  94. data/spec/dummy/public/favicon.ico +0 -0
  95. data/spec/dummy/spec/factories/bars.rb +8 -0
  96. data/spec/dummy/spec/factories/foos.rb +7 -0
  97. data/spec/dummy/spec/models/alfa_spec.rb +6 -0
  98. data/spec/dummy/spec/models/bravo_spec.rb +6 -0
  99. data/spec/dummy/spec/models/charlie_spec.rb +6 -0
  100. data/spec/dummy/spec/models/delta_spec.rb +6 -0
  101. data/spec/dummy/spec/models/echo_spec.rb +6 -0
  102. data/spec/dummy/tmp/development_secret.txt +1 -0
  103. data/spec/lib/dirty_seed/assigners/dirty_assigner_spec.rb +13 -0
  104. data/spec/lib/dirty_seed/assigners/dirty_boolean_spec.rb +13 -0
  105. data/spec/lib/dirty_seed/assigners/dirty_date_spec.rb +15 -0
  106. data/spec/lib/dirty_seed/assigners/dirty_float_spec.rb +47 -0
  107. data/spec/lib/dirty_seed/assigners/dirty_integer_spec.rb +49 -0
  108. data/spec/lib/dirty_seed/assigners/dirty_string_spec.rb +15 -0
  109. data/spec/lib/dirty_seed/assigners/dirty_time_spec.rb +15 -0
  110. data/spec/lib/dirty_seed/data_model_spec.rb +72 -0
  111. data/spec/lib/dirty_seed/dirty_association_spec.rb +64 -0
  112. data/spec/lib/dirty_seed/dirty_attribute_spec.rb +49 -0
  113. data/spec/lib/dirty_seed/dirty_model_spec.rb +102 -0
  114. data/spec/lib/dirty_seed/sorter_spec.rb +46 -0
  115. data/spec/lib/tasks/dirty_seed_tasks_spec.rb +21 -0
  116. data/spec/rails_helper.rb +44 -0
  117. data/spec/support/helpers.rb +30 -0
  118. metadata +282 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e9767e646a1b92174c3a4428716ba9fc4214cf882d7f60f938b6d1545113695d
4
+ data.tar.gz: 7eae0d2328c0e848d81579a2d054a380c38e773025e4c9cd04fefab20e780c8d
5
+ SHA512:
6
+ metadata.gz: 48f999e45dc0138d58d39533fe1f4d5c275d6f9ba810fc4eef10040780ec5b30272509ab9b4bb1c9b8edf4d8836adf41e69ae2add9f98a1ee5cb44a24485958a
7
+ data.tar.gz: 63921534da52c1bc42fae353ac1c6a38d2af20cac8213d7c31c9e849b7d86f933e729cddde4b65a5d8d49411b4344bae8acb3e1bba313ea74c75095b8937fc23
@@ -0,0 +1,20 @@
1
+ Copyright 2020 Edouard Piron
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,44 @@
1
+ > **Work in progress!**
2
+
3
+ # DirtySeed
4
+
5
+ Populate the database with records matching associations and validations, in order to quickly test application.
6
+
7
+ ## Usage
8
+
9
+ Once you've installed the gem, you can use the dedicated task.
10
+
11
+ To seed dirty data, run:
12
+ ```bash
13
+ $ rake dirty_seed:seed
14
+ ```
15
+
16
+ This will try to create instances for each of your models inheriting from `ApplicationRecord`.
17
+
18
+ If the instance cannot be saved, it is simply ignored.
19
+
20
+ Number of instances created and recurrent errors will be outputed.
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ ```ruby
27
+ gem 'dirty_seed', git: 'https://github.com/BigBigDoudou/dirty_seed'
28
+ ```
29
+
30
+ And then execute:
31
+ ```bash
32
+ $ bundle
33
+ ```
34
+
35
+ ## License
36
+
37
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
38
+
39
+ ## Next features
40
+
41
+ * Assign values for more data types (json, array, etc.).
42
+ * Integrate more validations (uniqueness, inclusion, length, absence, etc.).
43
+ * Use instance errors to adjust values.
44
+ * Add a configuration system to define how to seed: number of instances, models to skip, default values, etc.
@@ -0,0 +1,22 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'DirtySeed'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ require 'bundler/gem_tasks'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'dirty_seed/engine'
4
+ require_relative 'dirty_seed/exceptions'
5
+
6
+ module DirtySeed
7
+ autoload :MethodMissingHelper, 'dirty_seed/method_missing_helper'
8
+ autoload :DataModel, 'dirty_seed/data_model'
9
+ autoload :DirtyModel, 'dirty_seed/dirty_model'
10
+ autoload :DirtyAssociation, 'dirty_seed/dirty_association'
11
+ autoload :DirtyAttribute, 'dirty_seed/dirty_attribute'
12
+ autoload :Sorter, 'dirty_seed/sorter'
13
+
14
+ module Assigners
15
+ autoload :DirtyAssigner, 'dirty_seed/assigners/dirty_assigner'
16
+ autoload :DirtyBoolean, 'dirty_seed/assigners/dirty_boolean'
17
+ autoload :DirtyInteger, 'dirty_seed/assigners/dirty_integer'
18
+ autoload :DirtyFloat, 'dirty_seed/assigners/dirty_float'
19
+ autoload :DirtyString, 'dirty_seed/assigners/dirty_string'
20
+ autoload :DirtyDate, 'dirty_seed/assigners/dirty_date'
21
+ autoload :DirtyTime, 'dirty_seed/assigners/dirty_time'
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faker'
4
+
5
+ module DirtySeed
6
+ module Assigners
7
+ # Draws a value matching validators
8
+ class DirtyAssigner
9
+ attr_reader :dirty_attribute, :sequence
10
+
11
+ # Initializes an instance
12
+ # @param attribute [DirtySeed::DirtyAttribute]
13
+ # @param sequence [Integer]
14
+ # @return [DirtySeed::Assigners::DirtyAssigner]
15
+ def initialize(dirty_attribute, sequence)
16
+ @dirty_attribute = dirty_attribute
17
+ @sequence = sequence
18
+ end
19
+
20
+ # Returns an validators related to the current attribute
21
+ # @return [Array<ActiveModel::Validations::EachValidators>]
22
+ def validators
23
+ dirty_attribute.validators
24
+ end
25
+
26
+ # Returns a random value depending on the attribute type
27
+ # @return [void]
28
+ # @note This method should be overrided
29
+ def value; end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws a boolean value matching validators
6
+ class DirtyBoolean < DirtyAssigner
7
+ # Returns a boolean
8
+ # @return [Boolean]
9
+ def value
10
+ [true, false].sample
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws a Date matching validators
6
+ class DirtyDate < DirtyAssigner
7
+ # Returns a date matching all validators
8
+ # @return [Date]
9
+ def value
10
+ ::Faker::Date.between(from: 42.days.ago, to: 42.days.from_now)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws an Float matching validators
6
+ class DirtyFloat < DirtyAssigner
7
+ # Returns a float matching all validators
8
+ # @return [Float]
9
+ def value
10
+ integer + decimals
11
+ end
12
+
13
+ private
14
+
15
+ # Returns an Integer matching all validators
16
+ # @return [Integer]
17
+ def integer
18
+ DirtySeed::Assigners::DirtyInteger.new(dirty_attribute, 0).value
19
+ end
20
+
21
+ # Returns a Float between 0 and 1
22
+ # @return [Float]
23
+ def decimals
24
+ rand(0..Float(1))
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws an integer matching validators
6
+ class DirtyInteger < DirtyAssigner
7
+ attr_reader :min, :max
8
+
9
+ # Returns an integer matching all validators
10
+ # @return [Integer]
11
+ def value
12
+ define_min_and_max
13
+ adjust_values
14
+ rand(min..max)
15
+ end
16
+
17
+ private
18
+
19
+ # Sets @min and @max if not already set
20
+ # @return [void]
21
+ def adjust_values
22
+ return if @min && @max
23
+
24
+ if @min
25
+ @max = @min + random
26
+ elsif @max
27
+ @min = @max - random
28
+ else
29
+ @min = 0
30
+ @max = random
31
+ end
32
+ end
33
+
34
+ # Returns a random integer
35
+ # @return [Integer]
36
+ def random
37
+ rand(sequence..42)
38
+ end
39
+
40
+ # Defines @min and @max based on each validator
41
+ # @return [void]
42
+ def define_min_and_max
43
+ validators.each do |validator|
44
+ adjust_min!(validator)
45
+ adjust_max!(validator)
46
+ end
47
+ end
48
+
49
+ # Sets or updates @min so it matches validator
50
+ # @param validator [ActiveModel::Validations::EachValidator]
51
+ # @return [Integer, nil]
52
+ def adjust_min!(validator)
53
+ return unless min_for(validator)
54
+
55
+ @min = min_for(validator) if @min.nil? || min_for(validator) > @min
56
+ end
57
+
58
+ # Sets or updates @max so it matches validator
59
+ # @param validator [ActiveModel::Validations::EachValidator]
60
+ # @return [Integer, nil]
61
+ def adjust_max!(validator)
62
+ return unless max_for(validator)
63
+
64
+ @max = max_for(validator) if @max.nil? || max_for(validator) < @max
65
+ end
66
+
67
+ # Returns an integer representing the minimal acceptable value
68
+ # @param validator [ActiveModel::Validations::EachValidator]
69
+ # @return [Integer]
70
+ def min_for(validator)
71
+ validator.options[:greater_than]&.+(1) ||
72
+ validator.options[:greater_than_or_equal_to] ||
73
+ validator.options[:in]&.min
74
+ end
75
+
76
+ # Returns an integer representing the maximal acceptable value
77
+ # @param validator [ActiveModel::Validations::EachValidator]
78
+ # @return [Integer]
79
+ def max_for(validator)
80
+ validator.options[:less_than]&.-(1) ||
81
+ validator.options[:less_than_or_equal_to] ||
82
+ validator.options[:in]&.max
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws a String matching validators
6
+ class DirtyString < DirtyAssigner
7
+ SPECIFIC_ATTRIBUTES = {
8
+ address: -> { Faker::Address.unique.full_address },
9
+ city: -> { Faker::Address.unique.city },
10
+ country: -> { Faker::Address.unique.country },
11
+ description: -> { Faker::Lorem.unique.paragraph(sentence_count: 2, random_sentences_to_add: 4) },
12
+ email: -> { Faker::Internet.unique.email(domain: 'example') },
13
+ first_name: -> { ::Faker::Name.unique.first_name },
14
+ firstname: -> { ::Faker::Name.unique.first_name },
15
+ last_name: -> { ::Faker::Name.unique.last_name },
16
+ lastname: -> { ::Faker::Name.unique.last_name },
17
+ lat: -> { Faker::Address.unique.latitude },
18
+ latitutde: -> { Faker::Address.unique.latitude },
19
+ lng: -> { Faker::Address.unique.longitude },
20
+ locale: -> { Faker::Address.unique.country_code },
21
+ longitude: -> { Faker::Address.unique.longitude },
22
+ middlename: -> { ::Faker::Name.unique.middle_name },
23
+ middle_name: -> { ::Faker::Name.unique.middle_name },
24
+ password: -> { ::Faker::Internet.unique.password },
25
+ phone: -> { Faker::PhoneNumber.unique.phone_number },
26
+ phone_number: -> { Faker::PhoneNumber.unique.phone_number },
27
+ reference: -> { Faker::Internet.unique.uuid },
28
+ title: -> { Faker::Lorem.unique.sentence(word_count: 3, random_words_to_add: 4) },
29
+ username: -> { Faker::Internet.unique.username }
30
+ }.freeze
31
+ private_constant :SPECIFIC_ATTRIBUTES
32
+
33
+ # Returns a string matching all validators
34
+ # @return [String]
35
+ # @note First try to guess attribute meaning by its name and use Faker to return a coherent value
36
+ def value
37
+ SPECIFIC_ATTRIBUTES[dirty_attribute.name]&.call || default
38
+ end
39
+
40
+ private
41
+
42
+ # Returns a standard string
43
+ # @return [String]
44
+ def default
45
+ ::Faker::Lorem.unique.sentence(word_count: 3, supplemental: false, random_words_to_add: 4)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ module Assigners
5
+ # Draws a Time matching validators
6
+ class DirtyTime < DirtyAssigner
7
+ # Returns a time matching all validators
8
+ # @return [Time]
9
+ def value
10
+ ::Faker::Time.between(from: DateTime.now - 42, to: DateTime.now + 42)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DirtySeed
4
+ # Represents the data model
5
+ class DataModel
6
+ include Singleton
7
+ attr_accessor :logs
8
+
9
+ class << self
10
+ # Defines class methods forwarding to instance methods
11
+ %i[seed models active_record_models print_logs].each do |method_name|
12
+ define_method(method_name) { instance.public_send(method_name) }
13
+ end
14
+
15
+ # Returns dirty model if method_name matches its name
16
+ # @return [DirtySeed::DirtyModel]
17
+ # @raise [NoMethodError] if method_name does not match any dirty model
18
+ def method_missing(method_name, *args, &block)
19
+ models.find do |model|
20
+ model.name.underscore.to_sym == method_name
21
+ end || super
22
+ end
23
+
24
+ # Returns true if method_name matches a dirty model name
25
+ # @return [Boolean]
26
+ def respond_to_missing?(method_name, include_private = false)
27
+ models.any? do |model|
28
+ model.name.underscore.to_sym == method_name
29
+ end || super
30
+ end
31
+ end
32
+
33
+ # Initializes an instance
34
+ # @return [DirtySeed::DataModel]
35
+ def initialize
36
+ Rails.application.eager_load!
37
+ @logs = {}
38
+ end
39
+
40
+ # Seeds the database with dirty instances
41
+ # @return [void]
42
+ def seed
43
+ # check if ApplicationRecord is defined first
44
+ ::ApplicationRecord && 3.times { models.each(&:seed) }
45
+ print_logs
46
+ end
47
+
48
+ # Returns an dirty models
49
+ # @return [Array<DirtySeed::DirtyModel>]
50
+ def models
51
+ @models ||=
52
+ active_record_models.map do |active_record_model|
53
+ DirtySeed::DirtyModel.new(active_record_model)
54
+ end
55
+ end
56
+
57
+ # Returns ApplicationRecord inherited classes sorted by their associations
58
+ # @return [Array<Class>] a class inheriting from ApplicationRecord
59
+ def active_record_models
60
+ @active_record_models ||=
61
+ DirtySeed::Sorter.new(unsorted_active_record_models).sort!
62
+ end
63
+
64
+ # Returns an ApplicationRecord inherited classes
65
+ # @return [Array<Class>] a class inheriting from ApplicationRecord
66
+ def unsorted_active_record_models
67
+ ::ApplicationRecord.descendants.reject(&:abstract_class)
68
+ end
69
+
70
+ # Prints logs in the console
71
+ # @return [void]
72
+ def print_logs
73
+ models.sort_by(&:name).each do |model|
74
+ puts model.name
75
+ puts " created: #{model.seeded}"
76
+ puts " errors: #{model.errors.join(', ')}" if model.errors.any?
77
+ end
78
+ end
79
+ end
80
+ end