definite 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
6
+ tmp/
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.2-p0@dbscript
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in db_script.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # Definitive
2
+
3
+ Definitive takes a textual description of database tables and updates your database to match.
4
+
5
+ ## Motivation
6
+
7
+ When maintaining a large Rails project, with new features being added on multiple branches, standard ActiveRecord migrations can get in the way; switching branches with uncommitted migrations can leave you in a state where you can't run rake db:migrate or rake db:rollback or any similar commands.
8
+
9
+ Definitive overcomes this limitation by taking a different approach. Now you only need to define what your database should look like; focus on the end-goal, rather than the migration. When you run Definitive, it will compare your database with your description of the database, and do the migrations automatically for you.
10
+
11
+ ## Is it safe?
12
+
13
+ Until we reach v1.0.0 you should consider this as experimental, and should understand that using this Gem might cause data-loss. It might drop tables, and do other destructive work. Please be careful.
14
+
15
+ Once we reach v1.0.0, it's hoped that it will be safe
16
+
17
+ ## User guide
18
+
19
+ ### Description files
20
+
21
+ Within a standard Rails project, the description files should be placed in a `db/tables` folder, within `RAILS_ROOT`.
22
+
23
+ You can arrange your files as you like, but the best approach is to have one file per database table, named `table_name.table`
24
+
25
+ An example table definition looks like this:
26
+
27
+ TableDefinition.define :users do
28
+
29
+ column :username, :string, :default => nil
30
+ column :password, :string
31
+
32
+ columns :timestamps
33
+
34
+ end
35
+
36
+ The call to `TableDefinition.define` starts the definition. The single argument is the name of the table, which can be a string or a symbol. The block passed in should consist of `column` statements, which are broadly similar to an `add_column` call within an ActiveRecord migration.
37
+
38
+ ### Running Definitive
39
+
40
+ The `definitive` executable takes a number of arguments:
41
+
42
+ - *definitive read filename* - Reads the filename table definition to check that it is a valid file. This operation does not change your database at all.
43
+
44
+ - *definitive read filepath* - Reads the all the `.table` files in the filepath, recursively. Directory structure does not imply a namespace. Files are checked for validity. This operation does not change your database at all.
45
+
46
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/definite ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'definite/cli'
4
+ Definite::CLI.start
data/definite.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "definite/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "definite"
7
+ s.version = Definite::VERSION
8
+ s.authors = ["Graham S Savage"]
9
+ s.email = ["grahamsavage@gmail.com"]
10
+ s.homepage = "https://github.com/gsavage/definitive"
11
+ s.summary = %q{Database manipulation without migrations}
12
+ s.description = %q{Create the definitive description of your DB and let Definitive modify your schema safely for you}
13
+
14
+ s.rubyforge_project = "definite"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rspec"
23
+ s.add_development_dependency "cucumber"
24
+ s.add_development_dependency "aruba"
25
+
26
+ s.add_dependency "activerecord"
27
+ s.add_dependency "thor"
28
+ end
@@ -0,0 +1,17 @@
1
+ Feature: Read definitions
2
+ In order to know what the database should look like
3
+ As a CLI
4
+ I want to read definition files
5
+
6
+ Scenario: Reading a file
7
+ Given a file named "users.table" with:
8
+ """
9
+ TableDefinition.define :users do
10
+ column :username, :string
11
+ end
12
+ """
13
+ When I run `definite read users.table`
14
+ Then the output should contain "users"
15
+ And the output should contain "username"
16
+
17
+
@@ -0,0 +1,7 @@
1
+ Then /^I should have a table definition for "([^"]*)"$/ do |table_name|
2
+ TableDefinition.definition(table_name).should_not be_nil
3
+ end
4
+
5
+ Then /^the "([^"]*)" table definition should include a "([^"]*)" column$/ do |table_name, column|
6
+ TableDefinition[table_name].column_names.should include(column_name)
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'aruba/cucumber'
2
+ require 'definite'
@@ -0,0 +1,12 @@
1
+ require 'thor'
2
+ require 'definite'
3
+ module Definite
4
+ class CLI < Thor
5
+
6
+ desc "read FILE or DIRECTORY", "Reads one or more definition files, to check syntax"
7
+ def read file_or_directories
8
+ Definite::Reader.read file_or_directories
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,32 @@
1
+ class TableDefinition
2
+
3
+ def self.definition(table_name)
4
+ tables[table_name]
5
+ end
6
+
7
+ def self.tables
8
+ @@tables ||= {}
9
+ end
10
+
11
+ def self.define(table_name, options={}, &block)
12
+ puts "Found definition for table #{table_name}"
13
+
14
+ @table = TableDefinition.new(table_name.to_s)
15
+ @table.instance_eval(&block)
16
+
17
+ tables[table_name.to_s] = @table
18
+ end
19
+
20
+ def all
21
+ tables.values
22
+ end
23
+
24
+ def column column_name, datatype, options={}
25
+ puts "column #{column_name}"
26
+ end
27
+
28
+ def columns column_names
29
+ puts "columns #{column_names}"
30
+ end
31
+
32
+ end
@@ -0,0 +1,7 @@
1
+ module Definite
2
+ class Reader
3
+ def self.read files_or_directories
4
+ load files_or_directories
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Definite
2
+ VERSION = "0.0.1"
3
+ end
data/lib/definite.rb ADDED
@@ -0,0 +1,15 @@
1
+ require "definite/version"
2
+ require "definite/reader"
3
+ require "definite/model/table_definition"
4
+
5
+ module Definite
6
+ # Your code goes here...
7
+
8
+ def update
9
+ target_schema = Definite::Reader.read
10
+ current_schema = Definite::Dumper.read
11
+ changes = Definite::Changes.difference :new_schema => new_schema, :current_schema => current_schema
12
+ Definite::Writer.write changes
13
+ end
14
+
15
+ end
data/notes.txt ADDED
@@ -0,0 +1 @@
1
+ Schema dump uses ActiveRecord::SchemaDumper
@@ -0,0 +1,7 @@
1
+ require 'definite'
2
+
3
+ describe Definite do
4
+ it "should do something" do
5
+ Definite
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'definite'
2
+
3
+ describe TableDefinition do
4
+
5
+ context "the model class" do
6
+ subject { TableDefinition }
7
+
8
+ it { should respond_to(:define) }
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ TableDefinition.define :users do
2
+
3
+ column :username, :string, :default => nil
4
+ column :password, :string
5
+
6
+ columns :timestamps
7
+
8
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: definite
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Graham S Savage
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-10-24 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: cucumber
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: aruba
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
59
+ - !ruby/object:Gem::Dependency
60
+ name: activerecord
61
+ prerelease: false
62
+ requirement: &id004 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ type: :runtime
71
+ version_requirements: *id004
72
+ - !ruby/object:Gem::Dependency
73
+ name: thor
74
+ prerelease: false
75
+ requirement: &id005 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ type: :runtime
84
+ version_requirements: *id005
85
+ description: Create the definitive description of your DB and let Definitive modify your schema safely for you
86
+ email:
87
+ - grahamsavage@gmail.com
88
+ executables:
89
+ - definite
90
+ extensions: []
91
+
92
+ extra_rdoc_files: []
93
+
94
+ files:
95
+ - .gitignore
96
+ - .rvmrc
97
+ - Gemfile
98
+ - README.md
99
+ - Rakefile
100
+ - bin/definite
101
+ - definite.gemspec
102
+ - features/read_definitions.feature
103
+ - features/step_definitions/table_steps.rb
104
+ - features/support/setup.rb
105
+ - lib/definite.rb
106
+ - lib/definite/cli.rb
107
+ - lib/definite/model/table_definition.rb
108
+ - lib/definite/reader.rb
109
+ - lib/definite/version.rb
110
+ - notes.txt
111
+ - spec/definite_spec.rb
112
+ - spec/table_definition_spec.rb
113
+ - spec/test_data/tables/users.table
114
+ has_rdoc: true
115
+ homepage: https://github.com/gsavage/definitive
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ requirements: []
140
+
141
+ rubyforge_project: definite
142
+ rubygems_version: 1.3.7
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Database manipulation without migrations
146
+ test_files:
147
+ - features/read_definitions.feature
148
+ - features/step_definitions/table_steps.rb
149
+ - features/support/setup.rb
150
+ - spec/definite_spec.rb
151
+ - spec/table_definition_spec.rb
152
+ - spec/test_data/tables/users.table