prick 0.18.0 → 0.20.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -4
- data/README.md +7 -7
- data/Rakefile +3 -1
- data/TODO +13 -11
- data/bin/console +2 -1
- data/doc/build-yml.txt +14 -0
- data/exe/prick +264 -28
- data/lib/builder/batch.rb +147 -0
- data/lib/builder/builder.rb +122 -0
- data/lib/builder/node.rb +189 -0
- data/lib/builder/node_pool.rb +105 -0
- data/lib/builder/parser.rb +120 -0
- data/lib/local/command.rb +193 -0
- data/lib/{prick → local}/git.rb +148 -22
- data/lib/local/timer.rb +98 -0
- data/lib/prick/constants.rb +54 -66
- data/lib/prick/diff.rb +28 -18
- data/lib/prick/prick_version.rb +161 -0
- data/lib/prick/state.rb +80 -165
- data/lib/prick/version.rb +2 -163
- data/lib/prick.rb +43 -27
- data/lib/share/init/.gitignore +10 -0
- data/lib/share/init/.prick-context +2 -0
- data/lib/share/init/.rspec +3 -0
- data/{share/schema/schema/public → lib/share/init/migration}/.keep +0 -0
- data/lib/share/init/prick.yml +6 -0
- data/lib/share/init/schema/.keep +0 -0
- data/lib/share/init/schema/build.yml +2 -0
- data/lib/share/init/schema/prick/.keep +0 -0
- data/lib/share/init/schema/prick/build.yml +5 -0
- data/lib/share/init/schema/prick/data.sql +6 -0
- data/{share/schema → lib/share/init}/schema/prick/tables.sql +2 -3
- data/lib/share/init/schema/public/.keep +0 -0
- data/lib/share/init/spec/prick_helper.rb +1 -0
- data/lib/share/init/spec/prick_spec.rb +6 -0
- data/lib/share/init/spec/spec_helper.rb +50 -0
- data/lib/share/migrate/migration/build.yml +4 -0
- data/lib/share/migrate/migration/diff.after-tables.sql +0 -0
- data/lib/share/migrate/migration/diff.before-tables.sql +0 -0
- data/lib/share/migrate/migration/diff.tables.sql +0 -0
- data/lib/subcommand/prick-build.rb +55 -0
- data/lib/subcommand/prick-create.rb +78 -0
- data/lib/subcommand/prick-drop.rb +25 -0
- data/lib/subcommand/prick-fox.rb +62 -0
- data/lib/subcommand/prick-init.rb +46 -0
- data/lib/subcommand/prick-make.rb +202 -0
- data/lib/subcommand/prick-migrate.rb +37 -0
- data/lib/subcommand/prick-release.rb +23 -0
- data/lib/subcommand/prick-setup.rb +20 -0
- data/lib/subcommand/prick-teardown.rb +18 -0
- data/prick.gemspec +43 -16
- metadata +161 -72
- data/.gitignore +0 -29
- data/.travis.yml +0 -7
- data/doc/create_release.txt +0 -17
- data/doc/flow.txt +0 -98
- data/doc/migra +0 -1
- data/doc/migrations.txt +0 -172
- data/doc/notes.txt +0 -116
- data/doc/prick.txt +0 -114
- data/doc/sh.prick +0 -316
- data/lib/ext/algorithm.rb +0 -14
- data/lib/ext/fileutils.rb +0 -26
- data/lib/ext/forward_method.rb +0 -18
- data/lib/ext/pg.rb +0 -18
- data/lib/ext/shortest_path.rb +0 -44
- data/lib/prick/archive.rb +0 -124
- data/lib/prick/branch.rb +0 -254
- data/lib/prick/builder.rb +0 -205
- data/lib/prick/cache.rb +0 -34
- data/lib/prick/command.rb +0 -102
- data/lib/prick/database.rb +0 -82
- data/lib/prick/dsort.rb +0 -151
- data/lib/prick/ensure.rb +0 -119
- data/lib/prick/exceptions.rb +0 -25
- data/lib/prick/head.rb +0 -183
- data/lib/prick/migration.rb +0 -70
- data/lib/prick/program.rb +0 -506
- data/lib/prick/project.rb +0 -626
- data/lib/prick/rdbms.rb +0 -137
- data/lib/prick/schema.rb +0 -27
- data/lib/prick/share.rb +0 -64
- data/libexec/strip-comments +0 -33
- data/make_releases +0 -72
- data/make_schema +0 -10
- data/share/diff/diff.after-tables.sql +0 -4
- data/share/diff/diff.before-tables.sql +0 -4
- data/share/diff/diff.tables.sql +0 -8
- data/share/features/diff.sql +0 -2
- data/share/features/feature/diff.sql +0 -2
- data/share/features/feature/migrate.sql +0 -2
- data/share/features/features.sql +0 -2
- data/share/features/features.yml +0 -2
- data/share/features/migrations.sql +0 -4
- data/share/gitignore +0 -2
- data/share/migration/diff.tables.sql +0 -8
- data/share/migration/features.yml +0 -6
- data/share/migration/migrate.sql +0 -3
- data/share/migration/migrate.yml +0 -8
- data/share/migration/tables.sql +0 -3
- data/share/schema/build.yml +0 -14
- data/share/schema/schema/build.yml +0 -3
- data/share/schema/schema/prick/build.yml +0 -14
- data/share/schema/schema/prick/data.sql +0 -7
- data/share/schema/schema/prick/schema.sql +0 -3
- data/share/schema/schema/public/build.yml +0 -13
- data/share/schema/schema.sql +0 -3
- data/test_assorted +0 -192
- data/test_feature +0 -112
- data/test_refactor +0 -34
- data/test_single_dev +0 -83
data/lib/prick.rb
CHANGED
@@ -1,31 +1,47 @@
|
|
1
|
+
require 'prick/version.rb'
|
1
2
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
require
|
14
|
-
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
3
|
+
require 'pg_conn'
|
4
|
+
|
5
|
+
require 'fixture_fox'
|
6
|
+
require 'indented_io'
|
7
|
+
require 'constrain'
|
8
|
+
|
9
|
+
module Prick
|
10
|
+
class Error < RuntimeError; end
|
11
|
+
class Fail < RuntimeError; end
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'prick/constants.rb'
|
15
|
+
|
16
|
+
require 'local/command.rb'
|
17
|
+
require 'local/git.rb'
|
18
|
+
require 'local/timer.rb'
|
19
|
+
|
20
|
+
require 'prick/state.rb'
|
21
|
+
require 'prick/prick_version.rb'
|
22
|
+
require 'prick/diff.rb'
|
23
|
+
|
24
|
+
module Prick
|
25
|
+
module SubCommand
|
26
|
+
extend Timer
|
27
|
+
def self.mesg(*msgs) puts msgs.join(" ") if !$quiet end
|
28
|
+
def self.verb(*msgs) puts msgs.join(" ") if $verbose && !$quiet end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'subcommand/prick-init.rb'
|
33
|
+
require 'subcommand/prick-setup.rb'
|
34
|
+
require 'subcommand/prick-teardown.rb'
|
35
|
+
require 'subcommand/prick-create.rb'
|
36
|
+
require 'subcommand/prick-build.rb'
|
37
|
+
require 'subcommand/prick-make.rb'
|
38
|
+
require 'subcommand/prick-fox.rb'
|
39
|
+
require 'subcommand/prick-drop.rb'
|
40
|
+
require 'subcommand/prick-release.rb'
|
41
|
+
require 'subcommand/prick-migrate.rb'
|
29
42
|
|
30
43
|
module Prick
|
44
|
+
@state = nil
|
45
|
+
def self.state() @state end
|
46
|
+
def self.state=(state) @state = state end
|
31
47
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
-- Controlled by prick(1). Don't touch
|
3
2
|
--
|
4
3
|
|
@@ -12,6 +11,6 @@ create table versions (
|
|
12
11
|
patch integer not null,
|
13
12
|
pre integer,
|
14
13
|
feature varchar,
|
15
|
-
version varchar not null
|
14
|
+
version varchar not null,
|
15
|
+
built_at timestamp without time zone not null default (now() at time zone 'UTC')
|
16
16
|
);
|
17
|
-
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'prick/constants.rb'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
# Set up paths to fox-project libraries
|
3
|
+
libdirs = `fox-project-libdirs 2>/dev/null`.chomp.split(":")
|
4
|
+
if !libdirs.empty?
|
5
|
+
$LOAD_PATH.unshift(*libdirs)
|
6
|
+
end
|
7
|
+
|
8
|
+
require "bundler/setup"
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
# Enable flags like --only-failures and --next-failure
|
12
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
13
|
+
|
14
|
+
# Disable RSpec exposing methods globally on `Module` and `main`
|
15
|
+
# config.disable_monkey_patching!
|
16
|
+
|
17
|
+
config.expect_with :rspec do |c|
|
18
|
+
c.syntax = :expect
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Silence most of the output from pending tests. See https://github.com/rspec/rspec-core/issues/2377
|
23
|
+
module FormatterOverrides
|
24
|
+
def example_pending(n)
|
25
|
+
colorizer=::RSpec::Core::Formatters::ConsoleCodes
|
26
|
+
output << current_indentation \
|
27
|
+
<< colorizer.wrap(n.example.description, :pending) \
|
28
|
+
<< "\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
def dump_pending(_)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec::Core::Formatters::DocumentationFormatter.prepend FormatterOverrides
|
36
|
+
|
37
|
+
# Postspec
|
38
|
+
require "postspec"
|
39
|
+
require 'postspec_helper'
|
40
|
+
require 'prick_helper'
|
41
|
+
|
42
|
+
Postspec.configure do |config|
|
43
|
+
config.database = "mikras"
|
44
|
+
# config.anchors = "..."
|
45
|
+
config.mode = :seed
|
46
|
+
config.reflections = Prick::REFLECTIONS_PATH if File.exist?(Prick::REFLECTIONS_PATH)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Local modifications
|
50
|
+
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'builder/builder.rb'
|
4
|
+
|
5
|
+
module Prick::SubCommand
|
6
|
+
def self.build(database, username, schema, builddir: "schema", timer: nil, dump: nil)
|
7
|
+
Timer.on! if timer
|
8
|
+
time "Prick::Command#build" do
|
9
|
+
begin
|
10
|
+
super_conn = PgConn.new
|
11
|
+
conn = nil
|
12
|
+
builder = nil
|
13
|
+
|
14
|
+
time "Load build object" do
|
15
|
+
if super_conn.rdbms.exist? database
|
16
|
+
conn = PgConn.new(database, username)
|
17
|
+
super_conn.rdbms.empty!(database)
|
18
|
+
else
|
19
|
+
super_conn.rdbms.create database, owner: username
|
20
|
+
conn = PgConn.new(database, username)
|
21
|
+
end
|
22
|
+
|
23
|
+
builder = Prick::Build::Builder.new(conn, builddir)
|
24
|
+
builder.pool.delete_schema(builder.pool.after_schema(schema)) if schema
|
25
|
+
end
|
26
|
+
|
27
|
+
case dump
|
28
|
+
when :nodes; builder.nodes.reject { |node| node.is_a?(Build::BuildNode) }.map &:dump
|
29
|
+
when :allnodes; builder.nodes.map &:dump
|
30
|
+
when :batches; builder.dump
|
31
|
+
when nil;
|
32
|
+
else
|
33
|
+
raise Prick::Error, "Illegal dump type: #{dump.inspect}"
|
34
|
+
end && exit
|
35
|
+
|
36
|
+
time "Execute build object" do
|
37
|
+
builder.execute conn
|
38
|
+
end
|
39
|
+
|
40
|
+
rescue Prick::Error => ex
|
41
|
+
$stderr.puts ex.message
|
42
|
+
exit 1
|
43
|
+
|
44
|
+
rescue ::Command::Error => ex
|
45
|
+
$stderr.puts ex.message
|
46
|
+
exit 1
|
47
|
+
|
48
|
+
ensure
|
49
|
+
super_conn&.terminate
|
50
|
+
conn&.terminate
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
module Prick
|
3
|
+
module SubCommand
|
4
|
+
def self.create_migration(username, from_version, force: false, file: nil)
|
5
|
+
constrain from_version, PrickVersion
|
6
|
+
Git.clean? or raise "Won't migrate: Repository is dirty"
|
7
|
+
Git.synchronized? or raise "Won't migrate: Repository is not synchronized"
|
8
|
+
|
9
|
+
from_version != PrickVersion.zero or raise Prick::Error, "Can't migrate from release 0.0.0"
|
10
|
+
to_version = Prick.state.version
|
11
|
+
migration_dir = "#{MIGRATION_DIR}/#{from_version}"
|
12
|
+
migration_exist = File.directory? migration_dir
|
13
|
+
force || file || !migration_exist or raise Prick::Fail, "Migration #{from_version} exists"
|
14
|
+
|
15
|
+
$quiet = true if file
|
16
|
+
|
17
|
+
if file && migration_exist
|
18
|
+
File.open(file, "w") { |file|
|
19
|
+
for diff_file in DIFF_FILES
|
20
|
+
file.write File.read("#{migration_dir}/#{diff_file}")
|
21
|
+
end
|
22
|
+
}
|
23
|
+
else
|
24
|
+
from_version != to_version or raise Prick::Fail, "Can't migrate to same release"
|
25
|
+
from_version < to_version or raise Prick::Fail, "Can't migrate backwards (why not?)"
|
26
|
+
|
27
|
+
diff = nil
|
28
|
+
if force || !migration_exist
|
29
|
+
from_db = "#{Prick.state.name}-#{from_version}"
|
30
|
+
to_db = "#{Prick.state.name}-#{to_version}"
|
31
|
+
|
32
|
+
mesg "Migrating from #{from_version} to #{to_version}"
|
33
|
+
begin
|
34
|
+
origin = Git.origin
|
35
|
+
|
36
|
+
# Local repos are supported to ease testing
|
37
|
+
if File.directory?(origin)
|
38
|
+
origin = File.expand_path(origin)
|
39
|
+
end
|
40
|
+
|
41
|
+
diff = Dir.mktmpdir { |tmpdir|
|
42
|
+
Dir.chdir(tmpdir) {
|
43
|
+
mesg " Building #{from_db}"
|
44
|
+
Git.clone(origin, from_version, branch: from_version)
|
45
|
+
Dir.chdir(from_version.to_s) { build(from_db, username, nil) }
|
46
|
+
}
|
47
|
+
|
48
|
+
mesg " Building #{to_db}"
|
49
|
+
build(to_db, username, nil)
|
50
|
+
|
51
|
+
mesg " Creating diff"
|
52
|
+
Diff.new(from_db, to_db)
|
53
|
+
}
|
54
|
+
!diff.same? or raise Prick::Fail, "No changes"
|
55
|
+
ensure
|
56
|
+
drop_all(from_db)
|
57
|
+
drop_all(to_db)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
diff.write(file) if file
|
62
|
+
end
|
63
|
+
|
64
|
+
if file
|
65
|
+
File.open(file, "a") { |f|
|
66
|
+
f.puts "-- UPDATE VERSION"
|
67
|
+
f.puts File.readlines(SCHEMA_VERSION_PATH).grep_v(/^--/)
|
68
|
+
}
|
69
|
+
else
|
70
|
+
FileUtils.rm_rf migration_dir if force
|
71
|
+
FileUtils.mkdir_p migration_dir
|
72
|
+
Command.command "cp -a #{SHARE_PATH}/migrate/migration/. #{migration_dir}"
|
73
|
+
Dir.chdir(migration_dir) { diff.write(*DIFF_FILES, mark: true) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'builder/builder.rb'
|
4
|
+
|
5
|
+
module Prick::SubCommand
|
6
|
+
def self.drop_users(database)
|
7
|
+
PgConn.new(database) { |conn|
|
8
|
+
users = conn.role.list(database: database)
|
9
|
+
conn.role.drop(users, cascade: true)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.drop_database(database)
|
14
|
+
PgConn.new { |conn| conn.rdbms.drop database }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.drop_all(database)
|
18
|
+
PgConn.new { |conn|
|
19
|
+
users = conn.role.list(database: database)
|
20
|
+
PgConn.new(database) { |db| db.role.drop(users, cascade: true) }
|
21
|
+
conn.rdbms.drop database
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'builder/builder.rb'
|
4
|
+
|
5
|
+
module Prick::SubCommand
|
6
|
+
def self.fox(database, username, files)
|
7
|
+
Command.command "fox --state=#{FOX_STATE_PATH} --exec #{database} #{files.join(" ")}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
__END__
|
12
|
+
|
13
|
+
|
14
|
+
Timer.on! if timer
|
15
|
+
time "Prick::Command#build" do
|
16
|
+
begin
|
17
|
+
super_conn = PgConn.new
|
18
|
+
conn = nil
|
19
|
+
builder = nil
|
20
|
+
|
21
|
+
time "Load build object" do
|
22
|
+
if super_conn.rdbms.exist? database
|
23
|
+
conn = PgConn.new(database, username)
|
24
|
+
super_conn.rdbms.empty!(database)
|
25
|
+
else
|
26
|
+
super_conn.rdbms.create database, owner: username
|
27
|
+
conn = PgConn.new(database, username)
|
28
|
+
end
|
29
|
+
|
30
|
+
builder = Prick::Build::Builder.new(conn, builddir)
|
31
|
+
builder.pool.delete_schema(builder.pool.after_schema(schema)) if schema
|
32
|
+
end
|
33
|
+
|
34
|
+
case dump
|
35
|
+
when :nodes; builder.nodes.reject { |node| node.is_a?(Build::BuildNode) }.map &:dump
|
36
|
+
when :allnodes; builder.nodes.map &:dump
|
37
|
+
when :batches; builder.dump
|
38
|
+
when nil;
|
39
|
+
else
|
40
|
+
raise Prick::Error, "Illegal dump type: #{dump.inspect}"
|
41
|
+
end && exit
|
42
|
+
|
43
|
+
time "Execute build object" do
|
44
|
+
builder.execute conn
|
45
|
+
end
|
46
|
+
|
47
|
+
rescue Prick::Error => ex
|
48
|
+
$stderr.puts ex.message
|
49
|
+
exit 1
|
50
|
+
|
51
|
+
rescue ::Command::Error => ex
|
52
|
+
$stderr.puts ex.message
|
53
|
+
exit 1
|
54
|
+
|
55
|
+
ensure
|
56
|
+
super_conn&.terminate
|
57
|
+
conn&.terminate
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Prick::SubCommand
|
4
|
+
def self.init(dir, name, title, database, username)
|
5
|
+
if dir
|
6
|
+
!File.exist?(dir) or raise Prick::Error, "Directory #{dir} exists"
|
7
|
+
FileUtils.mkdir_p(dir)
|
8
|
+
Dir.chdir(dir)
|
9
|
+
else
|
10
|
+
dir = "."
|
11
|
+
end
|
12
|
+
name ||= File.basename(Dir.getwd)
|
13
|
+
title ||= name
|
14
|
+
database ||= name
|
15
|
+
username ||= name
|
16
|
+
|
17
|
+
Command.command %(
|
18
|
+
git init .
|
19
|
+
cp -a #{SHARE_PATH}/init/. .
|
20
|
+
git add .
|
21
|
+
git commit -am "Initial import"
|
22
|
+
), fail: false
|
23
|
+
|
24
|
+
Command.status == 0 or raise Prick::Fail, "Init script failed"
|
25
|
+
|
26
|
+
state = State.new
|
27
|
+
state.name = name
|
28
|
+
state.title = title
|
29
|
+
state.prick_version = PrickVersion.new VERSION
|
30
|
+
state.version = PrickVersion.new("0.0.0")
|
31
|
+
state.environment = :development
|
32
|
+
state.database = database
|
33
|
+
state.username = username
|
34
|
+
state.save
|
35
|
+
|
36
|
+
Command.command %(
|
37
|
+
set -e
|
38
|
+
git commit -am "Release 0.0.0"
|
39
|
+
git tag v0.0.0
|
40
|
+
), fail: false
|
41
|
+
|
42
|
+
Command.status == 0 or raise Prick::Fail, "Init script failed"
|
43
|
+
|
44
|
+
[dir, state]
|
45
|
+
end
|
46
|
+
end
|