monkey_butler 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +2 -0
  3. data/.gitignore +3 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +28 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +122 -0
  8. data/Guardfile +8 -0
  9. data/LICENSE +202 -0
  10. data/README.md +221 -0
  11. data/Rakefile +16 -0
  12. data/bin/mb +6 -0
  13. data/lib/monkey_butler.rb +1 -0
  14. data/lib/monkey_butler/actions.rb +38 -0
  15. data/lib/monkey_butler/cli.rb +354 -0
  16. data/lib/monkey_butler/databases/abstract_database.rb +49 -0
  17. data/lib/monkey_butler/databases/cassandra_database.rb +69 -0
  18. data/lib/monkey_butler/databases/sqlite_database.rb +105 -0
  19. data/lib/monkey_butler/migrations.rb +52 -0
  20. data/lib/monkey_butler/project.rb +90 -0
  21. data/lib/monkey_butler/targets/base.rb +85 -0
  22. data/lib/monkey_butler/targets/cassandra/cassandra_target.rb +72 -0
  23. data/lib/monkey_butler/targets/cassandra/create_schema_migrations.cql.erb +16 -0
  24. data/lib/monkey_butler/targets/cassandra/migration.cql.erb +0 -0
  25. data/lib/monkey_butler/targets/cocoapods/cocoapods_target.rb +43 -0
  26. data/lib/monkey_butler/targets/cocoapods/podspec.erb +12 -0
  27. data/lib/monkey_butler/targets/maven/maven_target.rb +60 -0
  28. data/lib/monkey_butler/targets/maven/project/.gitignore +6 -0
  29. data/lib/monkey_butler/targets/maven/project/MonkeyButler.iml +19 -0
  30. data/lib/monkey_butler/targets/maven/project/build.gradle +54 -0
  31. data/lib/monkey_butler/targets/sqlite/create_monkey_butler_tables.sql.erb +15 -0
  32. data/lib/monkey_butler/targets/sqlite/migration.sql.erb +11 -0
  33. data/lib/monkey_butler/targets/sqlite/sqlite_target.rb +91 -0
  34. data/lib/monkey_butler/templates/Gemfile.erb +4 -0
  35. data/lib/monkey_butler/templates/gitignore.erb +1 -0
  36. data/lib/monkey_butler/util.rb +71 -0
  37. data/lib/monkey_butler/version.rb +3 -0
  38. data/logo.jpg +0 -0
  39. data/monkey_butler.gemspec +33 -0
  40. data/spec/cli_spec.rb +700 -0
  41. data/spec/databases/cassandra_database_spec.rb +241 -0
  42. data/spec/databases/sqlite_database_spec.rb +181 -0
  43. data/spec/migrations_spec.rb +4 -0
  44. data/spec/project_spec.rb +128 -0
  45. data/spec/sandbox/cassandra/.gitignore +2 -0
  46. data/spec/sandbox/cassandra/.monkey_butler.yml +7 -0
  47. data/spec/sandbox/cassandra/migrations/20140523123443021_create_sandbox.cql.sql +14 -0
  48. data/spec/sandbox/cassandra/sandbox.cql +0 -0
  49. data/spec/sandbox/sqlite/.gitignore +2 -0
  50. data/spec/sandbox/sqlite/.monkey_butler.yml +7 -0
  51. data/spec/sandbox/sqlite/migrations/20140523123443021_create_sandbox.sql +14 -0
  52. data/spec/sandbox/sqlite/sandbox.sql +0 -0
  53. data/spec/spec_helper.rb +103 -0
  54. data/spec/targets/cassandra_target_spec.rb +191 -0
  55. data/spec/targets/cocoapods_target_spec.rb +197 -0
  56. data/spec/targets/maven_target_spec.rb +156 -0
  57. data/spec/targets/sqlite_target_spec.rb +103 -0
  58. data/spec/util_spec.rb +13 -0
  59. metadata +260 -0
@@ -0,0 +1,156 @@
1
+ require 'spec_helper'
2
+ require 'monkey_butler/targets/base'
3
+ require 'monkey_butler/targets/maven/maven_target'
4
+
5
+ describe MonkeyButler::Targets::MavenTarget do
6
+ let(:thor_class) { MonkeyButler::Targets::MavenTarget }
7
+ let!(:project_root) { clone_temp_sandbox }
8
+
9
+ describe "#init" do
10
+ it "asks for Maven Java repository URL and credentials" do
11
+ remove_maven_repo_from_config
12
+ remove_maven_username_from_config
13
+ remove_maven_password_from_config
14
+ expect(Thor::LineEditor).to receive(:readline).with("What is the URL of your Java Maven repo? ", {}).and_return(File.join(project_root, "maven"))
15
+ expect(Thor::LineEditor).to receive(:readline).with("What is the username for your Java Maven repo? ", {}).and_return("none")
16
+ expect(Thor::LineEditor).to receive(:readline).with("What is the password for your Java Maven repo? ", {}).and_return("none")
17
+ invoke!(['init'])
18
+ end
19
+ end
20
+
21
+ describe '#generate' do
22
+ before(:all) do
23
+ # Put config into the YAML
24
+ yaml_path = File.join(project_root, '.monkey_butler.yml')
25
+ project = YAML.load(File.read(yaml_path))
26
+ project['config']['maven.url'] = 'maven'
27
+ project['config']['maven.username'] = 'none'
28
+ project['config']['maven.password'] = 'none'
29
+ File.open(yaml_path, 'w') { |f| f << YAML.dump(project) }
30
+
31
+ invoke!(['generate', '--quiet'])
32
+ end
33
+
34
+ # Shadow the let! declarations so we can use before(:all)
35
+ def thor_class
36
+ MonkeyButler::Targets::MavenTarget
37
+ end
38
+
39
+ def project_root
40
+ @project_root ||= clone_temp_sandbox
41
+ end
42
+
43
+ it "should have project/build.gradle" do
44
+ expect(File.directory?(File.join(project_root, 'project'))).to eq(true)
45
+ expect(File.file?(File.join(project_root, 'project/build.gradle'))).to eq(true)
46
+ end
47
+
48
+ it "should have a schema file in resources/schema" do
49
+ expect(File.directory?(File.join(project_root, 'project/src/main/resources/schema'))).to eq(true)
50
+ expect(File.file?(File.join(project_root, 'project/src/main/resources/schema/schema.sql'))).to eq(true)
51
+ end
52
+
53
+ it "should have migration files in resources/migrations" do
54
+ expect(File.directory?(File.join(project_root, 'project/src/main/resources/migrations'))).to eq(true)
55
+ expect(Dir.entries(File.join(project_root, 'project/src/main/resources/migrations')).size).not_to eq(2)
56
+ end
57
+
58
+ it "should have project/build/libs/monkeybutler-[version].jar files" do
59
+ expect(File.file?(built_jar_path)).to eq(true)
60
+ end
61
+
62
+ it "should have a schema packaged in the JAR" do
63
+ jar_schema = `jar tf #{built_jar_path} | grep -e schema/.*[.]sql`.strip
64
+ expect(jar_schema).to eq("schema/schema.sql")
65
+ end
66
+
67
+ it "should have all migrations packaged in the JAR" do
68
+ # Create a hash of all expected migrations
69
+ expected_migrations = Hash.new
70
+ Dir.foreach(File.join(project_root, "migrations")) do |entry|
71
+ if !entry.end_with? ".sql" then
72
+ next
73
+ end
74
+ expected_migrations[entry] = true
75
+ end
76
+
77
+ # Create a array of all migrations packaged in the JAR
78
+ jar_migrations = `jar tf #{built_jar_path} | grep -e migrations/.*[.]sql`
79
+ jar_migration_array = jar_migrations.split(/\r?\n/)
80
+
81
+ # Verify that the expected and actual have the same size
82
+ expect(jar_migration_array.length).to eq(expected_migrations.length)
83
+
84
+ # Verify that all JAR'd migrations were expected
85
+ jar_migration_array.each { |jar_migration|
86
+ length = jar_migration.length - "migrations/".length
87
+ migration = jar_migration[-length, length]
88
+ expect(expected_migrations[migration]).to eq(true)
89
+ }
90
+ end
91
+
92
+ it "should clear java project between `generate` invocations" do
93
+ # Create a random file in the project directory.
94
+ yaml_path = File.join(project_root, '.monkey_butler.yml')
95
+ project = YAML.load(File.read(yaml_path))
96
+ File.open(File.join(project_root, 'project/deleteme.txt'), 'w') { |f| f << YAML.dump(project) }
97
+ expect(File.file?(File.join(project_root, 'project/deleteme.txt'))).to eq(true)
98
+ invoke!(['generate', '--quiet'])
99
+ expect(File.file?(File.join(project_root, 'project/deleteme.txt'))).to eq(false)
100
+ end
101
+ end
102
+
103
+ describe '#push' do
104
+ before(:each) do
105
+ set_config
106
+ invoke!(%w{generate --quiet})
107
+ invoke!(%w{push --quiet})
108
+ end
109
+
110
+ it "should have monkeybutler-[version].jar file in the local Maven" do
111
+ expect(File.file?(maven_jar_path)).to eq(true)
112
+ end
113
+ end
114
+
115
+ private
116
+
117
+ def remove_maven_repo_from_config
118
+ yaml_path = File.join(project_root, '.monkey_butler.yml')
119
+ project = YAML.load(File.read(yaml_path))
120
+ project['config'].delete 'maven.url'
121
+ File.open(yaml_path, 'w') { |f| f << YAML.dump(project) }
122
+ end
123
+
124
+ def remove_maven_username_from_config
125
+ yaml_path = File.join(project_root, '.monkey_butler.yml')
126
+ project = YAML.load(File.read(yaml_path))
127
+ project['config'].delete 'maven.username'
128
+ File.open(yaml_path, 'w') { |f| f << YAML.dump(project) }
129
+ end
130
+
131
+ def remove_maven_password_from_config
132
+ yaml_path = File.join(project_root, '.monkey_butler.yml')
133
+ project = YAML.load(File.read(yaml_path))
134
+ project['config'].delete 'maven.password'
135
+ File.open(yaml_path, 'w') { |f| f << YAML.dump(project) }
136
+ end
137
+
138
+ def set_config
139
+ remove_maven_repo_from_config
140
+ remove_maven_username_from_config
141
+ remove_maven_password_from_config
142
+ expect(Thor::LineEditor).to receive(:readline).with("What is the URL of your Java Maven repo? ", {}).and_return(File.join(project_root, "maven"))
143
+ expect(Thor::LineEditor).to receive(:readline).with("What is the username for your Java Maven repo? ", {}).and_return("none")
144
+ expect(Thor::LineEditor).to receive(:readline).with("What is the password for your Java Maven repo? ", {}).and_return("none")
145
+ invoke!(['init'])
146
+ end
147
+
148
+ def maven_jar_path
149
+ File.join(project_root, "maven/com/layer/monkeybutler/20140523123443021/monkeybutler-20140523123443021.jar")
150
+ end
151
+
152
+ def built_jar_path
153
+ File.join(project_root, "project/build/libs/monkeybutler-20140523123443021.jar")
154
+ end
155
+
156
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+ require 'monkey_butler/targets/sqlite/sqlite_target'
3
+ require 'monkey_butler/databases/sqlite_database'
4
+
5
+ describe MonkeyButler::Targets::SqliteTarget do
6
+ let(:thor_class) { MonkeyButler::CLI }
7
+ let!(:project_root) { clone_temp_sandbox }
8
+ let(:project) { MonkeyButler::Project.load(project_root) }
9
+ let(:schema_path) { File.join(project_root, project.schema_path) }
10
+ let(:db_path) { File.join(project_root, 'sandbox.sqlite') }
11
+
12
+ describe "#new" do
13
+ it "generates a new migration with the given name" do
14
+ invoke!(%w{new add_column_to_table})
15
+ migration = Dir.entries(File.join(project_root, 'migrations')).detect { |f| f =~ /add_column_to_table\.sql/ }
16
+ migration.should_not be_nil
17
+ end
18
+ end
19
+
20
+ describe '#dump' do
21
+ before(:each) do
22
+ db = MonkeyButler::Databases::SqliteDatabase.new(URI(db_path))
23
+ db.drop
24
+ db.execute_migration MonkeyButler::Util.strip_leading_whitespace(
25
+ <<-SQL
26
+ #{MonkeyButler::Databases::SqliteDatabase.create_schema_migrations_sql}
27
+ CREATE TABLE table1(version INTEGER UNIQUE NOT NULL, name STRING NOT NULL);
28
+ CREATE TABLE table2(version INTEGER UNIQUE NOT NULL, name STRING NOT NULL);
29
+ CREATE INDEX name1 ON table1(name);
30
+ CREATE VIEW full_name AS SELECT table1.name || table2.name AS full_name FROM table1, table2;
31
+ CREATE TRIGGER kill_overlapping_names AFTER DELETE ON table1
32
+ BEGIN
33
+ DELETE FROM table2 WHERE name = OLD.name;
34
+ END;
35
+ INSERT INTO schema_migrations(version) VALUES (201405233443021)
36
+ SQL
37
+ )
38
+ end
39
+
40
+ let(:dumped_schema) { File.read(schema_path) }
41
+
42
+ it "dumps tables" do
43
+ output = invoke!(%w{dump})
44
+ dumped_schema.should =~ /CREATE TABLE schema_migrations/
45
+ output[:stdout].should =~ /wrote table: schema_migrations/
46
+ dumped_schema.should =~ /CREATE TABLE table1\(version INTEGER UNIQUE NOT NULL, name STRING NOT NULL\);/
47
+ output[:stdout].should =~ /wrote table: table1/
48
+ dumped_schema.should =~ /CREATE TABLE table2\(version INTEGER UNIQUE NOT NULL, name STRING NOT NULL\);/
49
+ output[:stdout].should =~ /wrote table: table2/
50
+ end
51
+
52
+ it "dumps indexes" do
53
+ output = invoke!(%w{dump})
54
+ dumped_schema.should =~ /CREATE INDEX name1 ON table1\(name\);/
55
+ output[:stdout].should =~ /wrote index: name1/
56
+ end
57
+
58
+ it "dumps triggers" do
59
+ output = invoke!(%w{dump})
60
+ dumped_schema.should =~ /CREATE TRIGGER kill_overlapping_names AFTER DELETE ON table1/
61
+ output[:stdout].should =~ /wrote trigger: kill_overlapping_names/
62
+ end
63
+
64
+ it "dumps views" do
65
+ output = invoke!(%w{dump})
66
+ dumped_schema.should =~ /CREATE VIEW full_name AS SELECT table1.name || table2.name AS full_name FROM table1, table2;/
67
+ output[:stdout].should =~ /wrote view: full_name/
68
+ end
69
+
70
+ it "dumps rows from schema_migrations" do
71
+ output = invoke!(%w{dump})
72
+ dumped_schema.should =~ /INSERT INTO schema_migrations\(version\) VALUES \(201405233443021\);/
73
+ output[:stdout].should =~ /wrote version: 201405233443021/
74
+ end
75
+
76
+ it "informs the user of completion" do
77
+ output = invoke!(%w{dump})
78
+ output[:stdout].should =~ /Dump complete. Schema written to sandbox\.sql/
79
+ end
80
+
81
+ context "when given a database parameter" do
82
+ it "dumps the specified database" do
83
+ output = invoke!(%W{dump -d #{db_path}})
84
+ output[:stdout].should =~ /Dumping schema from database '#{db_path}'/
85
+ end
86
+
87
+ context "that does not exist" do
88
+ it "fails with error" do
89
+ output = invoke!(%w{dump -d /tmp/invalid_path})
90
+ output[:stderr].should =~ /Cannot dump database: no file at path '\/tmp\/invalid_path'/
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ describe "#drop" do
97
+ it "truncates the database file" do
98
+ File.open(db_path, 'w+') { |f| f << "test" }
99
+ output = invoke!(%w{drop})
100
+ File.size(db_path).should == 0
101
+ end
102
+ end
103
+ end
data/spec/util_spec.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe MonkeyButler::Util do
4
+ describe '#migrations_by_version' do
5
+ it "returns a Hash keyed by version" do
6
+ paths = %w{migrations/20140523123443021_create_sandbox.sql migrations/20140523123845031_add_comments_table.sql}
7
+ hash = MonkeyButler::Util.migrations_by_version(paths)
8
+ hash.size.should == 2
9
+ hash[20140523123443021].should == 'migrations/20140523123443021_create_sandbox.sql'
10
+ hash[20140523123845031].should == 'migrations/20140523123845031_add_comments_table.sql'
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,260 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: monkey_butler
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Blake Watters
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.19.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.9
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.9
41
+ - !ruby/object:Gem::Dependency
42
+ name: cql-rb
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 2.14.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 2.14.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 4.2.9
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 4.2.9
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.8.2
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 0.8.2
125
+ - !ruby/object:Gem::Dependency
126
+ name: byebug
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 3.1.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 3.1.2
139
+ - !ruby/object:Gem::Dependency
140
+ name: cocoapods
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 0.33.1
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 0.33.1
153
+ description: A simple hello world gem
154
+ email: blake@layer.com
155
+ executables:
156
+ - mb
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - .bundle/config
161
+ - .gitignore
162
+ - .ruby-version
163
+ - CHANGELOG.md
164
+ - Gemfile
165
+ - Gemfile.lock
166
+ - Guardfile
167
+ - LICENSE
168
+ - README.md
169
+ - Rakefile
170
+ - bin/mb
171
+ - lib/monkey_butler.rb
172
+ - lib/monkey_butler/actions.rb
173
+ - lib/monkey_butler/cli.rb
174
+ - lib/monkey_butler/databases/abstract_database.rb
175
+ - lib/monkey_butler/databases/cassandra_database.rb
176
+ - lib/monkey_butler/databases/sqlite_database.rb
177
+ - lib/monkey_butler/migrations.rb
178
+ - lib/monkey_butler/project.rb
179
+ - lib/monkey_butler/targets/base.rb
180
+ - lib/monkey_butler/targets/cassandra/cassandra_target.rb
181
+ - lib/monkey_butler/targets/cassandra/create_schema_migrations.cql.erb
182
+ - lib/monkey_butler/targets/cassandra/migration.cql.erb
183
+ - lib/monkey_butler/targets/cocoapods/cocoapods_target.rb
184
+ - lib/monkey_butler/targets/cocoapods/podspec.erb
185
+ - lib/monkey_butler/targets/maven/maven_target.rb
186
+ - lib/monkey_butler/targets/maven/project/.gitignore
187
+ - lib/monkey_butler/targets/maven/project/MonkeyButler.iml
188
+ - lib/monkey_butler/targets/maven/project/build.gradle
189
+ - lib/monkey_butler/targets/sqlite/create_monkey_butler_tables.sql.erb
190
+ - lib/monkey_butler/targets/sqlite/migration.sql.erb
191
+ - lib/monkey_butler/targets/sqlite/sqlite_target.rb
192
+ - lib/monkey_butler/templates/Gemfile.erb
193
+ - lib/monkey_butler/templates/gitignore.erb
194
+ - lib/monkey_butler/util.rb
195
+ - lib/monkey_butler/version.rb
196
+ - logo.jpg
197
+ - monkey_butler.gemspec
198
+ - spec/cli_spec.rb
199
+ - spec/databases/cassandra_database_spec.rb
200
+ - spec/databases/sqlite_database_spec.rb
201
+ - spec/migrations_spec.rb
202
+ - spec/project_spec.rb
203
+ - spec/sandbox/cassandra/.gitignore
204
+ - spec/sandbox/cassandra/.monkey_butler.yml
205
+ - spec/sandbox/cassandra/migrations/20140523123443021_create_sandbox.cql.sql
206
+ - spec/sandbox/cassandra/sandbox.cql
207
+ - spec/sandbox/sqlite/.gitignore
208
+ - spec/sandbox/sqlite/.monkey_butler.yml
209
+ - spec/sandbox/sqlite/migrations/20140523123443021_create_sandbox.sql
210
+ - spec/sandbox/sqlite/sandbox.sql
211
+ - spec/spec_helper.rb
212
+ - spec/targets/cassandra_target_spec.rb
213
+ - spec/targets/cocoapods_target_spec.rb
214
+ - spec/targets/maven_target_spec.rb
215
+ - spec/targets/sqlite_target_spec.rb
216
+ - spec/util_spec.rb
217
+ homepage: http://github.com/layerhq/monkey_butler
218
+ licenses:
219
+ - Apache 2
220
+ metadata: {}
221
+ post_install_message:
222
+ rdoc_options: []
223
+ require_paths:
224
+ - lib
225
+ required_ruby_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ required_rubygems_version: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - '>='
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ requirements: []
236
+ rubyforge_project:
237
+ rubygems_version: 2.0.14
238
+ signing_key:
239
+ specification_version: 4
240
+ summary: Monkey Butler is a schema management system for SQLite
241
+ test_files:
242
+ - spec/cli_spec.rb
243
+ - spec/databases/cassandra_database_spec.rb
244
+ - spec/databases/sqlite_database_spec.rb
245
+ - spec/migrations_spec.rb
246
+ - spec/project_spec.rb
247
+ - spec/sandbox/cassandra/.gitignore
248
+ - spec/sandbox/cassandra/.monkey_butler.yml
249
+ - spec/sandbox/cassandra/migrations/20140523123443021_create_sandbox.cql.sql
250
+ - spec/sandbox/cassandra/sandbox.cql
251
+ - spec/sandbox/sqlite/.gitignore
252
+ - spec/sandbox/sqlite/.monkey_butler.yml
253
+ - spec/sandbox/sqlite/migrations/20140523123443021_create_sandbox.sql
254
+ - spec/sandbox/sqlite/sandbox.sql
255
+ - spec/spec_helper.rb
256
+ - spec/targets/cassandra_target_spec.rb
257
+ - spec/targets/cocoapods_target_spec.rb
258
+ - spec/targets/maven_target_spec.rb
259
+ - spec/targets/sqlite_target_spec.rb
260
+ - spec/util_spec.rb