smart_seeds 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b99224e6c643baa7701ee678670bbf115b730795
4
- data.tar.gz: f14a1e71eceb7e8b794ac5e02d5cb59e7395774d
3
+ metadata.gz: 4aca1c67df762de136d3c7bd6435220424253522
4
+ data.tar.gz: f3b0810b6ae0c9d7af2e6b2a1ce17d71ac9c2a6a
5
5
  SHA512:
6
- metadata.gz: d37fec684349ca72a2bff8e651fc27c91b463dd123afff2bfcea8783dd425d6e9a1838cfd59bfb9aaf202e47e8535464bc1e4a1281aa75af4861d8e3c6c4639c
7
- data.tar.gz: c7bec0972215ef472ad6e40231fe1c2f6a44f9eb6736c5afe7bfcea3e97092ed1c75ce1361f7f531ac2b92dd141f911fa1f03b1c950c9cd3dea4286430f3cca4
6
+ metadata.gz: 2c0356fcb1055780b580c6480f008449d2f673b2e21d1ec35850970d03e62ba9a66a57765912500537d9d434e8df0e163ab55fb1f1bcfe91a2aaadc1bdf6d824
7
+ data.tar.gz: b7f912df9d79e5136e0dd98b6d2e00ff45fc30c16e95daadf65f4754407220463f97a8af8943ed96cb6e012e3b879f213552d5b0cb94af53dcf468d3e6be3567
data/README.md CHANGED
@@ -1,8 +1,53 @@
1
1
  # SmartSeeds
2
- Short description and motivation.
2
+ Gem for an auto-smart generating the seeds in your Rails app.
3
+ It defines types columns in a model and generates random values for each of these fields.
3
4
 
4
5
  ## Usage
5
- How to use my plugin.
6
+
7
+ For example `Entity` model has `name`, `age`, `is_human` attributes.
8
+
9
+ All you need to do is run this command: `SmartSeeds.plant(Entity)`
10
+ ```
11
+ > SmartSeeds.plant(Entity)
12
+ (0.1ms) begin transaction
13
+ SQL (0.4ms) INSERT INTO "entities" ("id", "name", "age", "is_human", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["id", 369], ["name", "Heil"], ["age", 344], ["is_human", false], ["created_at", 2017-01-15 16:10:50 UTC], ["updated_at", 2017-01-15 16:10:50 UTC]]
14
+ (1.8ms) commit transaction
15
+ => true
16
+
17
+ ```
18
+ And we've got an object in a database:
19
+ ```
20
+ > Entity.last
21
+ Entity Load (0.2ms) SELECT "entities".* FROM "entities" ORDER BY "entities"."id" DESC LIMIT ? [["LIMIT", 1]]
22
+ => #<Entity id: 1, name: "Heil", age: 344, is_human: false, created_at: "2017-01-15 16:10:50", updated_at: "2017-01-15 16:10:50">
23
+
24
+ ```
25
+ ### Custom values
26
+ If you want to override some default values, you can send it in a hash:
27
+
28
+ ```
29
+ > SmartSeeds.plant(Entity, {name: 'Aleah'})
30
+ (0.1ms) begin transaction
31
+ SQL (0.4ms) INSERT INTO "entities" ("id", "name", "age", "is_human", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["id", 167], ["name", "Aleah"], ["age", 374], ["is_human", false], ["created_at", 2017-01-15 16:15:15 UTC], ["updated_at", 2017-01-15 16:15:15 UTC]]
32
+ (1.6ms) commit transaction
33
+ => true
34
+ ```
35
+
36
+ ### Faker
37
+ The gem has a simple integration with [Faker](https://github.com/stympy/faker).
38
+
39
+ That means if you have a AR model which called like a some Faker class and an attribute called like a some faker method in that class
40
+ a value will be generated by Faker gem.
41
+
42
+ For example: Model `Superhero` has the `name` and `power` attributes, so the value will be generated by `Faker::Superhero.name` and `Faker::Superhero.power`. [Superhero doc](https://github.com/stympy/faker/blob/master/doc/superhero.md).
43
+ ```
44
+ > SmartSeeds.plant(Superhero)
45
+ (0.7ms) begin transaction
46
+ SQL (2.8ms) INSERT INTO "superheros" ("name", "power", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Cheetah Skull"], ["power", "Magic"], ["created_at", 2017-01-22 23:33:20 UTC], ["updated_at", 2017-01-22 23:33:20 UTC]]
47
+ (0.9ms) commit transaction
48
+ => #<Superhero id: 8, name: "Ultra Firebird", power: "Magic", created_at: "2017-01-22 23:33:20", updated_at: "2017-01-22 23:33:20">
49
+
50
+ ```
6
51
 
7
52
  ## Installation
8
53
  Add this line to your application's Gemfile:
data/lib/smart_seeds.rb CHANGED
@@ -1,9 +1,22 @@
1
- require_relative 'generating'
2
- require_relative 'performing'
1
+ require 'smart_seeds/performing'
2
+ require 'smart_seeds/generator/base'
3
+ require 'smart_seeds/generator/binary'
4
+ require 'smart_seeds/generator/boolean'
5
+ require 'smart_seeds/generator/date'
6
+ require 'smart_seeds/generator/datetime'
7
+ require 'smart_seeds/generator/decimal'
8
+ require 'smart_seeds/generator/float'
9
+ require 'smart_seeds/generator/integer'
10
+ require 'smart_seeds/generator/string'
11
+ require 'smart_seeds/generator/text'
12
+ require 'smart_seeds/generator/time'
13
+ require 'smart_seeds/generator/integer/enum'
14
+ require 'smart_seeds/generator/integer/foreign_key'
15
+ require 'smart_seeds/generator/faker'
3
16
 
4
17
  module SmartSeeds
5
- def self.call(model, attrs={})
6
- perform = Performing.new(model, attrs)
18
+ def self.plant(model, attrs={})
19
+ perform = SmartSeeds::Performing.new(model, attrs)
7
20
  perform.call
8
21
  end
9
22
  end
@@ -0,0 +1,39 @@
1
+ # Available types of AR model are: :binary, :boolean, :date, :datetime, :decimal, :float, :integer, :string, :text, :time
2
+ # There are generators for all of these types, for example SmartSeeds::Generator::Integer
3
+
4
+ module SmartSeeds
5
+ module Generator
6
+ class Base
7
+ def initialize(column, model)
8
+ @column = column
9
+ @model = model
10
+ end
11
+
12
+ # Get class name of specific generator and execute generate value method
13
+ def generate_value
14
+ if is_comatible_with_faker?
15
+ generate_via_faker
16
+ else
17
+ begin
18
+ klass = "SmartSeeds::Generator::#{column.type.to_s.capitalize}".constantize
19
+ klass.new(column, model).generate_value
20
+ rescue Exception => e
21
+ puts e.inspect
22
+ end
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ attr_reader :column, :model
29
+
30
+ def is_comatible_with_faker?
31
+ SmartSeeds::Generator::Faker.new(column, model).is_compatible?
32
+ end
33
+
34
+ def generate_via_faker
35
+ SmartSeeds::Generator::Faker.new(column, model).generate_value
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Binary < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ '0b100'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Boolean < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ [true, false].sample
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Date < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ DateTime.now.to_date
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Datetime < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ DateTime.now
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Decimal < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ rand(6.6...6666.0).round(2)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Faker < SmartSeeds::Generator::Base
4
+ def initialize(column, model)
5
+ super
6
+ end
7
+
8
+ def generate_value
9
+ faker_class.send(column.name.to_sym)
10
+ end
11
+
12
+ def is_compatible?
13
+ true if faker_classes_include_model_name? && faker_methods_include_column_name?
14
+ end
15
+
16
+ private
17
+
18
+ def faker_classes_include_model_name?
19
+ # Check if Faker has a Class which called as a AR Model
20
+ faker_classes = ::Faker.constants.select {|c| ::Faker.const_get(c).is_a? Class}
21
+ faker_classes.include? model.name.to_sym
22
+ end
23
+
24
+ def faker_methods_include_column_name?
25
+ # Support methods are included in Faker generate class
26
+ support_singleton_methods = %i(method_missing fetch translate parse with_locale unique numerify letterify bothify regexify fetch_all flexible rand_in_range yaml_tag)
27
+
28
+ klass = faker_class
29
+
30
+ # Here is should stay only methods for generating random values without support methods like:
31
+ # => [:name, :prefix, :suffix, :power, :descriptor]
32
+ faker_methods = klass.singleton_methods - support_singleton_methods
33
+ faker_methods.include? column.name.to_sym
34
+ end
35
+
36
+ def faker_class
37
+ "Faker::#{model.name.capitalize}".constantize
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Float < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ rand(6.6...6666.0).round(2)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Integer < SmartSeeds::Generator::Base
4
+ def initialize(column, model)
5
+ super
6
+ end
7
+
8
+ def generate_value
9
+ if is_an_enum?
10
+ generate_enum
11
+ elsif is_foreign_key?
12
+ generate_foreign_key
13
+ else
14
+ rand(1..66666)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def is_an_enum?
21
+ SmartSeeds::Generator::Enum.new(column, model).is_an_enum?
22
+ end
23
+
24
+ def generate_enum
25
+ SmartSeeds::Generator::Enum.new(column, model).generate_value
26
+ end
27
+
28
+ def is_foreign_key?
29
+ SmartSeeds::Generator::ForeignKey.new(column, model).is_a_foreign_key?
30
+ end
31
+
32
+ def generate_foreign_key
33
+ SmartSeeds::Generator::ForeignKey.new(column, model).generate_value
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Enum < SmartSeeds::Generator::Integer
4
+ def initialize(column, model)
5
+ super
6
+ end
7
+
8
+ def generate_value
9
+ # Extract all values from enum hash
10
+ # {"status"=>{"active"=>0, "in_progress"=>1, "archived"=>2}}
11
+ # Get [0, 1, 2]
12
+ values_array = model.defined_enums[column.name].values
13
+ values_array.sample
14
+ end
15
+
16
+ def is_an_enum?
17
+ model.defined_enums.include?(column.name)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class ForeignKey < SmartSeeds::Generator::Integer
4
+ def initialize(column, model)
5
+ super
6
+ end
7
+
8
+ def generate_value
9
+ klass = column.name.split('_').first.capitalize.constantize
10
+ klass.ids.sample
11
+ end
12
+
13
+ def is_a_foreign_key?
14
+ true if column.name.split('_').last == 'id'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class String < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ ::Faker::Lorem.word
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Text < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ ::Faker::Lorem.paragraph
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module SmartSeeds
2
+ module Generator
3
+ class Time < SmartSeeds::Generator::Base
4
+
5
+ def initialize(column, model)
6
+ super
7
+ end
8
+
9
+ def generate_value
10
+ DateTime.now.to_time
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,51 @@
1
+ module SmartSeeds
2
+ class Performing
3
+ SKIPPABLE_COLUMN_NAMES = %w(id created_at updated_at)
4
+
5
+ def initialize(model, attrs)
6
+ @attrs = attrs
7
+ @model = model
8
+ @object = model.new
9
+ end
10
+
11
+ def call
12
+ set_default_values
13
+
14
+ # User can send custom values in a hash: SmartSeeds.(Entity, {name: 'Aleah'})
15
+ # This method overrides default values to custom('name' in the example above)
16
+ set_custom_values if attrs.any?
17
+
18
+ object.save!
19
+ object
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :attrs
25
+ attr_reader :model
26
+ attr_reader :object
27
+
28
+ def set_default_values
29
+ model.columns.each do |column|
30
+ next if is_column_must_be_skipped?(column.name)
31
+ object[column.name] = generate_value(column)
32
+ end
33
+ end
34
+
35
+ def set_custom_values
36
+ attrs.each do |attr|
37
+ key = attr.first
38
+ value = attr.last
39
+ object[key.to_s] = value
40
+ end
41
+ end
42
+
43
+ def generate_value(column)
44
+ SmartSeeds::Generator::Base.new(column, model).generate_value
45
+ end
46
+
47
+ def is_column_must_be_skipped?(column_name)
48
+ SmartSeeds::Performing::SKIPPABLE_COLUMN_NAMES.include?(column_name)
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module SmartSeeds
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_seeds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitaliy Fry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-15 00:00:00.000000000 Z
11
+ date: 2017-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faker
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: Description of Autoseed.
42
56
  email:
43
57
  - vitaliy.fry@gmail.com
@@ -48,11 +62,23 @@ files:
48
62
  - MIT-LICENSE
49
63
  - README.md
50
64
  - Rakefile
51
- - lib/generating.rb
52
- - lib/performing.rb
53
65
  - lib/smart_seeds.rb
66
+ - lib/smart_seeds/generator/base.rb
67
+ - lib/smart_seeds/generator/binary.rb
68
+ - lib/smart_seeds/generator/boolean.rb
69
+ - lib/smart_seeds/generator/date.rb
70
+ - lib/smart_seeds/generator/datetime.rb
71
+ - lib/smart_seeds/generator/decimal.rb
72
+ - lib/smart_seeds/generator/faker.rb
73
+ - lib/smart_seeds/generator/float.rb
74
+ - lib/smart_seeds/generator/integer.rb
75
+ - lib/smart_seeds/generator/integer/enum.rb
76
+ - lib/smart_seeds/generator/integer/foreign_key.rb
77
+ - lib/smart_seeds/generator/string.rb
78
+ - lib/smart_seeds/generator/text.rb
79
+ - lib/smart_seeds/generator/time.rb
80
+ - lib/smart_seeds/performing.rb
54
81
  - lib/smart_seeds/version.rb
55
- - lib/tasks/autoseed_tasks.rake
56
82
  homepage: http://frylock.me
57
83
  licenses:
58
84
  - MIT
data/lib/generating.rb DELETED
@@ -1,41 +0,0 @@
1
- module Generating
2
- AVAILABLE_TYPES = %i(
3
- binary
4
- boolean
5
- date
6
- datetime
7
- decimal
8
- float
9
- integer
10
- string
11
- text
12
- time
13
- )
14
-
15
- def self.generate_value(column_type)
16
- raise ArgumentError, "There is no column type #{column_type}" unless Generating::AVAILABLE_TYPES.include?(column_type)
17
-
18
- case column_type
19
- when :binary
20
- '0b100'
21
- when :boolean
22
- [true, false].sample
23
- when :date
24
- DateTime.now.to_date
25
- when :datetime
26
- DateTime.now
27
- when :decimal
28
- rand(6.6...666.0).round(2)
29
- when :float
30
- rand(6.6...666.0).round(2)
31
- when :integer
32
- rand(1...666)
33
- when :string
34
- 'Heil'
35
- when :text
36
- 'BIG text'
37
- when :time
38
- DateTime.now.to_time
39
- end
40
- end
41
- end
data/lib/performing.rb DELETED
@@ -1,41 +0,0 @@
1
- class Performing
2
- def initialize(model, attrs)
3
- @attrs = attrs
4
- @model = model
5
- @object = model.new
6
- end
7
-
8
- def call
9
- set_default_values
10
- set_custom_values if attrs.any?
11
-
12
- object.save!
13
- end
14
-
15
- private
16
-
17
- attr_reader :attrs
18
- attr_reader :model
19
- attr_reader :object
20
-
21
- def set_default_values
22
- model.columns.each do |column|
23
- column_name = column.name
24
- column_type = column.type
25
-
26
- object[column_name] = generate_value(column_type)
27
- end
28
- end
29
-
30
- def set_custom_values
31
- attrs.each do |attr|
32
- key = attr.first
33
- value = attr.last
34
- object[key.to_s] = value
35
- end
36
- end
37
-
38
- def generate_value(column_type)
39
- Generating.generate_value(column_type)
40
- end
41
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :autoseed do
3
- # # Task goes here
4
- # end