prick 0.3.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/TODO +7 -0
  4. data/exe/prick +235 -163
  5. data/lib/ext/fileutils.rb +7 -0
  6. data/lib/prick.rb +7 -5
  7. data/lib/prick/builder.rb +31 -8
  8. data/lib/prick/cache.rb +34 -0
  9. data/lib/prick/constants.rb +106 -54
  10. data/lib/prick/database.rb +26 -20
  11. data/lib/prick/diff.rb +103 -25
  12. data/lib/prick/git.rb +31 -9
  13. data/lib/prick/head.rb +183 -0
  14. data/lib/prick/migration.rb +41 -181
  15. data/lib/prick/program.rb +255 -0
  16. data/lib/prick/project.rb +264 -0
  17. data/lib/prick/rdbms.rb +3 -12
  18. data/lib/prick/schema.rb +6 -11
  19. data/lib/prick/state.rb +129 -74
  20. data/lib/prick/version.rb +41 -28
  21. data/prick.gemspec +3 -1
  22. data/share/diff/diff.after-tables.sql +4 -0
  23. data/share/diff/diff.before-tables.sql +4 -0
  24. data/share/diff/diff.tables.sql +8 -0
  25. data/share/migration/diff.tables.sql +8 -0
  26. data/share/{release_migration → migration}/features.yml +0 -0
  27. data/share/migration/migrate.sql +3 -0
  28. data/share/{release_migration → migration}/migrate.yml +3 -0
  29. data/share/migration/tables.sql +3 -0
  30. data/share/{schemas → schema/schema}/build.yml +0 -0
  31. data/share/{schemas → schema/schema}/prick/build.yml +0 -0
  32. data/share/schema/schema/prick/data.sql +7 -0
  33. data/share/{schemas → schema/schema}/prick/schema.sql +0 -0
  34. data/share/{schemas → schema/schema}/prick/tables.sql +2 -2
  35. data/share/{schemas → schema/schema}/public/.keep +0 -0
  36. data/share/{schemas → schema/schema}/public/build.yml +0 -0
  37. data/share/{schemas → schema/schema}/public/schema.sql +0 -0
  38. data/test_refactor +34 -0
  39. metadata +23 -21
  40. data/file +0 -0
  41. data/lib/prick/build.rb +0 -376
  42. data/lib/prick/migra.rb +0 -22
  43. data/share/feature_migration/diff.sql +0 -2
  44. data/share/feature_migration/migrate.sql +0 -2
  45. data/share/release_migration/diff.sql +0 -3
  46. data/share/release_migration/migrate.sql +0 -5
  47. data/share/schemas/prick/data.sql +0 -7
data/lib/ext/fileutils.rb CHANGED
@@ -7,6 +7,7 @@ module FileUtils
7
7
  dir = File.dirname(file)
8
8
  File.exist?(dir) or FileUtils.mkdir_p(dir)
9
9
  touch(file)
10
+ file
10
11
  end
11
12
 
12
13
  def self.ln_sr(from, to)
@@ -16,4 +17,10 @@ module FileUtils
16
17
  relpath = from.relative_path_from(File.dirname(to))
17
18
  Dir.chdir(to_dir) { FileUtils.ln_s(relpath, File.basename(to)) }
18
19
  end
20
+
21
+ def self.empty!(dir)
22
+ Dir.chdir(dir) {
23
+ FileUtils.rm_rf(Dir.children("."))
24
+ }
25
+ end
19
26
  end
data/lib/prick.rb CHANGED
@@ -1,17 +1,22 @@
1
- require "semantic" # Defined here instead of in prick/version.rb to avoid having Gem depend on it
1
+
2
+ #$LOAD_PATH.unshift("/home/clr/prj/shellopts/lib")
3
+
4
+ # 'semantic' is required here instead of in prick/version.rb to avoid having Gem depend on it
5
+ require "semantic"
2
6
 
3
7
  # Needs to go first because it contains class-level methods that is used by other modules
4
8
  require "ext/forward_method.rb"
5
9
 
6
- require "prick/branch.rb"
7
10
  require "prick/builder.rb"
8
11
  require "prick/migration.rb"
12
+ require "prick/cache.rb"
9
13
  require "prick/command.rb"
10
14
  require "prick/constants.rb"
11
15
  require "prick/database.rb"
12
16
  require "prick/diff.rb"
13
17
  require "prick/exceptions.rb"
14
18
  require "prick/git.rb"
19
+ require "prick/head.rb"
15
20
  require "prick/project.rb"
16
21
  require "prick/rdbms.rb"
17
22
  require "prick/schema.rb"
@@ -22,8 +27,5 @@ require "prick/version.rb"
22
27
  require "ext/fileutils.rb"
23
28
  require "ext/shortest_path.rb"
24
29
 
25
- require "indented_io"
26
-
27
30
  module Prick
28
31
  end
29
-
data/lib/prick/builder.rb CHANGED
@@ -24,14 +24,19 @@ module Prick
24
24
  attr_reader :database
25
25
  attr_reader :directory
26
26
  attr_reader :default # either "build" or "migrate"
27
+ attr_reader :lines
27
28
 
28
29
  def initialize(database, directory, default)
29
30
  @database = database
30
31
  @directory = directory
31
32
  @default = default
33
+ @execute = true
34
+ @lines = []
32
35
  end
33
36
 
34
- def build(subject = nil)
37
+ def build(subject = default, execute: true)
38
+ @execute = execute
39
+ @lines = []
35
40
  # puts "Building #{subject.inspect}"
36
41
  Dir.chdir(directory) {
37
42
  if subject
@@ -40,6 +45,8 @@ module Prick
40
45
  build_directory(".")
41
46
  end
42
47
  }
48
+ @lines.reject! { |l| l =~ /^\s*--/ || l =~ /^\s*$/ }
49
+ self
43
50
  end
44
51
 
45
52
  def self.yml_file(directory) raise NotThis end
@@ -52,13 +59,26 @@ module Prick
52
59
 
53
60
  def do_sql(path)
54
61
  # puts "do_sql(#{path})"
55
- do_dir(path) { |file| Rdbms.exec_file(database.name, file, user: database.user) }
62
+ do_dir(path) { |file|
63
+ if @execute
64
+ Rdbms.exec_file(database.name, file, user: database.user)
65
+ else
66
+ @lines += IO.readlines(file).map(&:chomp)
67
+ end
68
+ }
56
69
  true
57
70
  end
58
71
 
59
72
  def do_exe(path)
60
73
  # puts "do_exe(#{path})"
61
- do_dir(path) { |file| Command.command "#{file} #{database.name} #{database.user}" } # FIXME Security
74
+ do_dir(path) { |file|
75
+ lines = Command.command "#{file} #{database.name} #{database.user}" # FIXME Security
76
+ if @execute
77
+ Rdbms.exec_sql(database.name, lines.join("\n"), database.user)
78
+ else
79
+ @lines += lines
80
+ end
81
+ }
62
82
  true
63
83
  end
64
84
 
@@ -73,9 +93,9 @@ module Prick
73
93
  def build_subject(subject)
74
94
  if File.file?(subject) && File.executable?(subject)
75
95
  do_exe(subject)
76
- elsif subject.end_with?(".yml")
96
+ elsif File.file?(subject) && subject.end_with?(".yml")
77
97
  do_yml(subject)
78
- elsif subject.end_with?(".sql")
98
+ elsif File.file?(subject) && subject.end_with?(".sql")
79
99
  do_sql(subject)
80
100
  elsif File.exist?(yml_file = "#{subject}.yml")
81
101
  do_yml(yml_file)
@@ -90,7 +110,7 @@ module Prick
90
110
 
91
111
  def build_directory(path)
92
112
  Dir.chdir(path) {
93
- build_subject(File.join(path, "build")) || begin
113
+ build_subject(File.join(path, @default)) || begin
94
114
  if Dir["#{path}/#{default}", "#{path}/#{default}.yml", "#{path}/#{default}.sql"]
95
115
  subjects = [default]
96
116
  else
@@ -119,8 +139,10 @@ module Prick
119
139
  super(database, directory, "build")
120
140
  end
121
141
 
122
- def build(subject = nil)
142
+ def build(subject = nil, execute: true)
123
143
  if subject
144
+ @execute = execute
145
+ @lines = []
124
146
  Dir.chdir(directory) {
125
147
  if File.executable?(subject)
126
148
  do_exe(subject)
@@ -131,8 +153,9 @@ module Prick
131
153
  end
132
154
  }
133
155
  else
134
- super()
156
+ super(execute: execute)
135
157
  end
158
+ self
136
159
  end
137
160
 
138
161
  def self.yml_file(directory) File.join(directory, "build") + ".yml" end
@@ -0,0 +1,34 @@
1
+
2
+ module Prick
3
+ class Cache
4
+ def initialize
5
+ end
6
+
7
+ def exist?(version)
8
+ File.exist?(file(version))
9
+ end
10
+
11
+ def list
12
+ Dir.glob(File.join(CACHE_DIR, "*.sql.gz"))
13
+ end
14
+
15
+ def load(database, version)
16
+ Rdbms.load(database, file(version))
17
+ end
18
+
19
+ def save(database, version = database.version)
20
+ Rdbms.save(database, file(version))
21
+ end
22
+
23
+ # Returns list of removed files
24
+ def clean
25
+ l = list
26
+ FileUtils.rm(l)
27
+ l
28
+ end
29
+
30
+ def file(version)
31
+ File.join(CACHE_DIR, "#{version}.sql.gz")
32
+ end
33
+ end
34
+ end
@@ -2,31 +2,16 @@
2
2
  module Prick
3
3
  ### DIRECTORIES AND FILE NAMES
4
4
 
5
- # Path to the .prick-version file
6
- PRICK_VERSION_FILE = ".prick-version"
7
-
8
- # State files
9
- PROJECT_STATE_FILE = ".prick-project"
10
- FEATURES_STATE_FILE = ".prick-features"
11
- MIGRATION_STATE_FILE = ".prick-migration"
12
- MIGRATIONS_FILE = "migrations.sql"
13
-
14
- # Diff file
15
- DIFF_FILE = "diff.sql"
16
-
17
5
  # Shared files (part of the installation)
18
6
  SHARE_PATH = "#{File.dirname(File.dirname(__dir__))}/share"
19
7
  LIBEXEC_PATH = "#{File.dirname(File.dirname(__dir__))}/libexec"
20
8
 
21
- STRIP_COMMENTS_COMMAND = File.join(LIBEXEC_PATH, "strip-comments")
22
-
23
9
  # Project directories
24
10
  DIRS = [
25
- MIGRATIONS_DIR = "migrations",
26
- RELEASES_DIR = "releases",
27
- SCHEMAS_DIR = "schemas",
28
- PRICK_DIR = "#{SCHEMAS_DIR}/prick",
29
- PUBLIC_DIR = "#{SCHEMAS_DIR}/public",
11
+ MIGRATION_DIR = "migration",
12
+ SCHEMA_DIR = "schema",
13
+ PRICK_DIR = "#{SCHEMA_DIR}/prick",
14
+ PUBLIC_DIR = "#{SCHEMA_DIR}/public",
30
15
  VAR_DIR = "var",
31
16
  CACHE_DIR = "#{VAR_DIR}/cache",
32
17
  SPOOL_DIR = "#{VAR_DIR}/spool",
@@ -35,9 +20,42 @@ module Prick
35
20
  SPEC_DIR = "spec"
36
21
  ]
37
22
 
38
- # Path to prick data file
39
- # PRICK_DATA_PATH = File.join(SCHEMAS_DIR, "prick", "data.sql")
40
- SCHEMA_VERSION_PATH = File.join(SCHEMAS_DIR, "prick", "data.sql")
23
+ # The project state file
24
+ PROJECT_STATE_FILE = ".prick-project"
25
+ PROJECT_STATE_PATH = PROJECT_STATE_FILE
26
+
27
+ # The .prick-version file
28
+ PRICK_VERSION_FILE = ".prick-version"
29
+ PRICK_VERSION_PATH = PRICK_VERSION_FILE
30
+
31
+ # The prick.versions data file. This is where the Schema saves its version
32
+ SCHEMA_VERSION_FILE = "data.sql"
33
+ SCHEMA_VERSION_PATH = File.join(PRICK_DIR, SCHEMA_VERSION_FILE)
34
+
35
+ # The the .prick-migration file
36
+ PRICK_MIGRATION_FILE = ".prick-migration"
37
+ PRICK_MIGRATION_PATH = File.join(MIGRATION_DIR, PRICK_MIGRATION_FILE)
38
+
39
+ # The the .prick-feature file
40
+ PRICK_FEATURE_FILE = ".prick-feature"
41
+ PRICK_FEATURE_PATH = File.join(MIGRATION_DIR, PRICK_FEATURE_FILE)
42
+
43
+ # The strip-comments executable
44
+ STRIP_COMMENTS_NAME = "strip-comments"
45
+ STRIP_COMMENTS_PATH = File.join(LIBEXEC_PATH, "strip-comments")
46
+
47
+ # Diff files
48
+ DIFF_FILE = "diff.sql"
49
+ BEFORE_TABLES_DIFF_NAME = "diff.before-tables.sql"
50
+ TABLES_DIFF_NAME = "diff.tables.sql"
51
+ AFTER_TABLES_DIFF_NAME = "diff.after-tables.sql"
52
+
53
+ BEFORE_TABLES_DIFF_PATH = File.join(MIGRATION_DIR, BEFORE_TABLES_DIFF_NAME)
54
+ TABLES_DIFF_PATH = File.join(MIGRATION_DIR, TABLES_DIFF_NAME)
55
+ AFTER_TABLES_DIFF_PATH = File.join(MIGRATION_DIR, AFTER_TABLES_DIFF_NAME)
56
+
57
+ TABLES_DIFF_SHARE_PATH = File.join(SHARE_PATH, "diff", TABLES_DIFF_NAME)
58
+
41
59
 
42
60
  # Dump files
43
61
  DUMP_EXT = "dump.gz"
@@ -46,33 +64,27 @@ module Prick
46
64
 
47
65
  ### REGULAR EXPRESSIONS
48
66
 
67
+ # Matches a system name. System names are used for objects that are external to prick
68
+ # (like usernames)
69
+ NAME_SUB_RE = /[a-z][a-z0-9_-]*/
70
+ NAME_RE = /^#{NAME_SUB_RE}$/
71
+
49
72
  # Matches an identifier. Identifiers consist of lower case letters, digits
50
73
  # and underscores but not dashes because they're used as separators
51
74
  IDENT_SUB_RE = /[a-z][a-z0-9_]*/
52
75
  IDENT_RE = /^#{IDENT_SUB_RE}$/
53
76
 
54
- # Matches an uppercase identifier
55
- # UPCASE_IDENT_SUB_RE = /[A-Z][A-Z0-9_]*/
56
- # UPCASE_IDENT_RE = /#{UPCASE_IDENT_SUB_RE}/
57
-
58
- # A (system) name. Names are used for projects and usernames that are
59
- # external to prick and can include both dashes and underscores but dashes
60
- # have to be followed by a character and not a digit so 'ident-1234' is not
61
- # allowed but 'ident_1234' and 'ident1234' are
62
- NAME_SUB_RE = /#{IDENT_SUB_RE}/
63
- NAME_RE = /^#{NAME_SUB_RE}$/
64
-
65
77
  # Matches a project name
66
- PROJECT_NAME_SUB_RE = NAME_SUB_RE
67
- PROJECT_NAME_RE = NAME_RE
78
+ PROJECT_NAME_SUB_RE = IDENT_SUB_RE
79
+ PROJECT_NAME_RE = IDENT_RE
68
80
 
69
81
  # Matches a custom name
70
- CUSTOM_NAME_SUB_RE = NAME_SUB_RE
71
- CUSTOM_NAME_RE = NAME_RE
82
+ CUSTOM_NAME_SUB_RE = IDENT_SUB_RE
83
+ CUSTOM_NAME_RE = IDENT_RE
72
84
 
73
85
  # Matches a feature name
74
- FEATURE_NAME_SUB_RE = NAME_SUB_RE
75
- FEATURE_NAME_RE = NAME_RE
86
+ FEATURE_NAME_SUB_RE = /(?!initial)#{IDENT_SUB_RE}/
87
+ FEATURE_NAME_RE = /^#{FEATURE_NAME_SUB_RE}$/
76
88
 
77
89
  # Matches a postgres user name
78
90
  USER_NAME_SUB_RE = NAME_SUB_RE
@@ -103,15 +115,48 @@ module Prick
103
115
  SEMVER_SUB_RE = /#{MMP_SEMVER_SUB_RE}(?:-#{PRE_SEMVER_SUB_RE})?/
104
116
  SEMVER_RE = /^#{SEMVER_SUB_RE}$/
105
117
 
106
- # Version RE. The general syntax for a version is '<custom>-<version>_<feature>'
118
+ # Tag RE. The general syntax for a tag is '<custom>-v<version>_<feature>'
119
+ #
120
+ # The RE defines the following captures:
121
+ # $1 - custom name, can be nil
122
+ # $2 - semantic version
123
+ # $3 - feature name, can be nil
124
+ #
125
+ TAG_SUB_RE = /
126
+ (?:(#{CUSTOM_NAME_SUB_RE})-)?
127
+ v
128
+ (#{SEMVER_SUB_RE})
129
+ (?:_(#{FEATURE_NAME_SUB_RE}))?
130
+ /x
131
+ TAG_RE = /^#{TAG_SUB_RE}$/
132
+
133
+ # TODO: Handle initial branches (0.0.0-initial)
134
+
135
+ # Branch RE. The general syntax for a branch is '<custom>-<version>_<feature>'
107
136
  #
108
137
  # The RE defines the following captures:
109
138
  # $1 - custom name, can be nil
110
139
  # $2 - semantic version
111
140
  # $3 - feature name, can be nil
112
141
  #
142
+ BRANCH_SUB_RE = /
143
+ (?:(#{CUSTOM_NAME_SUB_RE})-)?
144
+ (#{SEMVER_SUB_RE})
145
+ (?:_(#{FEATURE_NAME_SUB_RE}))?
146
+ /x
147
+ BRANCH_RE = /^#{BRANCH_SUB_RE}$/
148
+
149
+ # Tag or branch RE. The general syntax for a branch is '<custom>-v?<version>_<feature>'
150
+ #
151
+ # The RE defines the following captures:
152
+ # $1 - custom name, can be nil
153
+ # $2 - tag, nil or 'v'
154
+ # $3 - semantic version
155
+ # $4 - feature name, can be nil
156
+ #
113
157
  VERSION_SUB_RE = /
114
158
  (?:(#{CUSTOM_NAME_SUB_RE})-)?
159
+ (v)?
115
160
  (#{SEMVER_SUB_RE})
116
161
  (?:_(#{FEATURE_NAME_SUB_RE}))?
117
162
  /x
@@ -135,11 +180,11 @@ module Prick
135
180
  # $1 - custom name, can be nil
136
181
  # $2 - semantic version
137
182
  #
138
- RELEASE_SUB_RE = /
139
- (?:(#{CUSTOM_NAME_SUB_RE})-)?
140
- (#{MMP_SEMVER_SUB_RE})
141
- /x
142
- RELEASE_RE = /^#{RELEASE_SUB_RE}$/
183
+ # RELEASE_SUB_RE = /
184
+ # (?:(#{CUSTOM_NAME_SUB_RE})-)?
185
+ # (#{MMP_SEMVER_SUB_RE})
186
+ # /x
187
+ # RELEASE_RE = /^#{RELEASE_SUB_RE}$/
143
188
 
144
189
  # Matches a prerelease branch
145
190
  #
@@ -147,11 +192,11 @@ module Prick
147
192
  # $1 - custom name, can be nil
148
193
  # $2 - semantic version
149
194
  #
150
- PRERELEASE_SUB_RE = /
151
- (?:(#{CUSTOM_NAME_SUB_RE})-)?
152
- (#{MMP_SEMVER_SUB_RE}-#{PRE_SEMVER_SUB_RE})
153
- /x
154
- PRERELEASE_RE = /^#{PRERELEASE_SUB_RE}$/
195
+ # PRERELEASE_SUB_RE = /
196
+ # (?:(#{CUSTOM_NAME_SUB_RE})-)?
197
+ # (#{MMP_SEMVER_SUB_RE}-#{PRE_SEMVER_SUB_RE})
198
+ # /x
199
+ # PRERELEASE_RE = /^#{PRERELEASE_SUB_RE}$/
155
200
 
156
201
  # Matches a feature branch
157
202
  #
@@ -160,8 +205,8 @@ module Prick
160
205
  # $2 - semantic version
161
206
  # $3 - feature name
162
207
  #
163
- FEATURE_SUB_RE = /#{ABSTRACT_RELEASE_SUB_RE}_(#{FEATURE_NAME_SUB_RE})/
164
- FEATURE_RE = /^#{FEATURE_SUB_RE}$/
208
+ # FEATURE_SUB_RE = /#{ABSTRACT_RELEASE_SUB_RE}_(#{FEATURE_NAME_SUB_RE})/
209
+ # FEATURE_RE = /^#{FEATURE_SUB_RE}$/
165
210
 
166
211
  # Migration RE. The syntax is <version>_<version>
167
212
  #
@@ -173,8 +218,8 @@ module Prick
173
218
  # $5 - to custom name, can be nil
174
219
  # $6 - to semantic version
175
220
  #
176
- MIGRATION_SUB_RE = /(#{RELEASE_SUB_RE})_(#{RELEASE_SUB_RE})/
177
- MIGRATION_RE = /^#{MIGRATION_SUB_RE}$/
221
+ # MIGRATION_SUB_RE = /(#{RELEASE_SUB_RE})_(#{RELEASE_SUB_RE})/
222
+ # MIGRATION_RE = /^#{MIGRATION_SUB_RE}$/
178
223
 
179
224
  # Project release RE. The general syntax is '<project>-<custom>-<version>'
180
225
  #
@@ -217,5 +262,12 @@ module Prick
217
262
  ALL_DATABASES_RE = /^#{ALL_DATABASES_SUB_RE}$/
218
263
  def self.all_databases_sub_re(project_name) /(#{project_name})(?:-(#{ABSTRACT_RELEASE_SUB_RE}))?/ end
219
264
  def self.all_databases_re(project_name) /^#{all_databases_sub_re(project_name)}$/ end
265
+
266
+ # Matches temporary databases. Mostly useful when debugging because temporary databases
267
+ # should be deleted on exit
268
+ TMP_DATABASES_SUB_RE = /#{PROJECT_NAME_SUB_RE}-(?:base|next)/
269
+ TMP_DATABASES_RE = /^#{TMP_DATABASES_SUB_RE}$/
270
+ def self.tmp_databases_sub_re(project_name) /#{project_name}-(?:base|next)/ end
271
+ def self.tmp_databases_re(project_name) /^#{tmp_databases_sub_re(project_name)}$/ end
220
272
  end
221
273
 
@@ -1,26 +1,29 @@
1
1
 
2
- #require "prick/ensure.rb"
3
-
4
2
  module Prick
5
3
  class Database
6
4
  attr_reader :name
7
5
  attr_reader :user
8
6
 
9
7
  def initialize(name, user)
8
+ name != "" or raise "Illegal database name"
10
9
  @name = name
11
10
  @user = user
12
11
  @version = nil
13
12
  end
14
13
 
15
- def version
16
- @version ||= begin
17
- version =
18
- if exist? && Rdbms.exist_table?(name, "prick", "versions")
19
- Rdbms.select(name, "select version from prick.versions")&.first&.first
20
- else
21
- nil
22
- end
23
- version && Version.new(version)
14
+ def version(cache: true)
15
+ if cache && @version
16
+ @version
17
+ else
18
+ @version = begin
19
+ version =
20
+ if exist? && Rdbms.exist_table?(name, "prick", "versions")
21
+ Rdbms.select(name, "select version from prick.versions")&.first&.first
22
+ else
23
+ nil
24
+ end
25
+ version && Version.new(version)
26
+ end
24
27
  end
25
28
  end
26
29
 
@@ -43,18 +46,21 @@ module Prick
43
46
  def drop() Rdbms.drop_database(name, fail: false); @version = nil end
44
47
 
45
48
  def loaded?() !version.nil? end
46
- def load(file) Rdbms.load(name, file, user: user); @version = nil end
47
49
 
48
- def save(file) Rdbms.save(name, file); @version = nil end
50
+ def load(file)
51
+ !loaded? or raise Internal, "Database #{name} is already loaded"
52
+ Rdbms.load(name, file, user: user)
53
+ version # Provoke load of version
54
+ end
49
55
 
50
- def to_s() name end
56
+ def save(file)
57
+ loaded? or raise Internal, "Database #{name} is not loaded"
58
+ Rdbms.save(name, file)
59
+ @version = nil
60
+ end
51
61
 
52
- # include Ensure
62
+ def clean() recreate end # TODO: Find solution that doesn't involve dropping the database
53
63
 
54
- private
55
- @states = {
56
- exist: [:create, :drop],
57
- loaded: [:exist, :load, :recreate]
58
- }
64
+ def to_s() name end
59
65
  end
60
66
  end