config_scripts 0.4.1
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 +7 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +124 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +1 -0
- data/TODO.md +8 -0
- data/config_scripts.gemspec +31 -0
- data/lib/config_scripts/generators/config_script.rb +24 -0
- data/lib/config_scripts/generators/migrations.rb +36 -0
- data/lib/config_scripts/generators.rb +2 -0
- data/lib/config_scripts/scripts/script.rb +135 -0
- data/lib/config_scripts/scripts/script_history.rb +39 -0
- data/lib/config_scripts/scripts.rb +9 -0
- data/lib/config_scripts/seeds/seed_set.rb +321 -0
- data/lib/config_scripts/seeds/seed_type.rb +361 -0
- data/lib/config_scripts/seeds.rb +8 -0
- data/lib/config_scripts/tasks/pending_migrations.rake +11 -0
- data/lib/config_scripts/tasks/seeds.rake +18 -0
- data/lib/config_scripts/tasks.rb +12 -0
- data/lib/config_scripts/version.rb +4 -0
- data/lib/config_scripts.rb +9 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/models/hair_color.rb +2 -0
- data/spec/dummy/app/models/person.rb +4 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20140208014550_create_config_scripts.rb +7 -0
- data/spec/dummy/db/migrate/20140208161829_create_people.rb +9 -0
- data/spec/dummy/db/migrate/20140208182050_create_hair_colors.rb +9 -0
- data/spec/dummy/db/migrate/20140208182101_add_hair_color_to_person.rb +6 -0
- data/spec/dummy/db/migrate/20140208225801_add_scope_to_people.rb +6 -0
- data/spec/dummy/db/migrate/20140209132911_add_hex_value_to_hair_color.rb +5 -0
- data/spec/dummy/db/schema.rb +38 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/generators/config_script_spec.rb +23 -0
- data/spec/generators/migrations_spec.rb +23 -0
- data/spec/scripts/script_history_spec.rb +53 -0
- data/spec/scripts/script_spec.rb +282 -0
- data/spec/seeds/seed_set_spec.rb +371 -0
- data/spec/seeds/seed_type_spec.rb +439 -0
- data/spec/spec_helper.rb +38 -0
- data/templates/config_script.rb +9 -0
- data/templates/create_config_scripts_migration.rb +7 -0
- metadata +321 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3f9ab8bf09440a9182b9450651756d9cdde28109
|
4
|
+
data.tar.gz: ab9ff7ebde2313fee3071c9dcff710219cc1d3bf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c51d874865f2080a14ee8a13576b828fbdf8dd5935e32b1311384b276a16816b3d18283da8fb97c0dda8b0bf81f9dd5dc9ae136fa67dd97aaa4341dc2f4516e9
|
7
|
+
data.tar.gz: 13a589c68a9ce1d9a9b44aa00bf8593aade3c1d10e3bc72051226a65ad69e1d08015901c33f47efffc522548210c4973650b149b2b9a5624709e97cba6aa103f
|
data/.gitignore
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# YARD Documentation
|
2
|
+
.yardoc
|
3
|
+
doc/code
|
4
|
+
|
5
|
+
# Simplecov Code Coverage
|
6
|
+
doc/coverage
|
7
|
+
|
8
|
+
# Files from Dummy App for Specs
|
9
|
+
spec/dummy/db/*.sqlite3
|
10
|
+
spec/dummy/log/*.log
|
11
|
+
|
12
|
+
# tmp files creating from specs
|
13
|
+
tmp/
|
14
|
+
|
15
|
+
# Package gem files
|
16
|
+
pkg/
|
data/.rspec
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-o doc/code
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Version 0.4.0 - 9 February 2014
|
2
|
+
|
3
|
+
* Adds support for polymorphic foreign keys
|
4
|
+
* Adds support for custom readers and writers for attribute values.
|
5
|
+
* Adds the ability to read and write individual seed sets.
|
6
|
+
|
7
|
+
# Version 0.3.0 - 8 February 2014
|
8
|
+
|
9
|
+
* Adds the last of the specs.
|
10
|
+
|
11
|
+
# Version 0.2.0 - 3 February 2014
|
12
|
+
|
13
|
+
* Adds documentation
|
14
|
+
|
15
|
+
# Version 0.1.0 - 2 February 2014
|
16
|
+
|
17
|
+
* Initial release
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
config_scripts (0.4.1)
|
5
|
+
rails (> 3.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
actionmailer (4.0.2)
|
11
|
+
actionpack (= 4.0.2)
|
12
|
+
mail (~> 2.5.4)
|
13
|
+
actionpack (4.0.2)
|
14
|
+
activesupport (= 4.0.2)
|
15
|
+
builder (~> 3.1.0)
|
16
|
+
erubis (~> 2.7.0)
|
17
|
+
rack (~> 1.5.2)
|
18
|
+
rack-test (~> 0.6.2)
|
19
|
+
activemodel (4.0.2)
|
20
|
+
activesupport (= 4.0.2)
|
21
|
+
builder (~> 3.1.0)
|
22
|
+
activerecord (4.0.2)
|
23
|
+
activemodel (= 4.0.2)
|
24
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
25
|
+
activesupport (= 4.0.2)
|
26
|
+
arel (~> 4.0.0)
|
27
|
+
activerecord-deprecated_finders (1.0.3)
|
28
|
+
activesupport (4.0.2)
|
29
|
+
i18n (~> 0.6, >= 0.6.4)
|
30
|
+
minitest (~> 4.2)
|
31
|
+
multi_json (~> 1.3)
|
32
|
+
thread_safe (~> 0.1)
|
33
|
+
tzinfo (~> 0.3.37)
|
34
|
+
arel (4.0.2)
|
35
|
+
atomic (1.1.14)
|
36
|
+
builder (3.1.4)
|
37
|
+
diff-lcs (1.2.5)
|
38
|
+
docile (1.1.3)
|
39
|
+
erubis (2.7.0)
|
40
|
+
generator_spec (0.9.2)
|
41
|
+
activesupport (>= 3.0.0)
|
42
|
+
railties (>= 3.0.0)
|
43
|
+
hike (1.2.3)
|
44
|
+
i18n (0.6.9)
|
45
|
+
mail (2.5.4)
|
46
|
+
mime-types (~> 1.16)
|
47
|
+
treetop (~> 1.4.8)
|
48
|
+
mime-types (1.25.1)
|
49
|
+
minitest (4.7.5)
|
50
|
+
multi_json (1.8.4)
|
51
|
+
polyglot (0.3.3)
|
52
|
+
rack (1.5.2)
|
53
|
+
rack-test (0.6.2)
|
54
|
+
rack (>= 1.0)
|
55
|
+
rails (4.0.2)
|
56
|
+
actionmailer (= 4.0.2)
|
57
|
+
actionpack (= 4.0.2)
|
58
|
+
activerecord (= 4.0.2)
|
59
|
+
activesupport (= 4.0.2)
|
60
|
+
bundler (>= 1.3.0, < 2.0)
|
61
|
+
railties (= 4.0.2)
|
62
|
+
sprockets-rails (~> 2.0.0)
|
63
|
+
railties (4.0.2)
|
64
|
+
actionpack (= 4.0.2)
|
65
|
+
activesupport (= 4.0.2)
|
66
|
+
rake (>= 0.8.7)
|
67
|
+
thor (>= 0.18.1, < 2.0)
|
68
|
+
rake (10.1.1)
|
69
|
+
rspec (2.14.1)
|
70
|
+
rspec-core (~> 2.14.0)
|
71
|
+
rspec-expectations (~> 2.14.0)
|
72
|
+
rspec-mocks (~> 2.14.0)
|
73
|
+
rspec-core (2.14.7)
|
74
|
+
rspec-expectations (2.14.5)
|
75
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
76
|
+
rspec-mocks (2.14.5)
|
77
|
+
rspec-rails (2.14.1)
|
78
|
+
actionpack (>= 3.0)
|
79
|
+
activemodel (>= 3.0)
|
80
|
+
activesupport (>= 3.0)
|
81
|
+
railties (>= 3.0)
|
82
|
+
rspec-core (~> 2.14.0)
|
83
|
+
rspec-expectations (~> 2.14.0)
|
84
|
+
rspec-mocks (~> 2.14.0)
|
85
|
+
simplecov (0.8.2)
|
86
|
+
docile (~> 1.1.0)
|
87
|
+
multi_json
|
88
|
+
simplecov-html (~> 0.8.0)
|
89
|
+
simplecov-html (0.8.0)
|
90
|
+
sprockets (2.10.1)
|
91
|
+
hike (~> 1.2)
|
92
|
+
multi_json (~> 1.0)
|
93
|
+
rack (~> 1.0)
|
94
|
+
tilt (~> 1.1, != 1.3.0)
|
95
|
+
sprockets-rails (2.0.1)
|
96
|
+
actionpack (>= 3.0)
|
97
|
+
activesupport (>= 3.0)
|
98
|
+
sprockets (~> 2.8)
|
99
|
+
sqlite3 (1.3.8)
|
100
|
+
thor (0.18.1)
|
101
|
+
thread_safe (0.1.3)
|
102
|
+
atomic
|
103
|
+
tilt (1.4.1)
|
104
|
+
timecop (0.7.1)
|
105
|
+
treetop (1.4.15)
|
106
|
+
polyglot
|
107
|
+
polyglot (>= 0.3.1)
|
108
|
+
tzinfo (0.3.38)
|
109
|
+
yard (0.8.7.3)
|
110
|
+
|
111
|
+
PLATFORMS
|
112
|
+
ruby
|
113
|
+
|
114
|
+
DEPENDENCIES
|
115
|
+
bundler (~> 1.3)
|
116
|
+
config_scripts!
|
117
|
+
generator_spec
|
118
|
+
rake
|
119
|
+
rspec
|
120
|
+
rspec-rails
|
121
|
+
simplecov
|
122
|
+
sqlite3
|
123
|
+
timecop
|
124
|
+
yard
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 John Brownlee
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# ConfigScripts
|
2
|
+
|
3
|
+
This gem provides libraries for generating configuration scripts, and reading
|
4
|
+
and writing seed data to spreadsheets.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'config_scripts'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install config_scripts
|
19
|
+
|
20
|
+
Generate the new migrations for the config_scripts table:
|
21
|
+
|
22
|
+
$ rails g config_scripts:migrations
|
23
|
+
|
24
|
+
And run them:
|
25
|
+
|
26
|
+
$ rake db:migrate
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
### Config Scripts
|
31
|
+
|
32
|
+
#### Generate a new config script:
|
33
|
+
|
34
|
+
$ rails g config_scripts:config_script MyConfigScript
|
35
|
+
|
36
|
+
This will add a file to the `db/config_scripts` directory.
|
37
|
+
|
38
|
+
#### Run all the pending config scripts:
|
39
|
+
|
40
|
+
$ rake config_scripts:run_pending
|
41
|
+
|
42
|
+
### Seed Data
|
43
|
+
|
44
|
+
#### Defining Seed Data:
|
45
|
+
|
46
|
+
Create a file in the directory `db/seeds/definitions`. Examples of defining seed
|
47
|
+
data will be coming in the future.
|
48
|
+
|
49
|
+
#### Dumping seed data to the disk:
|
50
|
+
|
51
|
+
$ rake config_scripts:seeds:dump
|
52
|
+
|
53
|
+
#### Loading the seed data from the disk:
|
54
|
+
|
55
|
+
$ rake config_scripts::seeds::load
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/TODO.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'config_scripts/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "config_scripts"
|
8
|
+
spec.version = ConfigScripts::VERSION
|
9
|
+
spec.authors = ["John Brownlee"]
|
10
|
+
spec.email = ["apps@johnbrownlee.com"]
|
11
|
+
spec.description = "Library for creating trackable config scripts, and reading and writing seed data into spreadsheets"
|
12
|
+
spec.summary = "Config scripts and seed files for Rails"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "rails", "> 3.0.0"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "yard"
|
26
|
+
spec.add_development_dependency "simplecov"
|
27
|
+
spec.add_development_dependency 'sqlite3'
|
28
|
+
spec.add_development_dependency 'timecop'
|
29
|
+
spec.add_development_dependency 'generator_spec'
|
30
|
+
spec.add_development_dependency 'rspec-rails'
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module ConfigScripts
|
3
|
+
# This class provides a generator for creating a config new script.
|
4
|
+
class ConfigScriptGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path('../../../../templates', __FILE__)
|
6
|
+
|
7
|
+
# This method creates a new config script.
|
8
|
+
#
|
9
|
+
# It will take a template file from +templates/config_scripts+, and the
|
10
|
+
# name passed in when runing the generator, and create a file under
|
11
|
+
# +db/config_scripts+ in the app.
|
12
|
+
#
|
13
|
+
# The config script filename will be prefixed with a timestamp, like a
|
14
|
+
# database migration. The class defined in the config script will have
|
15
|
+
# the name passed in to the generator.
|
16
|
+
#
|
17
|
+
# @return [Nil]
|
18
|
+
def config_script
|
19
|
+
path = "db/config_scripts/#{Time.now.to_s(:number)}_#{self.file_name}.rb"
|
20
|
+
template "config_script.rb", path, {name: name}
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module ConfigScripts
|
3
|
+
# This class provides a generator for creating the migrations that we need to
|
4
|
+
# use this gem.
|
5
|
+
class MigrationsGenerator < Rails::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
source_root File.expand_path('../../../../templates', __FILE__)
|
8
|
+
|
9
|
+
# This generator creates the migrations that we need for the gem.
|
10
|
+
def create_migrations
|
11
|
+
copy_migration 'create_config_scripts'
|
12
|
+
end
|
13
|
+
|
14
|
+
# This method gets the number for the next migration created by this
|
15
|
+
# generator.
|
16
|
+
#
|
17
|
+
# @param [String] dirname
|
18
|
+
# The name of the directory in which we are creating the migrations.
|
19
|
+
#
|
20
|
+
# We use the current timestamp.
|
21
|
+
def self.next_migration_number(dirname)
|
22
|
+
Time.now.to_s(:number)
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
# This method copies a migration from our template directory to the app's
|
28
|
+
# migrations directory.
|
29
|
+
#
|
30
|
+
# @param [String] filename
|
31
|
+
# The name of the file in the templates directory.
|
32
|
+
def copy_migration(filename)
|
33
|
+
migration_template "#{filename}_migration.rb", "db/migrate/#{filename}.rb"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module ConfigScripts
|
2
|
+
module Scripts
|
3
|
+
# This class is the base class for all of the config scripts that the
|
4
|
+
# app will define.
|
5
|
+
class Script
|
6
|
+
# @!group Config
|
7
|
+
|
8
|
+
# This method gets the directory in which the scripts will be stored.
|
9
|
+
#
|
10
|
+
# The scripts are stored in the +db/config_scripts+ directory under the app.
|
11
|
+
#
|
12
|
+
# @return [String]
|
13
|
+
def self.script_directory
|
14
|
+
Rails.root.join('db', 'config_scripts')
|
15
|
+
end
|
16
|
+
|
17
|
+
# @!group Pending Scripts
|
18
|
+
|
19
|
+
# This method gets the scripts that we have not yet run.
|
20
|
+
#
|
21
|
+
# We will return the filenames, without the extensions.
|
22
|
+
#
|
23
|
+
# @return [Array<String>]
|
24
|
+
def self.pending_scripts
|
25
|
+
paths = Dir.glob(File.join(self.script_directory, '*.rb'))
|
26
|
+
paths.collect do |path|
|
27
|
+
filename = File.basename(path, ".rb")
|
28
|
+
timestamp = filename[0, 14]
|
29
|
+
ScriptHistory.script_was_run?(timestamp) ? nil : filename
|
30
|
+
end.compact
|
31
|
+
end
|
32
|
+
|
33
|
+
# This method runs all the scripts that have not yet been run.
|
34
|
+
#
|
35
|
+
# @return [True]
|
36
|
+
def self.run_pending_scripts
|
37
|
+
self.pending_scripts.each do |filename|
|
38
|
+
path = Rails.root.join('db', 'config_scripts', "#{filename}.rb")
|
39
|
+
require path
|
40
|
+
timestamp = filename[0,14]
|
41
|
+
class_name = filename[15..-1].camelize + 'Config'
|
42
|
+
klass = nil
|
43
|
+
begin
|
44
|
+
klass = class_name.constantize
|
45
|
+
rescue NameError
|
46
|
+
puts "Aborting: could not find class #{class_name}"
|
47
|
+
return
|
48
|
+
end
|
49
|
+
puts "Running #{filename}"
|
50
|
+
success = klass.new(timestamp).run(:up)
|
51
|
+
end
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
55
|
+
# This method prints out the names of all of the scripts that have not
|
56
|
+
# been run.
|
57
|
+
def self.list_pending_scripts
|
58
|
+
self.pending_scripts.each do |filename|
|
59
|
+
puts filename
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# @!group Creating
|
64
|
+
|
65
|
+
# This method creates a new script.
|
66
|
+
#
|
67
|
+
# @param [String] timestamp
|
68
|
+
# The timestamp that is used to uniquely indentify the script.
|
69
|
+
#
|
70
|
+
# @return [Script]
|
71
|
+
def initialize(timestamp)
|
72
|
+
@timestamp = timestamp
|
73
|
+
end
|
74
|
+
|
75
|
+
# @!group Running
|
76
|
+
|
77
|
+
# @return [String]
|
78
|
+
# The timestamp for this instance of the script.
|
79
|
+
attr_accessor :timestamp
|
80
|
+
|
81
|
+
# This method performs the changes for this config script.
|
82
|
+
#
|
83
|
+
# This implementation raises an exception. Subclasses must define this
|
84
|
+
# method.
|
85
|
+
#
|
86
|
+
# If there are any issues running the script, this method should raise an
|
87
|
+
# exception.
|
88
|
+
def up
|
89
|
+
raise "Not supported"
|
90
|
+
end
|
91
|
+
|
92
|
+
# This method rolls back the changes for this config script.
|
93
|
+
#
|
94
|
+
# This implementation raises an exception. Subclasses must define this
|
95
|
+
# method if their scripts can be rolled back.
|
96
|
+
#
|
97
|
+
# If there are any issues rolling back the script, this method should
|
98
|
+
# raise an exception.
|
99
|
+
def down
|
100
|
+
raise "Not supported"
|
101
|
+
end
|
102
|
+
|
103
|
+
# This method runs the script in a given direction.
|
104
|
+
#
|
105
|
+
# This will use either the +up+ or +down+ method. That method call will be
|
106
|
+
# wrapped in a transaction, so if the script raises an exception, all of
|
107
|
+
# its changes will be rolled back.
|
108
|
+
#
|
109
|
+
# If the method runs successfully, this will either record a timestamp
|
110
|
+
# or remove a timestamp in the +config_scripts+ table.
|
111
|
+
#
|
112
|
+
# @param [Symbol] direction
|
113
|
+
# Whether we should run +up+ or +down+.
|
114
|
+
def run(direction)
|
115
|
+
ActiveRecord::Base.transaction do
|
116
|
+
begin
|
117
|
+
self.send(direction)
|
118
|
+
rescue => e
|
119
|
+
puts "Error running script for #{self.class.name}: #{e.message}"
|
120
|
+
puts e.backtrace.first
|
121
|
+
raise e
|
122
|
+
end
|
123
|
+
|
124
|
+
case(direction)
|
125
|
+
when :up
|
126
|
+
ScriptHistory.record_timestamp(@timestamp)
|
127
|
+
when :down
|
128
|
+
ScriptHistory.remove_timestamp(@timestamp)
|
129
|
+
end
|
130
|
+
Rails.cache.clear
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ConfigScripts
|
2
|
+
module Scripts
|
3
|
+
# This class models a record of a script being run.
|
4
|
+
#
|
5
|
+
# This uses the +config_scripts+ table to record its histories.
|
6
|
+
class ScriptHistory < ActiveRecord::Base
|
7
|
+
self.table_name = 'config_scripts'
|
8
|
+
|
9
|
+
# @!attribute name
|
10
|
+
# The name of the script, which will be its timestamp.
|
11
|
+
# @return [String]
|
12
|
+
|
13
|
+
# This method gets all of the entries that have a timestamp as their name.
|
14
|
+
# @return [Relation<ScriptHistory>]
|
15
|
+
def self.entries_for_timestamp(timestamp)
|
16
|
+
self.where(:name => timestamp)
|
17
|
+
end
|
18
|
+
|
19
|
+
# This method determines if we have run a script with a timestamp.
|
20
|
+
# @return [Boolean]
|
21
|
+
def self.script_was_run?(timestamp)
|
22
|
+
self.entries_for_timestamp(timestamp).any?
|
23
|
+
end
|
24
|
+
|
25
|
+
# This method records that we have run a script with a timestamp.
|
26
|
+
# @return [ScriptHistory]
|
27
|
+
def self.record_timestamp(timestamp)
|
28
|
+
self.entries_for_timestamp(timestamp).first_or_create
|
29
|
+
end
|
30
|
+
|
31
|
+
# This method removes all records that we have run a script with a
|
32
|
+
# timestamp.
|
33
|
+
# @return [Array<ScriptHistory>]
|
34
|
+
def self.remove_timestamp(timestamp)
|
35
|
+
self.entries_for_timestamp(timestamp).destroy_all
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|