caster 0.9.2 → 0.9.3
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.
- 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
|