migrake-sql_store 0.1.0
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.
- data/.gitignore +1 -0
- data/.travis.yml +10 -0
- data/CHANGES +4 -0
- data/Gemfile +2 -0
- data/README.md +80 -0
- data/Rakefile +15 -0
- data/lib/migrake/sql_store.rb +55 -0
- data/lib/migrake/sql_store/version.rb +5 -0
- data/migrake-sql_store.gemspec +19 -0
- data/test/sql_store_test.rb +66 -0
- data/test/test_helper.rb +9 -0
- metadata +99 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/pkg
|
data/.travis.yml
ADDED
data/CHANGES
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# Migrake::SQLStore
|
2
|
+
|
3
|
+
[](http://travis-ci.org/foca/migrake-sql_store)
|
4
|
+
|
5
|
+
An extension for [Migrake][migrake] that stores the rake tasks that you ran in a
|
6
|
+
SQL database instead of the filesystem, useful for hosts like [Heroku][heroku]
|
7
|
+
where you have a read-only filesystem.
|
8
|
+
|
9
|
+
[migrake]: http://github.com/foca/migrake
|
10
|
+
[heroku]: http://heroku.com
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
In your Rakefile, instead of requiring `migrake`, require `migrake/sql_store`,
|
15
|
+
and initialize the store with the URI to your database:
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
require "migrake/sql_store"
|
19
|
+
|
20
|
+
Migrake.store = Migrake::SQLStore.new("postgres://foo:foo@localhost/database")
|
21
|
+
|
22
|
+
migrake Set.new([
|
23
|
+
"some_rake_task",
|
24
|
+
"another_rake_task",
|
25
|
+
# etc, etc
|
26
|
+
])
|
27
|
+
```
|
28
|
+
|
29
|
+
When running `rake migrake` (or `rake migrake:ready`), SQLStore will check for a
|
30
|
+
`migrake_tasks` table. If it doesn't exist, it will create it transparently for
|
31
|
+
you.
|
32
|
+
|
33
|
+
This gem requires that you have the appropriate database adapter gems installed
|
34
|
+
and available (e.g. added to your Gemfile). If the target database is
|
35
|
+
postgresql, for example, make sure the `pg` is available in the environment
|
36
|
+
where `rake migrake` will be run.
|
37
|
+
|
38
|
+
## Heroku (or other envs which include `DATABASE_URL`)
|
39
|
+
|
40
|
+
If your ENV includes a `DATABASE_URL`, you don't need to do anything, as
|
41
|
+
requiring `migrake/sql_store` will, by default, attempt to connect to a database
|
42
|
+
at that location, if the ENV key is set. So for Heroku, all you'd do is this:
|
43
|
+
|
44
|
+
``` ruby
|
45
|
+
require "migrake/sql_store"
|
46
|
+
|
47
|
+
migrake Set.new([
|
48
|
+
"some_rake_task",
|
49
|
+
"another_rake_task",
|
50
|
+
# etc, etc
|
51
|
+
])
|
52
|
+
```
|
53
|
+
|
54
|
+
## License
|
55
|
+
|
56
|
+
(The MIT License)
|
57
|
+
|
58
|
+
Copyright (c) 2012 [Nicolas Sanguinetti][me], with the support of [Cubox][cubox]
|
59
|
+
|
60
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
61
|
+
a copy of this software and associated documentation files (the
|
62
|
+
'Software'), to deal in the Software without restriction, including
|
63
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
64
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
65
|
+
permit persons to whom the Software is furnished to do so, subject to
|
66
|
+
the following conditions:
|
67
|
+
|
68
|
+
The above copyright notice and this permission notice shall be
|
69
|
+
included in all copies or substantial portions of the Software.
|
70
|
+
|
71
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
72
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
73
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
74
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
75
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
76
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
77
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
78
|
+
|
79
|
+
[me]: http://nicolassanguinetti.info
|
80
|
+
[cubox]: http://cuboxlabs.com
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "rake/testtask"
|
2
|
+
require "rubygems/package_task"
|
3
|
+
|
4
|
+
gem_spec = eval(File.read("./migrake-sql_store.gemspec"))
|
5
|
+
Gem::PackageTask.new(gem_spec) do |pkg|
|
6
|
+
pkg.need_zip = false
|
7
|
+
pkg.need_tar = false
|
8
|
+
end
|
9
|
+
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.pattern = "test/*_test.rb"
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
task default: :test
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "migrake"
|
2
|
+
require "sequel"
|
3
|
+
require "migrake/sql_store/version"
|
4
|
+
|
5
|
+
class Migrake::SQLStore
|
6
|
+
# Public: Connect to the database.
|
7
|
+
#
|
8
|
+
# db - Any valid argument to `Sequel.connect`.
|
9
|
+
def initialize(db)
|
10
|
+
@db = db.is_a?(Sequel::Database) ? db : Sequel.connect(db)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Make sure the table in which we will store tasks exists. Create it
|
14
|
+
# if it doesn't.
|
15
|
+
def prepare
|
16
|
+
@db.create_table?(:migrake_tasks) do
|
17
|
+
column :task, String, primary_key: true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Public: Insert a task into the store.
|
22
|
+
#
|
23
|
+
# task - A string with a task's name.
|
24
|
+
#
|
25
|
+
# Returns nothing.
|
26
|
+
def put(task)
|
27
|
+
@db[:migrake_tasks].insert(task: task)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Load all the tasks from the store.
|
31
|
+
#
|
32
|
+
# Returns a Set.
|
33
|
+
def all
|
34
|
+
Set.new(@db[:migrake_tasks].map { |row| row[:task] })
|
35
|
+
end
|
36
|
+
|
37
|
+
# Public: Write a whole set of tasks to the database, replacing what is in it.
|
38
|
+
#
|
39
|
+
# set - A Set of tasks.
|
40
|
+
#
|
41
|
+
# Returns nothing.
|
42
|
+
def write(set)
|
43
|
+
@db.transaction do
|
44
|
+
@db[:migrake_tasks].truncate
|
45
|
+
@db[:migrake_tasks].insert_multiple(set.to_a) { |task| { task: task } }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Automagic configuration. If this environment has a DATABASE_URL (e.g. heroku),
|
51
|
+
# use Migrake::SQLStore and connect to that database. This requires the
|
52
|
+
# appropriate database adapter installed.
|
53
|
+
if ENV.key?("DATABASE_URL")
|
54
|
+
Migrake.store = Migrake::SQLStore.new(ENV.fetch("DATABASE_URL"))
|
55
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "migrake/sql_store/version"
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "migrake-sql_store"
|
5
|
+
s.version = Migrake::SqlStore::VERSION
|
6
|
+
s.description = "Migrake storage engine to use a SQL database instead of the filesystem"
|
7
|
+
s.summary = "SQL storage engine for Migrake"
|
8
|
+
s.authors = ["Nicolas Sanguinetti"]
|
9
|
+
s.email = "hi@nicolassanguinetti.info"
|
10
|
+
s.homepage = "http://github.com/foca/migrake-sql_store"
|
11
|
+
s.has_rdoc = false
|
12
|
+
s.files = `git ls-files`.split "\n"
|
13
|
+
s.platform = Gem::Platform::RUBY
|
14
|
+
|
15
|
+
s.add_dependency("migrake", "~> 0.2")
|
16
|
+
s.add_dependency("sequel", "~> 3.34")
|
17
|
+
s.add_development_dependency("minitest")
|
18
|
+
s.add_development_dependency("sqlite3")
|
19
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
describe Migrake::SQLStore do
|
4
|
+
it "can read a stored set" do
|
5
|
+
create_migrake_table!
|
6
|
+
|
7
|
+
set = Set.new(["a", "b", "c"])
|
8
|
+
save_in_source set
|
9
|
+
|
10
|
+
store = Migrake::SQLStore.new(source)
|
11
|
+
assert_equal set, store.all
|
12
|
+
end
|
13
|
+
|
14
|
+
it "an empty file means an empty set" do
|
15
|
+
create_migrake_table!
|
16
|
+
|
17
|
+
store = Migrake::SQLStore.new(source)
|
18
|
+
assert_equal Set.new, store.all
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can add an entry to the store" do
|
22
|
+
create_migrake_table!
|
23
|
+
|
24
|
+
store = Migrake::SQLStore.new(source)
|
25
|
+
store.put("test")
|
26
|
+
|
27
|
+
assert store.all.include?("test")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "can write a set replacing whatever is there on the file" do
|
31
|
+
create_migrake_table!
|
32
|
+
|
33
|
+
save_in_source Set.new(["d", "e", "f", "g"])
|
34
|
+
|
35
|
+
store = Migrake::SQLStore.new(source)
|
36
|
+
store.write Set.new(["a", "b", "c"])
|
37
|
+
|
38
|
+
assert_equal Set.new(["a", "b", "c"]), store.all
|
39
|
+
end
|
40
|
+
|
41
|
+
it "creates the migrake_tasks when you call #prepare" do
|
42
|
+
store = Migrake::SQLStore.new(source)
|
43
|
+
|
44
|
+
assert !source.table_exists?(:migrake_tasks)
|
45
|
+
store.prepare
|
46
|
+
assert source.table_exists?(:migrake_tasks)
|
47
|
+
end
|
48
|
+
|
49
|
+
before do
|
50
|
+
source.drop_table?(:migrake_tasks)
|
51
|
+
end
|
52
|
+
|
53
|
+
def save_in_source(set)
|
54
|
+
source[:migrake_tasks].insert_multiple(set) { |task| { task: task } }
|
55
|
+
end
|
56
|
+
|
57
|
+
def source
|
58
|
+
@source ||= Sequel.sqlite
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_migrake_table!(db = source)
|
62
|
+
db.create_table?(:migrake_tasks) do
|
63
|
+
column :task, String, primary_key: true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: migrake-sql_store
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nicolas Sanguinetti
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: migrake
|
16
|
+
requirement: &70145851982360 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.2'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70145851982360
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sequel
|
27
|
+
requirement: &70145851981860 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.34'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70145851981860
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: minitest
|
38
|
+
requirement: &70145851997840 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70145851997840
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: sqlite3
|
49
|
+
requirement: &70145851997380 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70145851997380
|
58
|
+
description: Migrake storage engine to use a SQL database instead of the filesystem
|
59
|
+
email: hi@nicolassanguinetti.info
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- .gitignore
|
65
|
+
- .travis.yml
|
66
|
+
- CHANGES
|
67
|
+
- Gemfile
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- lib/migrake/sql_store.rb
|
71
|
+
- lib/migrake/sql_store/version.rb
|
72
|
+
- migrake-sql_store.gemspec
|
73
|
+
- test/sql_store_test.rb
|
74
|
+
- test/test_helper.rb
|
75
|
+
homepage: http://github.com/foca/migrake-sql_store
|
76
|
+
licenses: []
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.11
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: SQL storage engine for Migrake
|
99
|
+
test_files: []
|