jewel_seed 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67b28a578bf293cccefc903301dc382568add627
4
+ data.tar.gz: c8d37760f48ac9a86376a12c57d4e19ad17fccfd
5
+ SHA512:
6
+ metadata.gz: 10f61a0c0320f573aab75c90598cec924f15adb26f44f1bec9bfb3dd132cad21dffd83ca313ef571a3d995c8b752ee45ef1fd0d62d0929aed73ac3271b553b76
7
+ data.tar.gz: 2bed6695255e7b7ce2cffeeb6a4a63bc4ec9a4329ca11b3a9c93e758b6902163de0adf156b7299bbc2a90703395c8af9f719c8c2129901a3b669804aab14e325
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ branches:
5
+ only:
6
+ - master
7
+ - feature/travis
8
+ notifications:
9
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jewel_seed.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 sinsoku
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,63 @@
1
+ # JewelSeed
2
+
3
+ JewelSeed migrate seed files. It is efficient, quick, and best seed manager for Rails.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jewel_seed'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```bash
16
+ $ bundle install
17
+ ```
18
+
19
+ After running `bundle install`, setup databases for JewelSeed:
20
+ ```bash
21
+ $ rake jseed:install
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ ### Basic Usage
27
+
28
+ Run the JewelSeed generator to add seed file:
29
+ ```bash
30
+ $ rails g jseed InitUser
31
+ ```
32
+
33
+ Then edit generated seed file, and migrate:
34
+ ```bash
35
+ $ rake jseed:migrate
36
+ ```
37
+
38
+ ### Dump seeds & Load seeds
39
+
40
+ Create `db/seeds/*.rb` files:
41
+ ```bash
42
+ $ rake jseed:dump
43
+ ```
44
+
45
+ And load seed files in `db/seeds/*.rb`:
46
+ ```bash
47
+ $ rake jseed:load
48
+ ```
49
+
50
+ ### Rollback
51
+
52
+ Rollback seed data:
53
+ ```
54
+ $ rake jseed:rollback
55
+ ```
56
+
57
+ ## Contributing
58
+
59
+ 1. Fork it
60
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
61
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
62
+ 4. Push to the branch (`git push origin my-new-feature`)
63
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jewel_seed/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "jewel_seed"
8
+ spec.version = JewelSeed::VERSION
9
+ spec.authors = ["sinsoku"]
10
+ spec.email = ["sinsoku.listy@gmail.com"]
11
+ spec.description = 'JewelSeed is best seed manager for Rails'
12
+ spec.summary = 'JewelSeed is best seed manager for Rails'
13
+ spec.homepage = "https://github.com/sinsoku/jewel_seed"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "activesupport", "~> 4.0.0"
22
+ spec.add_dependency "activerecord", "~> 4.0.0"
23
+ spec.add_dependency "activerecord-import"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.3"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "rspec"
28
+ end
@@ -0,0 +1,2 @@
1
+ Description:
2
+ Creates a seed file
@@ -0,0 +1,13 @@
1
+ module JewelSeed
2
+ module Generators
3
+ class SeedGenerator < Rails::Generators::NamedBase
4
+ source_root File.expand_path("../templates", __FILE__)
5
+ namespace :jseed
6
+
7
+ def create_seed_file
8
+ timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S")
9
+ template 'seed.rb', "#{SEED_MIGRATE_PATH}/#{timestamp}_#{file_name}.rb"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ class <%= file_name.camelize %> < JewelSeed::Migration
2
+ def up
3
+ # Example import using ActiveRecord Models
4
+ #
5
+ # users = [
6
+ # User.new(id: 1, name: 'nanoha'),
7
+ # User.new(id: 2, name: 'fate')
8
+ # ]
9
+ # seed users
10
+ end
11
+
12
+ def down
13
+ # Example simple delete records
14
+ #
15
+ # User.delete_all(id: [1, 2])
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_record'
2
+ require 'active_support/all'
3
+ require 'activerecord-import'
4
+
5
+ require "jewel_seed/version"
6
+ require 'jewel_seed/railtie' if defined? Rails
7
+ require 'jewel_seed/migration'
8
+ require 'jewel_seed/migration_proxy'
9
+ require 'jewel_seed/models/seed_migration'
10
+ require 'jewel_seed/models/seed_migration_table'
11
+ require 'jewel_seed/migrator'
12
+ require 'jewel_seed/dumper'
13
+ require 'jewel_seed/loader'
14
+
15
+ module JewelSeed
16
+ SEED_PATH = 'db/seeds'
17
+ SEED_MIGRATE_PATH = 'db/seed_migrate'
18
+ end
@@ -0,0 +1,29 @@
1
+ module JewelSeed
2
+ class Dumper
3
+ class << self
4
+ def dump
5
+ Dir.mkdir(SEED_PATH) unless File.exist?(SEED_PATH)
6
+
7
+ SeedMigrationTable.table_names.each do |t|
8
+ dump_table(t)
9
+ end
10
+ end
11
+
12
+ def dump_table(table)
13
+ klass = table.classify.constantize
14
+ columns = klass.column_names.delete_if { |c| ['created_at', 'updated_at'].include? c }
15
+ open("db/seeds/#{table}.rb", 'w') do |stream|
16
+ stream.puts "ActiveRecord::Base.transaction do"
17
+ stream.puts "#{klass}.delete_all"
18
+ stream.puts "#{klass}.import("
19
+ stream.puts "#{columns},["
20
+ klass.find_each do |record|
21
+ stream.puts "#{record.attributes.values_at(*columns)},"
22
+ end
23
+ stream.puts "])"
24
+ stream.puts "end"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ module JewelSeed
2
+ class Loader
3
+ class << self
4
+ def load
5
+ SeedMigrationTable.table_names.each do |t|
6
+ path = "#{SEED_PATH}/#{t}.rb"
7
+ require(File.expand_path(path))
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+ module JewelSeed
2
+ class Migration
3
+ attr_reader :table_names
4
+
5
+ def initialize
6
+ @table_names = []
7
+ end
8
+
9
+ def seed(*args, **opts)
10
+ models = args.first
11
+ klass = models.first.class
12
+ table_name = klass.table_name
13
+ @table_names << table_name
14
+ puts " - #{klass}"
15
+ models.each { |model| puts model.inspect }
16
+ delete_ids = models.map(&:id).uniq.compact
17
+ klass.delete_all(id: delete_ids)
18
+ klass.import(*args, opts)
19
+ end
20
+
21
+ def up
22
+ raise NotImplementedError
23
+ end
24
+
25
+ def down
26
+ raise NotImplementedError
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,42 @@
1
+ module JewelSeed
2
+ class MigrationProxy
3
+ attr_reader :version, :name
4
+
5
+ def initialize(file_name)
6
+ @file_name = file_name
7
+ version, name = @file_name.scan(/([0-9]+)_([_a-z0-9]*)\.rb/).first
8
+ @version = version.to_i
9
+ @name = name.camelize
10
+ end
11
+
12
+ def up
13
+ migration.up
14
+
15
+ seed_migration = SeedMigration.create!(version: version)
16
+ seed_migration_tables = migration.table_names.map do |t|
17
+ SeedMigrationTable.new(seed_migration: seed_migration, table_name: t)
18
+ end
19
+ SeedMigrationTable.import(seed_migration_tables)
20
+ end
21
+
22
+ def down
23
+ migration.down
24
+
25
+ seed_migration = SeedMigration.find_by(version: version)
26
+ seed_migration.destroy
27
+ end
28
+
29
+ def migration_class
30
+ name.constantize
31
+ end
32
+
33
+ def migration
34
+ @migration ||= load_migration
35
+ end
36
+
37
+ def load_migration
38
+ require(File.expand_path(@file_name))
39
+ migration_class.new
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ module JewelSeed
2
+ class Migrator
3
+ class << self
4
+ def setup
5
+ SeedMigration.create_table unless SeedMigration.table_exists?
6
+ SeedMigrationTable.create_table unless SeedMigrationTable.table_exists?
7
+ end
8
+
9
+ def migration_files
10
+ Dir["#{SEED_MIGRATE_PATH}/[0-9]*_*.rb"]
11
+ end
12
+
13
+ def migrations
14
+ migration_files.map { |f| MigrationProxy.new(f) }
15
+ end
16
+
17
+ def current_version
18
+ SeedMigration.current_version.to_i
19
+ end
20
+
21
+ def target_migrations
22
+ migrations.select { |m| m.version > current_version }
23
+ end
24
+
25
+ def migrate
26
+ target_migrations.each do |migration|
27
+ ActiveRecord::Base.transaction do
28
+ migration.up
29
+ end
30
+ end
31
+ end
32
+
33
+ def rollback
34
+ migration = migrations.find { |m| m.version == current_version }
35
+
36
+ ActiveRecord::Base.transaction do
37
+ migration.down
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ module JewelSeed
2
+ class SeedMigration < ActiveRecord::Base
3
+ has_many :seed_migration_tables, dependent: :delete_all
4
+ scope :sorted_version, -> { order(arel_table[:version].asc) }
5
+ scope :loading_tables, -> { includes(:seed_migration_tables) }
6
+
7
+ class << self
8
+ def current_version
9
+ order(arel_table[:version].desc).pluck(:version).first
10
+ end
11
+
12
+ def create_table
13
+ CreateSeedMigration.new.migrate(:up)
14
+ end
15
+
16
+ def drop_table
17
+ CreateSeedMigration.new.migrate(:down)
18
+ end
19
+ end
20
+ end
21
+
22
+ class CreateSeedMigration < ActiveRecord::Migration
23
+ def change
24
+ create_table :seed_migrations do |t|
25
+ t.string :version, null: false
26
+ t.timestamps
27
+ end
28
+ add_index :seed_migrations, :version, unique: true
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ module JewelSeed
2
+ class SeedMigrationTable < ActiveRecord::Base
3
+ belongs_to :seed_migration
4
+
5
+ class << self
6
+ def table_names
7
+ pluck(:table_name).uniq
8
+ end
9
+
10
+ def create_table
11
+ CreateSeedMigrationTable.new.migrate(:up)
12
+ end
13
+
14
+ def drop_table
15
+ CreateSeedMigrationTable.new.migrate(:down)
16
+ end
17
+ end
18
+ end
19
+
20
+ class CreateSeedMigrationTable < ActiveRecord::Migration
21
+ def change
22
+ create_table :seed_migration_tables do |t|
23
+ t.references :seed_migration, index: true, null: false
24
+ t.string :table_name
25
+ t.timestamps
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ module JewelSeed
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ load 'jewel_seed/tasks/jewel_seed.rake'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ namespace :jseed do
2
+ desc 'Setup databases for JewelSeed'
3
+ task install: :environment do
4
+ JewelSeed::Migrator.setup
5
+ Rake::Task['db:_dump'].invoke
6
+ end
7
+
8
+ desc 'Migrate seed files'
9
+ task migrate: :environment do
10
+ JewelSeed::Migrator.migrate
11
+ end
12
+
13
+ desc 'Rollback seed files'
14
+ task rollback: :environment do
15
+ JewelSeed::Migrator.rollback
16
+ end
17
+
18
+ desc 'Create db/seeds/*.rb files'
19
+ task dump: :environment do
20
+ JewelSeed::Dumper.dump
21
+ end
22
+
23
+ desc 'Load db/seeds/*.rb files into the database'
24
+ task load: :environment do
25
+ JewelSeed::Loader.load
26
+ end
27
+
28
+ desc 'Show the current seed version'
29
+ task version: :environment do
30
+ puts "Current version: #{JewelSeed::SeedMigration.current_version}"
31
+ end
32
+
33
+ desc 'Show all seed versions'
34
+ task versions: :environment do
35
+ JewelSeed::SeedMigration.loading_tables.sorted_version.each do |seed_migration|
36
+ tables = seed_migration.seed_migration_tables.pluck(:table_name)
37
+ puts "#{seed_migration.version} #{tables.join(' ')}"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ module JewelSeed
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe JewelSeed do
4
+ it 'should have a version number' do
5
+ JewelSeed::VERSION.should_not be_nil
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe JewelSeed::MigrationProxy do
4
+ describe 'initialize' do
5
+ let(:file_name) { 'db/seed_migrate/20140514211500_init_user.rb' }
6
+ subject { JewelSeed::MigrationProxy.new(file_name) }
7
+
8
+ its(:version) { should eq 20140514211500 }
9
+ its(:name) { should eq 'InitUser' }
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe JewelSeed::Migrator do
4
+ end
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'active_record'
3
+ require 'active_support/all'
4
+ require 'jewel_seed'
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jewel_seed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - sinsoku
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord-import
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: JewelSeed is best seed manager for Rails
98
+ email:
99
+ - sinsoku.listy@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - jewel_seed.gemspec
112
+ - lib/generators/USAGE
113
+ - lib/generators/jseed_generator.rb
114
+ - lib/generators/templates/seed.rb
115
+ - lib/jewel_seed.rb
116
+ - lib/jewel_seed/dumper.rb
117
+ - lib/jewel_seed/loader.rb
118
+ - lib/jewel_seed/migration.rb
119
+ - lib/jewel_seed/migration_proxy.rb
120
+ - lib/jewel_seed/migrator.rb
121
+ - lib/jewel_seed/models/seed_migration.rb
122
+ - lib/jewel_seed/models/seed_migration_table.rb
123
+ - lib/jewel_seed/railtie.rb
124
+ - lib/jewel_seed/tasks/jewel_seed.rake
125
+ - lib/jewel_seed/version.rb
126
+ - spec/jewel_seed_spec.rb
127
+ - spec/lib/jewel_seed/migrator_proxy_spec.rb
128
+ - spec/lib/jewel_seed/migrator_spec.rb
129
+ - spec/spec_helper.rb
130
+ homepage: https://github.com/sinsoku/jewel_seed
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.2.2
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: JewelSeed is best seed manager for Rails
154
+ test_files:
155
+ - spec/jewel_seed_spec.rb
156
+ - spec/lib/jewel_seed/migrator_proxy_spec.rb
157
+ - spec/lib/jewel_seed/migrator_spec.rb
158
+ - spec/spec_helper.rb