caster 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/cast +3 -3
- data/lib/caster.rb +12 -2
- data/lib/caster/accessor.rb +37 -4
- data/lib/caster/execution.rb +1 -0
- data/lib/caster/metadata/metadata_database.rb +22 -0
- data/lib/caster/metadata/metadata_document.rb +32 -0
- data/lib/caster/migration.rb +2 -2
- data/lib/caster/migrator.rb +43 -43
- metadata +6 -4
data/bin/cast
CHANGED
@@ -12,17 +12,17 @@ class Cast < Thor
|
|
12
12
|
def version
|
13
13
|
db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{options[:db]}"
|
14
14
|
begin
|
15
|
-
puts db.get("#{Caster.config[:
|
15
|
+
puts db.get("#{Caster.config[:metadata][:id_prefix]}_#{Caster.config[:metadata][:database] || database}")['version']
|
16
16
|
rescue
|
17
17
|
puts "No version information available."
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
desc 'up', 'executes migrations defined in cast files in the current directory'
|
22
|
-
method_option :db, :aliases => '-d'
|
22
|
+
method_option :db, :aliases => '-d'
|
23
23
|
method_option :version, :aliases => '-v'
|
24
24
|
def up path = '.'
|
25
|
-
Migrator.new.
|
25
|
+
Migrator.new(@metadata).migrate_in_dir path, options[:db], options[:version]
|
26
26
|
puts 'Done.'
|
27
27
|
end
|
28
28
|
end
|
data/lib/caster.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'logger'
|
2
3
|
require 'caster/migration'
|
3
4
|
|
4
5
|
include Caster
|
@@ -8,12 +9,17 @@ module Caster
|
|
8
9
|
@config = {
|
9
10
|
:host => '127.0.0.1',
|
10
11
|
:port => '5984',
|
11
|
-
:
|
12
|
-
|
12
|
+
:metadata => {
|
13
|
+
:database => nil,
|
14
|
+
:id_prefix => 'caster',
|
15
|
+
:type => 'caster_metadoc'
|
16
|
+
}
|
13
17
|
}
|
14
18
|
|
15
19
|
@valid_config_keys = @config.keys
|
16
20
|
|
21
|
+
@logger = Logger.new STDOUT
|
22
|
+
|
17
23
|
def self.configure opts = {}
|
18
24
|
opts.each do |k, v|
|
19
25
|
@config[k.to_sym] = v if @valid_config_keys.include? k.to_sym
|
@@ -38,4 +44,8 @@ module Caster
|
|
38
44
|
def self.config
|
39
45
|
@config
|
40
46
|
end
|
47
|
+
|
48
|
+
def self.log
|
49
|
+
@logger
|
50
|
+
end
|
41
51
|
end
|
data/lib/caster/accessor.rb
CHANGED
@@ -2,6 +2,8 @@ module Caster
|
|
2
2
|
|
3
3
|
# provides means to easily access nested values from hash
|
4
4
|
# doc['a']['b']['c'] can be accessed as 'a.b.c'
|
5
|
+
# doc['a.b'] can be accessed as 'a\.b'
|
6
|
+
# doc['a\b'] can be accessed as 'a\\\\b'
|
5
7
|
class Accessor
|
6
8
|
|
7
9
|
def get doc, accessor
|
@@ -12,7 +14,7 @@ module Caster
|
|
12
14
|
|
13
15
|
def set doc, accessor, value
|
14
16
|
sub_doc = doc
|
15
|
-
|
17
|
+
split(accessor).each do |sub_field|
|
16
18
|
sub_doc[sub_field] = {} if sub_doc[sub_field] == nil
|
17
19
|
sub_doc = sub_doc[sub_field]
|
18
20
|
end
|
@@ -20,14 +22,45 @@ module Caster
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def delete doc, accessor
|
23
|
-
sub_fields =
|
25
|
+
sub_fields = split(accessor)
|
24
26
|
field_to_delete = sub_fields.pop
|
25
27
|
eval("#{access('doc', sub_fields.join('.'))}.delete('#{field_to_delete}')")
|
26
28
|
end
|
27
29
|
|
28
|
-
private
|
29
30
|
def access doc_var, accessor
|
30
|
-
doc_var <<
|
31
|
+
doc_var << split(accessor).map { |field| "['#{field}']" }.join
|
32
|
+
end
|
33
|
+
|
34
|
+
def split accessor
|
35
|
+
escape = false
|
36
|
+
words = []
|
37
|
+
w = 0
|
38
|
+
(0..accessor.length - 1).each do |i|
|
39
|
+
|
40
|
+
c = accessor[i].chr
|
41
|
+
n = accessor[i+1].chr rescue ''
|
42
|
+
|
43
|
+
if escape
|
44
|
+
escape = false
|
45
|
+
next
|
46
|
+
end
|
47
|
+
|
48
|
+
words[w] = '' if words[w] == nil
|
49
|
+
|
50
|
+
if c == '\\'
|
51
|
+
words[w] << n
|
52
|
+
escape = true
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
if c == '.'
|
57
|
+
w = w + 1
|
58
|
+
next
|
59
|
+
end
|
60
|
+
|
61
|
+
words[w] << c
|
62
|
+
end
|
63
|
+
words
|
31
64
|
end
|
32
65
|
end
|
33
66
|
end
|
data/lib/caster/execution.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'couchrest'
|
2
|
+
module Caster
|
3
|
+
|
4
|
+
class MetadataDatabase
|
5
|
+
|
6
|
+
def get_db_version database
|
7
|
+
db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{Caster.config[:metadata][:database]}"
|
8
|
+
begin
|
9
|
+
return db.get(database)[:version]
|
10
|
+
rescue
|
11
|
+
# ignored
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def save_db_version database, version
|
16
|
+
db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{Caster.config[:metadata][:database]}"
|
17
|
+
metadoc = db.get(database)
|
18
|
+
metadoc['version'] = version
|
19
|
+
db.save_doc metadoc
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'couchrest'
|
2
|
+
|
3
|
+
module Caster
|
4
|
+
|
5
|
+
class MetadataDocument
|
6
|
+
|
7
|
+
def get_db_version database
|
8
|
+
db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{(Caster.config[:metadata][:database] || database)}"
|
9
|
+
begin
|
10
|
+
return db.get("#{Caster.config[:metadata][:id_prefix]}_#{database}")['version']
|
11
|
+
rescue
|
12
|
+
# ignored
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def save_db_version database, version
|
17
|
+
db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{(Caster.config[:metadata][:database] || database)}"
|
18
|
+
metadoc = nil
|
19
|
+
begin
|
20
|
+
metadoc = db.get "#{Caster.config[:metadata][:id_prefix]}_#{database}"
|
21
|
+
rescue
|
22
|
+
metadoc = {
|
23
|
+
'_id' => "#{Caster.config[:metadata][:id_prefix]}_#{database}",
|
24
|
+
'type' => "#{Caster.config[:metadata][:type]}"
|
25
|
+
}
|
26
|
+
end
|
27
|
+
metadoc['version'] = version
|
28
|
+
db.save_doc metadoc
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/caster/migration.rb
CHANGED
@@ -15,12 +15,12 @@ module Caster
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def over scope, query = {}, &block
|
18
|
-
database_name, view =
|
18
|
+
database_name, view = split_view_accessor(scope)
|
19
19
|
db = CouchRest.database "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{database_name}" if @db == nil
|
20
20
|
Execution.new(db || @db, view, query, &block).execute
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def split_view_accessor scope
|
24
24
|
if scope.count('/') == 1
|
25
25
|
return nil, scope
|
26
26
|
elsif scope.count('/') == 2
|
data/lib/caster/migrator.rb
CHANGED
@@ -1,72 +1,72 @@
|
|
1
1
|
require 'caster/migration'
|
2
|
+
require 'caster/metadata/metadata_document'
|
2
3
|
require 'couchrest'
|
3
4
|
|
4
5
|
module Caster
|
5
6
|
|
6
7
|
class Migrator
|
7
8
|
|
8
|
-
def
|
9
|
-
|
9
|
+
def initialize metadata
|
10
|
+
@dbs = {}
|
11
|
+
@metadata = metadata
|
12
|
+
end
|
13
|
+
|
14
|
+
def migrate_in_dir path, migrate_database = nil, max_version = nil
|
10
15
|
|
11
|
-
|
12
|
-
begin
|
13
|
-
current_version = db.get("#{Caster.config[:metadoc_id_prefix]}_#{database}")['version']
|
14
|
-
rescue
|
15
|
-
# ignored
|
16
|
-
end
|
16
|
+
all_migrations = {}
|
17
17
|
|
18
18
|
path = path.sub /(\/)+$/, ''
|
19
|
+
Dir["#{path}/*.cast"].map do |file|
|
20
|
+
migration_version, database = File.basename(file, '.cast').split '.'
|
21
|
+
|
22
|
+
@dbs[database] = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{database}" if @dbs[database] == nil
|
19
23
|
|
20
|
-
|
21
|
-
|
22
|
-
|
24
|
+
all_migrations[database] = [] if all_migrations[database] == nil
|
25
|
+
|
26
|
+
all_migrations[database] << {
|
27
|
+
:current_version => @metadata.get_db_version(database),
|
28
|
+
:version => migration_version,
|
29
|
+
:filepath => file
|
30
|
+
}
|
23
31
|
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
all_migrations.each_pair do |database, migrations|
|
34
|
+
|
35
|
+
db_filtered = (migrate_database == nil)? migrations.map : migrations.map do |migration|
|
36
|
+
migration if migrate_database == database
|
37
|
+
end.compact
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
39
|
+
min_version_filtered = db_filtered.map do |migration|
|
40
|
+
migration if migration[:current_version] == nil or migration[:version] > migration[:current_version]
|
41
|
+
end.compact
|
32
42
|
|
33
|
-
|
34
|
-
|
35
|
-
|
43
|
+
max_version_filtered = min_version_filtered.map do |migration|
|
44
|
+
migration if max_version == nil or migration[:version] <= max_version
|
45
|
+
end.compact
|
36
46
|
|
37
|
-
|
38
|
-
|
39
|
-
|
47
|
+
filtered_and_sorted_files = max_version_filtered.map do |migration|
|
48
|
+
migration[:filepath]
|
49
|
+
end.sort
|
40
50
|
|
41
|
-
|
42
|
-
|
51
|
+
filtered_and_sorted_files.each do |file|
|
52
|
+
migrate_file file
|
53
|
+
end
|
43
54
|
end
|
55
|
+
|
44
56
|
end
|
45
57
|
|
46
|
-
def migrate_file path
|
58
|
+
def migrate_file path
|
47
59
|
filename = File.basename path, '.cast'
|
48
60
|
version, database = filename.split '.'
|
61
|
+
current_version = @metadata.get_db_version database
|
49
62
|
|
50
|
-
|
51
|
-
metadoc = nil
|
52
|
-
begin
|
53
|
-
metadoc = db.get "#{Caster.config[:metadoc_id_prefix]}_#{database}"
|
54
|
-
rescue
|
55
|
-
metadoc = {
|
56
|
-
'_id' => "#{Caster.config[:metadoc_id_prefix]}_#{database}",
|
57
|
-
'type' => "#{Caster.config[:metadoc_type]}"
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
if metadoc['version'] != nil and version <= metadoc['version']
|
63
|
+
if current_version != nil and version <= current_version
|
62
64
|
raise 'Cannot migrate down!'
|
63
65
|
else
|
64
|
-
|
66
|
+
migrate_script database, File.open(path).read
|
67
|
+
@metadata.save_db_version database, version
|
65
68
|
end
|
66
69
|
|
67
|
-
migrate_script database, File.open(path).read
|
68
|
-
|
69
|
-
db.save_doc metadoc
|
70
70
|
end
|
71
71
|
end
|
72
|
-
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 61
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 3
|
10
|
+
version: 0.9.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Manohar Akula
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-01-10 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: couchrest
|
@@ -57,6 +57,8 @@ files:
|
|
57
57
|
- lib/caster.rb
|
58
58
|
- lib/caster/accessor.rb
|
59
59
|
- lib/caster/execution.rb
|
60
|
+
- lib/caster/metadata/metadata_database.rb
|
61
|
+
- lib/caster/metadata/metadata_document.rb
|
60
62
|
- lib/caster/migration.rb
|
61
63
|
- lib/caster/migrator.rb
|
62
64
|
- lib/caster/operation.rb
|