evil-seed 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 411501048ad3322c19a3db3c781b9e7e19d48725
4
- data.tar.gz: 8587a602745f2d08375c9fb6636412c974df963d
2
+ SHA256:
3
+ metadata.gz: 49f3bab8298bfc4a918791ff92abb7d60d63f7a8d14bbb37b353bfa59fe33818
4
+ data.tar.gz: f11da93930102998a035b1ea83e1bc3c382ad829d43490a6ef7263af27d8e7c7
5
5
  SHA512:
6
- metadata.gz: bf912a9462601ae9b0b47bf987e1031789a46012a60138db5a5ba9d354739a6044d54839935c3c8366e0fce0daf04f4005270b16bdde4612ebb7798e8f7b721b
7
- data.tar.gz: 45219968ddf66748d6d0f40c8a39f86b635b5564d1047266711e14d94ec30679d9a9bd9c02743490ca30de9b7867f83dc7e62cd69018df90910de13458abc395
6
+ metadata.gz: f446f6c8634d9385d75f8ccdf7e2a76cdfea9b17886759ca63993a70044bc15e77f111442e9d323c4c158907c7751ee927c778b3c58e43c06f81bef737e26ff6
7
+ data.tar.gz: 604448e710c92999cffe29a6e137a4cee328f3f8bec5b2c44fa5c3ee3fb9b1393c87b104c2826e8792f4724cec34bfd576bd55e588dfc8bdd50eb63c991e0a56
data/.travis.yml CHANGED
@@ -1,29 +1,82 @@
1
+ dist: xenial
2
+ language: ruby
1
3
  cache: bundler
2
4
  sudo: false
3
- language: ruby
4
5
 
5
6
  addons:
7
+ postgresql: "10"
6
8
  apt:
7
9
  sources:
8
10
  - travis-ci/sqlite3
9
11
  packages:
10
12
  - sqlite3
11
13
 
14
+ services:
15
+ - mysql
16
+ - postgresql
17
+
18
+ before_install: gem install bundler -v '~> 1.17'
19
+
12
20
  matrix:
13
21
  include:
14
- - rvm: 2.4.1
22
+ - rvm: 3.0.2
23
+ gemfile: gemfiles/activerecord_master.gemfile
24
+ env: "DB=sqlite"
25
+ - rvm: 3.0.2
26
+ gemfile: gemfiles/activerecord_master.gemfile
27
+ env: "DB=postgresql"
28
+ - rvm: 3.0.2
29
+ gemfile: gemfiles/activerecord_master.gemfile
30
+ env: "DB=mysql"
31
+ - rvm: 2.7.4
32
+ gemfile: gemfiles/activerecord_6_1.gemfile
33
+ env: "DB=sqlite"
34
+ - rvm: 2.7.4
35
+ gemfile: gemfiles/activerecord_6_1.gemfile
36
+ env: "DB=postgresql"
37
+ - rvm: 2.7.4
38
+ gemfile: gemfiles/activerecord_6_1.gemfile
39
+ env: "DB=mysql"
40
+ - rvm: 2.7.4
41
+ gemfile: gemfiles/activerecord_6_0.gemfile
42
+ env: "DB=sqlite"
43
+ - rvm: 2.7.4
44
+ gemfile: gemfiles/activerecord_6_0.gemfile
45
+ env: "DB=postgresql"
46
+ - rvm: 2.7.4
47
+ gemfile: gemfiles/activerecord_6_0.gemfile
48
+ env: "DB=mysql"
49
+ - rvm: 2.6.8
50
+ gemfile: gemfiles/activerecord_5_2.gemfile
51
+ env: "DB=sqlite"
52
+ - rvm: 2.6.8
53
+ gemfile: gemfiles/activerecord_5_2.gemfile
54
+ env: "DB=postgresql"
55
+ - rvm: 2.6.8
56
+ gemfile: gemfiles/activerecord_5_2.gemfile
57
+ env: "DB=mysql"
58
+ - rvm: 2.5.9
59
+ gemfile: gemfiles/activerecord_5_1.gemfile
60
+ env: "DB=sqlite"
61
+ - rvm: 2.5.9
62
+ gemfile: gemfiles/activerecord_5_1.gemfile
63
+ env: "DB=postgresql"
64
+ - rvm: 2.5.9
65
+ gemfile: gemfiles/activerecord_5_1.gemfile
66
+ env: "DB=mysql"
67
+ - rvm: 2.4.10
15
68
  gemfile: gemfiles/activerecord_5_0.gemfile
16
69
  env: "DB=sqlite"
17
- - rvm: 2.4.1
70
+ - rvm: 2.4.10
18
71
  gemfile: gemfiles/activerecord_5_0.gemfile
19
72
  env: "DB=postgresql"
20
- - rvm: 2.4.1
73
+ - rvm: 2.4.10
21
74
  gemfile: gemfiles/activerecord_5_0.gemfile
22
75
  env: "DB=mysql"
23
- - rvm: 2.3.4
76
+ - rvm: 2.3.8
24
77
  gemfile: gemfiles/activerecord_4_2.gemfile
25
78
  env: "DB=postgresql"
26
- - rvm: 2.3.4
79
+ - rvm: 2.3.8
27
80
  gemfile: gemfiles/activerecord_4_2.gemfile
28
81
  env: "DB=sqlite"
29
82
  # Please note that gem can't be tested against MySQL on ActiveRecord 4.2 (Dump and restore test doesn't work)!
data/Appraisals CHANGED
@@ -1,7 +1,48 @@
1
- appraise 'activerecord-4-2' do
2
- gem 'activerecord', '~> 4.2.0'
3
- end
4
-
5
1
  appraise 'activerecord-5-0' do
6
2
  gem 'activerecord', '~> 5.0.0'
3
+ gem "pg", ">= 0.20", "< 2.0"
4
+ gem 'mysql2', '~> 0.4.4'
5
+ gem 'sqlite3', '~> 1.3.6'
6
+ end
7
+
8
+ appraise 'activerecord-5-1' do
9
+ gem 'activerecord', '~> 5.1.0'
10
+ gem "pg", ">= 0.20", "< 2.0"
11
+ gem 'mysql2', '~> 0.4.4'
12
+ gem 'sqlite3', '~> 1.3'
13
+ end
14
+
15
+ appraise 'activerecord-5-2' do
16
+ gem 'activerecord', '~> 5.2.0'
17
+ gem "pg", ">= 0.20", "< 2.0"
18
+ gem 'mysql2', '~> 0.4.4'
19
+ gem 'sqlite3', '~> 1.3'
20
+ end
21
+
22
+ appraise 'activerecord-6-0' do
23
+ gem 'activerecord', '~> 6.0.0'
24
+ gem "pg", ">= 0.20", "< 2.0"
25
+ gem 'mysql2', '~> 0.4.4'
26
+ gem 'sqlite3', '~> 1.4'
27
+ end
28
+
29
+ appraise 'activerecord-6-0' do
30
+ gem 'activerecord', '~> 6.0.0'
31
+ gem "pg", ">= 0.20", "< 2.0"
32
+ gem 'mysql2', '~> 0.4.4'
33
+ gem 'sqlite3', '~> 1.4'
34
+ end
35
+
36
+ appraise 'activerecord-6-1' do
37
+ gem 'activerecord', '~> 6.1.0'
38
+ gem "pg", "~> 1.1"
39
+ gem 'mysql2', '~> 0.5'
40
+ gem 'sqlite3', '~> 1.4'
41
+ end
42
+
43
+ appraise 'activerecord-master' do
44
+ gem 'activerecord', git: 'https://github.com/rails/rails.git'
45
+ gem "pg", "~> 1.1"
46
+ gem 'mysql2', '~> 0.5'
47
+ gem 'sqlite3', '~> 1.4'
7
48
  end
data/Gemfile CHANGED
@@ -4,7 +4,3 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in evil-seed.gemspec
6
6
  gemspec
7
-
8
- gem 'mysql2'
9
- gem 'pg'
10
- gem 'sqlite3'
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- [![Gem Version](https://badge.fury.io/rb/evil-seed.svg)](https://rubygems.org/gems/evil-seed) [![Build Status](https://travis-ci.org/evilmartians/evil-seed.svg?branch=master)](https://travis-ci.org/evilmartians/evil-seed)
1
+ [![Gem Version](https://badge.fury.io/rb/evil-seed.svg)](https://rubygems.org/gems/evil-seed)
2
+ [![Build Status](https://travis-ci.org/evilmartians/evil-seed.svg?branch=master)](https://travis-ci.org/evilmartians/evil-seed)
3
+ [![Cult of Martians](http://cultofmartians.com/assets/badges/badge.svg)](http://cultofmartians.com/tasks/evil-seed.html)
2
4
 
3
5
  # EvilSeed
4
6
 
@@ -40,7 +42,7 @@ Or install it yourself as:
40
42
  ### Configuration
41
43
 
42
44
  ```ruby
43
- require 'evil-seed'
45
+ require 'evil_seed'
44
46
 
45
47
  EvilSeed.configure do |config|
46
48
  # First, you should specify +root models+ and their +constraints+ to limit the number of dumped records:
@@ -90,7 +92,7 @@ EvilSeed.configure do |config|
90
92
  Just call the `#dump` method and pass a path where you want your SQL dump file to appear!
91
93
 
92
94
  ```ruby
93
- require 'evil-seed'
95
+ require 'evil_seed'
94
96
  EvilSeed.dump('path/to/new_dump.sql')
95
97
  ```
96
98
 
@@ -122,6 +124,53 @@ This gem has been tested against:
122
124
  3. Some internal refactoring is required
123
125
 
124
126
 
127
+ ## Standalone usage
128
+
129
+ If you want to use it as a standalone application, you can place exerything in a single file like this:
130
+
131
+ ```ruby
132
+ #!/usr/bin/env ruby
133
+
134
+ require 'bundler/inline'
135
+
136
+ gemfile do
137
+ source 'https://rubygems.org'
138
+ gem 'activerecord'
139
+ gem 'evil-seed'
140
+ gem 'mysql2'
141
+ end
142
+
143
+ # Describe your database layout with ActiveRecord models.
144
+ # See http://guides.rubyonrails.org/active_record_basics.html
145
+
146
+ class Category < ActiveRecord::Base
147
+ has_many :translations, class_name: "Category::Translation"
148
+ end
149
+
150
+ class Category::Translation < ActiveRecord::Base
151
+ belongs_to :category, inverse_of: :translations
152
+ end
153
+
154
+ # Configure evil-seed itself
155
+ EvilSeed.configure do |config|
156
+ config.root("Category", "id < ?", 1000)
157
+ end
158
+
159
+ # Connect to your database.
160
+ # See http://guides.rubyonrails.org/configuring.html#configuring-a-database)
161
+ ActiveRecord::Base.establish_connection(ENV.fetch("DATABASE_URL"))
162
+
163
+ # Create dump in dump.sql file in the same directory as this script
164
+ EvilSeed.dump(File.join(__dir__, "dump.sql").to_s)
165
+ ```
166
+
167
+ And launch it like so:
168
+
169
+ ```sh
170
+ DATABASE_URL=mysql2://user:pass@host/db ruby path/to/your/script.rb
171
+ ```
172
+
173
+
125
174
  ## Development
126
175
 
127
176
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/evil-seed.gemspec CHANGED
@@ -25,13 +25,15 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ['lib']
27
27
 
28
- spec.required_ruby_version = '~> 2.0'
28
+ spec.required_ruby_version = '>= 2.0'
29
29
 
30
- spec.add_dependency 'activerecord', '>= 4.2'
30
+ spec.add_dependency 'activerecord', '>= 5.0'
31
31
 
32
32
  spec.add_development_dependency 'rake', '~> 12.0'
33
33
  spec.add_development_dependency 'minitest', '~> 5.0'
34
- spec.add_development_dependency 'pg', '~> 0.20'
34
+ spec.add_development_dependency 'pg', '>= 0.20'
35
+ spec.add_development_dependency 'mysql2'
36
+ spec.add_development_dependency 'sqlite3'
35
37
  spec.add_development_dependency 'rubocop'
36
38
  spec.add_development_dependency 'bundler'
37
39
  spec.add_development_dependency 'pry'
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "mysql2"
6
- gem "pg"
7
- gem "sqlite3"
8
5
  gem "activerecord", "~> 5.0.0"
6
+ gem "pg", ">= 0.20", "< 2.0"
7
+ gem "mysql2", "~> 0.4.4"
8
+ gem "sqlite3", "~> 1.3.6"
9
9
 
10
- gemspec path: ".."
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 5.1.0"
6
+ gem "pg", ">= 0.20", "< 2.0"
7
+ gem "mysql2", "~> 0.4.4"
8
+ gem "sqlite3", "~> 1.3"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 5.2.0"
6
+ gem "pg", ">= 0.20", "< 2.0"
7
+ gem "mysql2", "~> 0.4.4"
8
+ gem "sqlite3", "~> 1.3"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 6.0.0"
6
+ gem "pg", ">= 0.20", "< 2.0"
7
+ gem "mysql2", "~> 0.4.4"
8
+ gem "sqlite3", "~> 1.4"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 6.1.0"
6
+ gem "pg", "~> 1.1"
7
+ gem "mysql2", "~> 0.5"
8
+ gem "sqlite3", "~> 1.4"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", git: "https://github.com/rails/rails.git"
6
+ gem "pg", "~> 1.1"
7
+ gem "mysql2", "~> 0.5"
8
+ gem "sqlite3", "~> 1.4"
9
+
10
+ gemspec path: "../"
data/lib/evil-seed.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './evil_seed'
@@ -33,13 +33,13 @@ module EvilSeed
33
33
  end
34
34
 
35
35
  def respond_to_missing?(attribute_name)
36
- @model_class.attribute_names.include?(attribute_name.to_s) || super
36
+ @model_class.column_names.include?(attribute_name.to_s) || super
37
37
  end
38
38
 
39
39
  private
40
40
 
41
41
  def method_missing(attribute_name, &block)
42
- return super unless @model_class.attribute_names.include?(attribute_name.to_s)
42
+ return super unless @model_class.column_names.include?(attribute_name.to_s)
43
43
  @changers[attribute_name.to_s] = block
44
44
  end
45
45
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'tempfile'
2
3
 
3
4
  module EvilSeed
4
5
  # - Runs all transformation objects for every tuple
@@ -52,7 +53,7 @@ module EvilSeed
52
53
  def insert_statement
53
54
  connection = model_class.connection
54
55
  table_name = connection.quote_table_name(model_class.table_name)
55
- columns = model_class.attribute_names.map { |c| connection.quote_column_name(c) }.join(', ')
56
+ columns = model_class.column_names.map { |c| connection.quote_column_name(c) }.join(', ')
56
57
  "INSERT INTO #{table_name} (#{columns}) VALUES\n"
57
58
  end
58
59
 
@@ -72,27 +73,8 @@ module EvilSeed
72
73
 
73
74
  def prepare(attributes)
74
75
  attributes.map do |key, value|
75
- model_class.connection.quote(serialize(attribute_types[key], value))
76
- end
77
- end
78
-
79
- # Handles ActiveRecord API differences between AR 4.2 and 5.0
80
- def attribute_types
81
- return @attribute_types if defined?(@attribute_types)
82
- @attribute_types = if model_class.respond_to?(:attribute_types)
83
- model_class.attribute_types
84
- else
85
- model_class.column_types
86
- end
87
- end
88
-
89
- # Handles ActiveRecord API differences between AR 4.2 and 5.0
90
- # Casts a value from the ruby type to a type that the database knows how to understand.
91
- def serialize(type, value)
92
- if type.respond_to?(:serialize)
93
- type.serialize(value)
94
- else
95
- type.type_cast_for_database(value)
76
+ type = model_class.attribute_types[key]
77
+ model_class.connection.quote(type.serialize(value))
96
78
  end
97
79
  end
98
80
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/core_ext/array/grouping'
4
+
3
5
  # As method ActiveRecord::Relation#in_batches is available only since ActiveRecord 5.0
4
6
  # we will backport it only for us via refinements for ActiveRecord 4.2 compatibility.
5
7
  unless ActiveRecord::Batches.instance_methods(false).include?(:in_batches)
@@ -122,8 +124,8 @@ module EvilSeed
122
124
  # @param relation [ActiveRecord::Relation]
123
125
  # @return [Array<Hash{String => String, Integer, Float, Boolean, nil}>]
124
126
  def fetch_attributes(relation)
125
- relation.pluck(*model_class.attribute_names).map do |row|
126
- Hash[model_class.attribute_names.zip(row)]
127
+ relation.pluck(*model_class.column_names).map do |row|
128
+ Hash[model_class.column_names.zip(row)]
127
129
  end
128
130
  end
129
131
 
@@ -144,7 +146,7 @@ module EvilSeed
144
146
  next false if reflection.options[:polymorphic] # TODO: Add support for polymorphic belongs_to
145
147
  excluded = root.excluded?("#{association_path}.#{reflection.name}") || reflection.name == inverse_reflection
146
148
  if excluded
147
- nullify_columns << reflection.foreign_key
149
+ nullify_columns << reflection.foreign_key if model_class.column_names.include?(reflection.foreign_key)
148
150
  else
149
151
  foreign_keys[reflection.name] = reflection.foreign_key
150
152
  table_names[reflection.name] = reflection.table_name
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EvilSeed
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evil-seed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Novikov
8
8
  - Vladimir Dementyev
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-05-15 00:00:00.000000000 Z
12
+ date: 2022-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '4.2'
20
+ version: '5.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '4.2'
27
+ version: '5.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -57,16 +57,44 @@ dependencies:
57
57
  name: pg
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0.20'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "~>"
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0.20'
70
+ - !ruby/object:Gem::Dependency
71
+ name: mysql2
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: sqlite3
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
70
98
  - !ruby/object:Gem::Dependency
71
99
  name: rubocop
72
100
  requirement: !ruby/object:Gem::Requirement
@@ -143,8 +171,14 @@ files:
143
171
  - bin/console
144
172
  - bin/setup
145
173
  - evil-seed.gemspec
146
- - gemfiles/activerecord_4_2.gemfile
174
+ - gemfiles/.bundle/config
147
175
  - gemfiles/activerecord_5_0.gemfile
176
+ - gemfiles/activerecord_5_1.gemfile
177
+ - gemfiles/activerecord_5_2.gemfile
178
+ - gemfiles/activerecord_6_0.gemfile
179
+ - gemfiles/activerecord_6_1.gemfile
180
+ - gemfiles/activerecord_master.gemfile
181
+ - lib/evil-seed.rb
148
182
  - lib/evil/seed.rb
149
183
  - lib/evil_seed.rb
150
184
  - lib/evil_seed/anonymizer.rb
@@ -161,13 +195,13 @@ homepage: https://github.com/palkan/evil-seed
161
195
  licenses:
162
196
  - MIT
163
197
  metadata: {}
164
- post_install_message:
198
+ post_install_message:
165
199
  rdoc_options: []
166
200
  require_paths:
167
201
  - lib
168
202
  required_ruby_version: !ruby/object:Gem::Requirement
169
203
  requirements:
170
- - - "~>"
204
+ - - ">="
171
205
  - !ruby/object:Gem::Version
172
206
  version: '2.0'
173
207
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -176,9 +210,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
210
  - !ruby/object:Gem::Version
177
211
  version: '0'
178
212
  requirements: []
179
- rubyforge_project:
180
- rubygems_version: 2.6.4
181
- signing_key:
213
+ rubygems_version: 3.2.22
214
+ signing_key:
182
215
  specification_version: 4
183
216
  summary: Create partial and anonymized production database dumps for use in development
184
217
  test_files: []
@@ -1,10 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "mysql2"
6
- gem "pg"
7
- gem "sqlite3"
8
- gem "activerecord", "~> 4.2.0"
9
-
10
- gemspec path: ".."