prick 0.18.0 → 0.20.2
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 +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/rdbms.rb
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
require 'prick/command.rb'
|
|
2
|
-
|
|
3
|
-
require 'csv'
|
|
4
|
-
|
|
5
|
-
module Prick
|
|
6
|
-
module Rdbms
|
|
7
|
-
### EXECUTE SQL
|
|
8
|
-
|
|
9
|
-
# Execute the SQL statement and return stdout as an array of tuples
|
|
10
|
-
def self.exec_sql(db, sql, user: ENV['USER'], schema: nil)
|
|
11
|
-
schema ||= "public"
|
|
12
|
-
stdout = Command.command %(
|
|
13
|
-
{
|
|
14
|
-
echo "set role #{user};"
|
|
15
|
-
echo "set search_path to #{schema};"
|
|
16
|
-
cat <<'EOF'
|
|
17
|
-
#{sql}
|
|
18
|
-
EOF
|
|
19
|
-
} | psql --csv --tuples-only --quiet -v ON_ERROR_STOP=1 -d #{db}
|
|
20
|
-
)
|
|
21
|
-
CSV.new(stdout.join("\n")).read
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Execute the given file and return stdout as an array of tuples
|
|
25
|
-
def self.exec_file(db, file, user: ENV['USER'], schema: nil)
|
|
26
|
-
self.exec_sql(db, File.read(file), user: user, schema: schema)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Execute the SQL statement and return the result as an array of record tuples
|
|
30
|
-
# Just an alias for ::exec_sql
|
|
31
|
-
def self.select(db, sql, user: ENV['USER']) exec_sql(db, sql, user: user) end
|
|
32
|
-
|
|
33
|
-
# Execute the SQL statement and return an array of values, one for each
|
|
34
|
-
# single-valued record in the result. Raises an exception if the SQL
|
|
35
|
-
# statement doesn't return records with exactly one field
|
|
36
|
-
def self.select_values(db, sql, user: ENV['USER'])
|
|
37
|
-
records = exec_sql(db, sql, user: user)
|
|
38
|
-
return [] if records.empty?
|
|
39
|
-
records.first.size == 1 or raise Prick::Fail, "Expected records with one field"
|
|
40
|
-
records.flatten
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Execute the SQL statement and return a single record as an array of values.
|
|
44
|
-
# Raises an exception if the SQL statement doesn't return exactly one
|
|
45
|
-
# record
|
|
46
|
-
def self.select_record(db, sql, user: ENV['USER'])
|
|
47
|
-
records = exec_sql(db, sql, user: user)
|
|
48
|
-
records.size == 1 or raise Prick::Fail, "Expected one row only"
|
|
49
|
-
records.first
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Execute the SQL statement and return a value. The value is the first
|
|
53
|
-
# field of the first record in the result. Raises an exception if the SQL
|
|
54
|
-
# statement doesn't return exactly one record with one field
|
|
55
|
-
def self.select_value(db, sql, user: ENV['USER'])
|
|
56
|
-
row = select_record(db, sql, user: user)
|
|
57
|
-
row.size == 1 or raise Prick::Fail, "Expected one field only"
|
|
58
|
-
row.first
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
### DETECT SCHEMAS, TABLES, AND RECORDS
|
|
62
|
-
|
|
63
|
-
def self.exist_schema?(db, schema)
|
|
64
|
-
exist_record?(db, %(
|
|
65
|
-
select 1
|
|
66
|
-
from information_schema.schemata
|
|
67
|
-
where catalog_name = '#{db}'
|
|
68
|
-
and schema_name = '#{schema}'
|
|
69
|
-
))
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.exist_table?(db, schema, table)
|
|
73
|
-
exist_record?(db, %(
|
|
74
|
-
select 1
|
|
75
|
-
from information_schema.tables
|
|
76
|
-
where table_schema = '#{schema}'
|
|
77
|
-
and table_name = '#{table}'
|
|
78
|
-
))
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def self.exist_record?(db, sql)
|
|
82
|
-
!select(db, sql).empty?
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
### MAINTAIN USERS AND DATABASES
|
|
86
|
-
|
|
87
|
-
def self.exist_user?(user)
|
|
88
|
-
exist_record?("template1", "select 1 from pg_roles where rolname = '#{user}'")
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def self.create_user(user)
|
|
92
|
-
Command.command("createuser #{user}")
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def self.drop_user(user, fail: true)
|
|
96
|
-
Command.command "dropuser #{user}", fail: fail
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def self.exist_database?(db)
|
|
100
|
-
exist_record?("template1", "select 1 from pg_database where datname = '#{db}'")
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# TODO: make `owner` an option
|
|
104
|
-
def self.create_database(db, owner: ENV['USER'], template: "template1")
|
|
105
|
-
owner_option = (owner ? "-O #{owner}" : "")
|
|
106
|
-
Command.command "createdb -T #{template} #{owner_option} #{db}"
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def self.copy_database(from, to, owner: ENV['USER'])
|
|
110
|
-
create_database(to, owner: owner, template: from)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def self.drop_database(db, fail: true)
|
|
114
|
-
Command.command "dropdb #{db}", fail: fail
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def self.list_databases(re = /.*/)
|
|
118
|
-
select_values("template1", "select datname from pg_database").select { |db| db =~ re }
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def self.load(db, file, user: ENV['USER'])
|
|
122
|
-
Command.command %(
|
|
123
|
-
{
|
|
124
|
-
echo "set role #{user};"
|
|
125
|
-
gunzip --to-stdout #{file}
|
|
126
|
-
} | psql -v ON_ERROR_STOP=1 -d #{db}
|
|
127
|
-
)
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def self.save(db, file, data: true)
|
|
131
|
-
data_opt = (data ? "" : "--schema-only")
|
|
132
|
-
Command.command "pg_dump --no-owner #{data_opt} #{db} | gzip --to-stdout >#{file}"
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
|
data/lib/prick/schema.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
require "prick/state.rb"
|
|
2
|
-
|
|
3
|
-
module Prick
|
|
4
|
-
PRICK_SCHEMA = "prick"
|
|
5
|
-
SCHEMA_NAMES = %w(schema roles types tables data constraints indexes views functions comments grants)
|
|
6
|
-
BUILD_BASE_NAME = "build"
|
|
7
|
-
BUILD_SQL_FILE = BUILD_BASE_NAME + ".sql"
|
|
8
|
-
BUILD_YML_FILE = BUILD_BASE_NAME + ".yml"
|
|
9
|
-
|
|
10
|
-
# Note this models the SCHEMA_DIR directory, not a database schema
|
|
11
|
-
class Schema
|
|
12
|
-
def yml_file() self.class.yml_file end
|
|
13
|
-
def self.yml_file() SchemaBuilder.yml_file(SCHEMA_DIR) end
|
|
14
|
-
|
|
15
|
-
def version() SchemaVersion.load end
|
|
16
|
-
def version=(version) SchemaVersion.new(version).write end
|
|
17
|
-
def version_file() SchemaVersion.new.path end
|
|
18
|
-
|
|
19
|
-
def built?(database) database.exist? && database.version == version end
|
|
20
|
-
|
|
21
|
-
# `subject` can be a subpath of schema/ (ie. 'public/tables')
|
|
22
|
-
def build(database, subject = nil)
|
|
23
|
-
SchemaBuilder.new(database, SCHEMA_DIR).build(subject)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
data/lib/prick/share.rb
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module Prick
|
|
3
|
-
class Share
|
|
4
|
-
# Procedural object for templating and copying share/ files
|
|
5
|
-
class Copier
|
|
6
|
-
attr_reader :clobber, :templates
|
|
7
|
-
|
|
8
|
-
def initialize(clobber, templates)
|
|
9
|
-
@clobber = clobber
|
|
10
|
-
@templates = templates
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def cp(from, to)
|
|
14
|
-
if File.directory?(from)
|
|
15
|
-
cp_dir(from, to)
|
|
16
|
-
elsif File.file?(from)
|
|
17
|
-
cp_file(from, to)
|
|
18
|
-
else
|
|
19
|
-
raise Fail, "Can't copy #{from}"
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def cp_file(from, to)
|
|
24
|
-
if clobber || !File.exist?(to)
|
|
25
|
-
if templates.empty?
|
|
26
|
-
FileUtils.copy_file(from, to)
|
|
27
|
-
else
|
|
28
|
-
File.open(to, "w") { |f|
|
|
29
|
-
File.readlines(from).each { |l|
|
|
30
|
-
templates.each { |key, value| l.gsub!(/\[<#{key}>\]/, value) }
|
|
31
|
-
f.puts l
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
end
|
|
35
|
-
[to]
|
|
36
|
-
else
|
|
37
|
-
[]
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def cp_dir(from, to)
|
|
42
|
-
FileUtils.mkdir_p(to)
|
|
43
|
-
Dir.children(from).map { |name|
|
|
44
|
-
cp(File.join(from, name), File.join(to, name))
|
|
45
|
-
}.flatten
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def self.cp(pattern, dest, clobber: true, templates: {})
|
|
50
|
-
copier = Copier.new(clobber, templates)
|
|
51
|
-
matches = Dir.glob(File.join(SHARE_PATH, pattern))
|
|
52
|
-
if File.directory?(dest)
|
|
53
|
-
matches.map { |from| copier.cp(from, File.join(dest, File.basename(from))) }.flatten
|
|
54
|
-
elsif matches.size == 1
|
|
55
|
-
copier.cp(matches.first, dest)
|
|
56
|
-
elsif matches.size == 0
|
|
57
|
-
[]
|
|
58
|
-
else
|
|
59
|
-
raise Internal, "Destination is not a directory: #{destdir}"
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
data/libexec/strip-comments
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/bash
|
|
2
|
-
|
|
3
|
-
# NAME
|
|
4
|
-
# strip-comments - Remove comments from postgres files
|
|
5
|
-
#
|
|
6
|
-
# USAGE
|
|
7
|
-
# strip-comments [FILE]
|
|
8
|
-
#
|
|
9
|
-
# DESCRIPTION
|
|
10
|
-
# Remove comments and blank lines from standard intput or the given file and
|
|
11
|
-
# write the result on standard output
|
|
12
|
-
#
|
|
13
|
-
# REFERENCES
|
|
14
|
-
# https://stackoverflow.com/a/35708616/1745001
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
PROGRAM=$(basename $0)
|
|
18
|
-
USAGE="[FILE]"
|
|
19
|
-
|
|
20
|
-
function error() {
|
|
21
|
-
echo "$PROGRAM: $@"
|
|
22
|
-
echo "Usage: $PROGRAM $USAGE"
|
|
23
|
-
exit 1
|
|
24
|
-
} >&2
|
|
25
|
-
|
|
26
|
-
[ $# -le 1 ] || error "Illegal number of arguments"
|
|
27
|
-
FILE=$1
|
|
28
|
-
|
|
29
|
-
sed '/^\s*--/d' $FILE \
|
|
30
|
-
| sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' \
|
|
31
|
-
| gcc -P -E -ansi - \
|
|
32
|
-
| sed 's/aC/#/g; s/aB/__/g; s/aA/a/g'
|
|
33
|
-
|
data/make_releases
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/bash
|
|
2
|
-
|
|
3
|
-
set -e
|
|
4
|
-
|
|
5
|
-
rm -rf dir
|
|
6
|
-
echo "Initialize prick"
|
|
7
|
-
echo
|
|
8
|
-
prick --name prj init dir
|
|
9
|
-
(
|
|
10
|
-
cd dir
|
|
11
|
-
|
|
12
|
-
echo "Prepare an unnamed release"
|
|
13
|
-
prick prepare
|
|
14
|
-
echo
|
|
15
|
-
|
|
16
|
-
echo "Create release 0.0.1"
|
|
17
|
-
prick create release 0.0.1
|
|
18
|
-
echo
|
|
19
|
-
|
|
20
|
-
echo "Create feature_a"
|
|
21
|
-
prick create feature feature_a
|
|
22
|
-
echo
|
|
23
|
-
|
|
24
|
-
echo "Update schema"
|
|
25
|
-
echo "create table t (id integer)" >> schemas/public/schema.sql
|
|
26
|
-
git add schemas/public/schema.sql
|
|
27
|
-
git commit -m "Added PUBLIC.T"
|
|
28
|
-
|
|
29
|
-
echo "Build branch"
|
|
30
|
-
prick build
|
|
31
|
-
psql -d prj -c "select version from prick.versions"
|
|
32
|
-
|
|
33
|
-
exit
|
|
34
|
-
|
|
35
|
-
echo "Create prerelease 0.1.0.pre.1"
|
|
36
|
-
prick create prerelease minor
|
|
37
|
-
echo
|
|
38
|
-
|
|
39
|
-
echo "Increment prerelease"
|
|
40
|
-
prick create prerelease
|
|
41
|
-
echo
|
|
42
|
-
|
|
43
|
-
echo "Release (0.1.0)"
|
|
44
|
-
prick create release
|
|
45
|
-
echo
|
|
46
|
-
|
|
47
|
-
echo "Create release 0.2.0"
|
|
48
|
-
prick create release 0.2.0
|
|
49
|
-
echo
|
|
50
|
-
|
|
51
|
-
echo "Prepare migration"
|
|
52
|
-
prick prepare migration 0.0.0
|
|
53
|
-
echo
|
|
54
|
-
|
|
55
|
-
echo "Create migration"
|
|
56
|
-
prick create migration
|
|
57
|
-
echo
|
|
58
|
-
|
|
59
|
-
# echo "Create release 0.3.0"
|
|
60
|
-
# git checkout 0.2.0
|
|
61
|
-
# prick create release 0.3.0
|
|
62
|
-
# echo
|
|
63
|
-
#
|
|
64
|
-
# echo "Retarget 0.0.0 -> 0.3.0"
|
|
65
|
-
# git checkout 0.0.0_0.2.0
|
|
66
|
-
# prick retarget 0.3.0
|
|
67
|
-
# echo
|
|
68
|
-
|
|
69
|
-
tree -a -I .git
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
|
data/make_schema
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/bash
|
|
2
|
-
|
|
3
|
-
SHARE_DIR=share/schemas/schema
|
|
4
|
-
mkdir -p $SHARE_DIR
|
|
5
|
-
NAMES="roles types tables data constraints indexes views functions comments grants"
|
|
6
|
-
for name in $NAMES; do
|
|
7
|
-
name=$name.sql
|
|
8
|
-
file=$SHARE_DIR/$name
|
|
9
|
-
echo -ne "-- ${name}\n\nset search_path to [<SCHEMA>];\n\n" >$file
|
|
10
|
-
done
|
data/share/diff/diff.tables.sql
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
-- Generated by prick(1) via migra(1). Please don't touch.
|
|
2
|
-
--
|
|
3
|
-
-- This file contains changes that can touch existing data in the database that
|
|
4
|
-
-- needs speciel treatment in the migrate.sql
|
|
5
|
-
--
|
|
6
|
-
-- Note that this file is not executed by prick by default and that it is not
|
|
7
|
-
-- added to the Git repo when it changes. You have to do that manually
|
|
8
|
-
--
|
data/share/features/diff.sql
DELETED
data/share/features/features.sql
DELETED
data/share/features/features.yml
DELETED
data/share/gitignore
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
-- Generated by prick(1) via migra(1). Please don't touch.
|
|
2
|
-
--
|
|
3
|
-
-- This file contains changes that can touch existing data in the database that
|
|
4
|
-
-- needs speciel treatment in the migrate.sql
|
|
5
|
-
--
|
|
6
|
-
-- Note that this file is not executed by prick by default and that it is not
|
|
7
|
-
-- added to the Git repo when it changes. You have to do that manually
|
|
8
|
-
--
|
data/share/migration/migrate.sql
DELETED
data/share/migration/migrate.yml
DELETED
data/share/migration/tables.sql
DELETED
data/share/schema/build.yml
DELETED
data/share/schema/schema.sql
DELETED