smart_seeds 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -21
- data/lib/smart_seeds.rb +3 -2
- data/lib/smart_seeds/generator/faker.rb +1 -1
- data/lib/smart_seeds/generator/integer.rb +7 -22
- data/lib/smart_seeds/generator/integer/enum.rb +2 -2
- data/lib/smart_seeds/generator/integer/foreign_key.rb +34 -14
- data/lib/smart_seeds/performing.rb +16 -11
- data/lib/smart_seeds/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca1778f758a9eab74bd9fb47cb40f4862f2238b5
|
4
|
+
data.tar.gz: 0a42feefde292e962be94b6271cab72d29330f36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce4e9b0a682050a6bf1826d7aa12de549fd6b5e0daecf0e5a07e39728e1f9b1fb961dacad9dc752c3b2be2842ba6721522aa4cd2b708ff21533dca476b35f368
|
7
|
+
data.tar.gz: 324d62e05060eae5440e81945071973303c3dee7ede347de149cd6131680c005dd3b08b860c52ee348842ff3bdcfd8951575f618c4fc2fc147829de5b2e04eaf
|
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# SmartSeeds
|
2
|
-
Gem for
|
2
|
+
Gem for smart auto generating of new records with random values for your ruby app.
|
3
3
|
|
4
|
-
It determines types of fields(attributes)
|
4
|
+
It determines types of fields(attributes) of an ActiveRecord model and creates records with random values for each of these attributes.
|
5
|
+
|
6
|
+
The gem has simple integration with Faker and supports foreign_keys, enums, etc.
|
5
7
|
|
6
8
|
## Usage
|
7
9
|
|
@@ -9,29 +11,21 @@ For example `Entity` model has `name`, `age`, `is_human` attributes.
|
|
9
11
|
|
10
12
|
All you need to do is run this command: `SmartSeeds.plant(Entity)`
|
11
13
|
```
|
12
|
-
> SmartSeeds.plant(Entity)
|
14
|
+
> SmartSeeds.plant(Entity)
|
13
15
|
(0.1ms) begin transaction
|
14
|
-
SQL (0.
|
15
|
-
(
|
16
|
-
=>
|
17
|
-
|
18
|
-
```
|
19
|
-
And you've got an object in a database:
|
20
|
-
```
|
21
|
-
> Entity.last
|
22
|
-
Entity Load (0.2ms) SELECT "entities".* FROM "entities" ORDER BY "entities"."id" DESC LIMIT ? [["LIMIT", 1]]
|
23
|
-
=> #<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">
|
24
|
-
|
16
|
+
SQL (0.5ms) INSERT INTO "entities" ("name", "age", "is_human", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["name", "Numquam"], ["age", 60246], ["is_human", true], ["created_at", 2017-01-30 15:10:00 UTC], ["updated_at", 2017-01-30 15:10:00 UTC]]
|
17
|
+
(0.7ms) commit transaction
|
18
|
+
=> #<Entity id: 1, name: "Numquam", age: 1488, is_human: false, created_at: "2017-01-30 15:10:00", updated_at: "2017-01-30 15:10:00">
|
25
19
|
```
|
26
20
|
### Custom values
|
27
|
-
If you want to override some default values, you can send
|
21
|
+
If you want to override some default random values, you can send them in a hash:
|
28
22
|
|
29
23
|
```
|
30
|
-
> SmartSeeds.plant(Entity, {name: 'Aleah'})
|
31
|
-
(0.
|
32
|
-
SQL (
|
33
|
-
(
|
34
|
-
=> true
|
24
|
+
> SmartSeeds.plant(Entity, {name: 'Aleah'})
|
25
|
+
(0.7ms) begin transaction
|
26
|
+
SQL (1.9ms) INSERT INTO "entities" ("name", "age", "is_human", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["name", "Aleah"], ["age", 15166], ["is_human", false], ["created_at", 2017-01-30 15:11:16 UTC], ["updated_at", 2017-01-30 15:11:16 UTC]]
|
27
|
+
(0.7ms) commit transaction
|
28
|
+
=> #<Entity id: 2, name: "Aleah", age: 39, is_human: true, created_at: "2017-01-30 15:11:16", updated_at: "2017-01-30 15:11:16">
|
35
29
|
```
|
36
30
|
|
37
31
|
By the way, all attributes which has default values on AR side will be skipped by default.
|
@@ -52,11 +46,18 @@ For example: Model `Superhero` has `name` and `power` attributes, so the value w
|
|
52
46
|
|
53
47
|
```
|
54
48
|
|
49
|
+
### Size
|
50
|
+
You can set a size and generate few records also
|
51
|
+
`SmartSeeds.plant(Entity, {}, 1000)`
|
52
|
+
```
|
53
|
+
=> "Done! 1000 entities was/were planted."
|
54
|
+
```
|
55
|
+
|
55
56
|
## Installation
|
56
57
|
Add this line to your application's Gemfile:
|
57
58
|
|
58
59
|
```ruby
|
59
|
-
gem 'smart_seeds'
|
60
|
+
gem 'smart_seeds', '~> 0.1.7'
|
60
61
|
```
|
61
62
|
|
62
63
|
And then execute:
|
data/lib/smart_seeds.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'faker'
|
2
|
+
require 'bulk_insert'
|
2
3
|
require 'smart_seeds/performing'
|
3
4
|
require 'smart_seeds/generator/base'
|
4
5
|
require 'smart_seeds/generator/binary'
|
@@ -16,7 +17,7 @@ require 'smart_seeds/generator/integer/foreign_key'
|
|
16
17
|
require 'smart_seeds/generator/faker'
|
17
18
|
|
18
19
|
module SmartSeeds
|
19
|
-
def self.plant(model, attrs={})
|
20
|
-
SmartSeeds::Performing.new(model, attrs).start
|
20
|
+
def self.plant(model, attrs={}, size=1)
|
21
|
+
SmartSeeds::Performing.new(model, attrs, size).start
|
21
22
|
end
|
22
23
|
end
|
@@ -18,7 +18,7 @@ module SmartSeeds
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def faker_classes_include_model_name?
|
21
|
-
# Check if Faker has a Class which called as
|
21
|
+
# Check if Faker has a Class which called as an AR Model
|
22
22
|
faker_classes = ::Faker.constants.select {|c| ::Faker.const_get(c).is_a? Class}
|
23
23
|
faker_classes.include? model.name.to_sym
|
24
24
|
end
|
@@ -6,32 +6,17 @@ module SmartSeeds
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def generate_value
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
enum = SmartSeeds::Generator::Enum.new(column, model)
|
10
|
+
foreign_key = SmartSeeds::Generator::ForeignKey.new(column, model)
|
11
|
+
|
12
|
+
if enum.enum?
|
13
|
+
enum.generate_value
|
14
|
+
elsif foreign_key.foreign_key?
|
15
|
+
foreign_key.generate_value
|
13
16
|
else
|
14
17
|
rand(1..66666)
|
15
18
|
end
|
16
19
|
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
20
|
end
|
36
21
|
end
|
37
22
|
end
|
@@ -1,35 +1,55 @@
|
|
1
1
|
module SmartSeeds
|
2
2
|
module Generator
|
3
3
|
class ForeignKey < SmartSeeds::Generator::Integer
|
4
|
+
include ActiveSupport::Inflector
|
5
|
+
|
4
6
|
def initialize(column, model)
|
5
7
|
super
|
6
8
|
end
|
7
9
|
|
8
10
|
def generate_value
|
9
|
-
klass =
|
10
|
-
|
11
|
+
klass = determine_klass
|
12
|
+
|
13
|
+
if klass.ids.empty?
|
14
|
+
raise ActiveRecord::ActiveRecordError,
|
15
|
+
"There are no records in #{camelized_model_name}. You have to add those first. You can run SmartSeeds.plant(#{camelized_model_name})"
|
16
|
+
else
|
17
|
+
klass.ids.sample
|
18
|
+
end
|
11
19
|
end
|
12
20
|
|
13
|
-
def
|
14
|
-
true if
|
21
|
+
def foreign_key?
|
22
|
+
true if associations_include_column?
|
15
23
|
end
|
16
24
|
|
17
25
|
private
|
18
26
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# Or it can be just a hero_id(Hero model)
|
27
|
+
def determine_klass
|
28
|
+
assocation = model_associations.select { |obj| obj.name == column_name_without_id.to_sym }
|
29
|
+
|
30
|
+
# if a class_name has been overrided in a model's class
|
31
|
+
if assocation.first.options.key? :class_name
|
32
|
+
assocation.first.options[:class_name].constantize
|
26
33
|
else
|
27
|
-
|
34
|
+
camelized_model_name
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
31
|
-
def
|
32
|
-
|
38
|
+
def model_associations
|
39
|
+
model.reflect_on_all_associations(:belongs_to)
|
40
|
+
end
|
41
|
+
|
42
|
+
def column_name_without_id
|
43
|
+
column.name.sub(/^*_id/, '')
|
44
|
+
end
|
45
|
+
|
46
|
+
def associations_include_column?
|
47
|
+
model_associations.map(&:name).include?(column_name_without_id.to_sym)
|
48
|
+
end
|
49
|
+
|
50
|
+
def camelized_model_name
|
51
|
+
# converts underscore words like big_category to BigCategory constant
|
52
|
+
camelize(column_name_without_id).constantize
|
33
53
|
end
|
34
54
|
end
|
35
55
|
end
|
@@ -1,27 +1,32 @@
|
|
1
1
|
module SmartSeeds
|
2
2
|
class Performing
|
3
|
-
|
3
|
+
include ActiveSupport::Inflector
|
4
|
+
|
5
|
+
def initialize(model, attrs, size)
|
4
6
|
@attrs = attrs
|
5
7
|
@model = model
|
6
8
|
@object = model.new
|
7
|
-
@
|
9
|
+
@size = size
|
10
|
+
@skippable_attributes = %w(id)
|
8
11
|
end
|
9
12
|
|
10
13
|
def start
|
11
|
-
|
12
|
-
|
14
|
+
size.times do
|
15
|
+
add_skippable_attributes
|
16
|
+
set_default_values
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
|
18
|
+
# User can send custom values in a hash: SmartSeeds.plant(Entity, {name: 'Aleah'})
|
19
|
+
# This method overrides default values to custom('name' in the example above)
|
20
|
+
set_custom_values if attrs.any?
|
21
|
+
object.save
|
22
|
+
end
|
17
23
|
|
18
|
-
|
19
|
-
object
|
24
|
+
return "Done! #{size} #{model.name.downcase.pluralize(size)} was/were planted."
|
20
25
|
end
|
21
26
|
|
22
27
|
private
|
23
28
|
|
24
|
-
attr_reader :attrs, :model, :object, :skippable_attributes
|
29
|
+
attr_reader :attrs, :model, :object, :size, :skippable_attributes, :worker
|
25
30
|
|
26
31
|
def add_skippable_attributes
|
27
32
|
# All default attributes which defined in AR object should be skipped by default
|
@@ -56,4 +61,4 @@ module SmartSeeds
|
|
56
61
|
skippable_attributes.include?(column_name)
|
57
62
|
end
|
58
63
|
end
|
59
|
-
end
|
64
|
+
end
|
data/lib/smart_seeds/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.7
|
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-
|
11
|
+
date: 2017-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -66,7 +66,8 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description:
|
69
|
+
description: It determines types of fields(attributes) of an ActiveRecord model and
|
70
|
+
creates records with random values for each of these attributes.
|
70
71
|
email:
|
71
72
|
- vitaliy.fry@gmail.com
|
72
73
|
executables: []
|
@@ -113,9 +114,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
114
|
version: '0'
|
114
115
|
requirements: []
|
115
116
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
117
|
+
rubygems_version: 2.6.8
|
117
118
|
signing_key:
|
118
119
|
specification_version: 4
|
119
|
-
summary:
|
120
|
+
summary: Gem for smart auto generating of new records with random values for your
|
121
|
+
ruby app.
|
120
122
|
test_files: []
|
121
|
-
has_rdoc:
|