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 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[:metadoc_id_prefix]}_#{database}")['version']
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', :required => true
22
+ method_option :db, :aliases => '-d'
23
23
  method_option :version, :aliases => '-v'
24
24
  def up path = '.'
25
- Migrator.new.migrate_dir options[:db], path, options[:version]
25
+ Migrator.new(@metadata).migrate_in_dir path, options[:db], options[:version]
26
26
  puts 'Done.'
27
27
  end
28
28
  end
@@ -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
- :metadoc_type => 'caster_metadoc',
12
- :metadoc_id_prefix => 'caster'
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
@@ -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
- accessor.split('.').each do |sub_field|
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 = accessor.split('.')
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 << accessor.split('.').map { |field| "['#{field}']" }.join
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
@@ -56,6 +56,7 @@ module Caster
56
56
  end
57
57
 
58
58
  def execute
59
+ Caster.log.info "executing query on '#{@db.name}' over '#{@view}' with params #{@query.inspect}"
59
60
  rdocs = @db.view(@view, @query)['rows']
60
61
  db_docs_map = Hash.new { |k, v| k[v] = [] }
61
62
  rdocs.each do |rdoc|
@@ -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
@@ -15,12 +15,12 @@ module Caster
15
15
  end
16
16
 
17
17
  def over scope, query = {}, &block
18
- database_name, view = split(scope)
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 split scope
23
+ def split_view_accessor scope
24
24
  if scope.count('/') == 1
25
25
  return nil, scope
26
26
  elsif scope.count('/') == 2
@@ -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 migrate_dir database, path, max_version = nil
9
- db = CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{database}"
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
- current_version = nil
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
- migrations = Dir["#{path}/*.cast"].map do |file|
21
- version, db_in_filename = File.basename(file, '.cast').split '.'
22
- { :version => version , :database => db_in_filename, :filepath => file }
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
- db_filtered = migrations.map do |migration|
26
- migration if database == migration[:database]
27
- end.compact
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
- min_version_filtered = db_filtered.map do |migration|
30
- migration if current_version == nil or migration[:version] > current_version
31
- end.compact
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
- max_version_filtered = min_version_filtered.map do |migration|
34
- migration if max_version == nil or migration[:version] <= max_version
35
- end.compact
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
- filtered_and_sorted_files = max_version_filtered.map do |migration|
38
- migration[:filepath]
39
- end.sort
47
+ filtered_and_sorted_files = max_version_filtered.map do |migration|
48
+ migration[:filepath]
49
+ end.sort
40
50
 
41
- filtered_and_sorted_files.each do |file|
42
- migrate_file file, db
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, db_handle = nil
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
- db = db_handle || (CouchRest.database! "http://#{Caster.config[:host]}:#{Caster.config[:port]}/#{database}")
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
- metadoc['version'] = version
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: 63
4
+ hash: 61
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 2
10
- version: 0.9.2
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: 2012-09-06 00:00:00 Z
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