caster 0.9.1 → 0.9.2

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.
@@ -0,0 +1,33 @@
1
+ module Caster
2
+
3
+ # provides means to easily access nested values from hash
4
+ # doc['a']['b']['c'] can be accessed as 'a.b.c'
5
+ class Accessor
6
+
7
+ def get doc, accessor
8
+ return doc if accessor == nil
9
+ value = eval(access('doc', accessor))
10
+ (value.is_a? Fixnum)? value : value.clone
11
+ end
12
+
13
+ def set doc, accessor, value
14
+ sub_doc = doc
15
+ accessor.split('.').each do |sub_field|
16
+ sub_doc[sub_field] = {} if sub_doc[sub_field] == nil
17
+ sub_doc = sub_doc[sub_field]
18
+ end
19
+ eval("#{access('doc', accessor)} = value")
20
+ end
21
+
22
+ def delete doc, accessor
23
+ sub_fields = accessor.split('.')
24
+ field_to_delete = sub_fields.pop
25
+ eval("#{access('doc', sub_fields.join('.'))}.delete('#{field_to_delete}')")
26
+ end
27
+
28
+ private
29
+ def access doc_var, accessor
30
+ doc_var << accessor.split('.').map { |field| "['#{field}']" }.join
31
+ end
32
+ end
33
+ end
@@ -6,7 +6,7 @@ require 'caster/transform/rename'
6
6
  require 'caster/transform/create'
7
7
  require 'caster/transform/delete'
8
8
  require 'caster/transform/clone'
9
- require 'caster/ref/reference'
9
+ require 'caster/reference'
10
10
 
11
11
  module Caster
12
12
 
@@ -1,3 +1,5 @@
1
+ require 'caster/accessor'
2
+
1
3
  module Caster
2
4
  class Reference
3
5
 
@@ -8,8 +10,9 @@ module Caster
8
10
 
9
11
  def initialize db_handle, view, query
10
12
  rdocs = db_handle.view(view, query)['rows']
11
- @docs = rdocs.map { |rdoc| rdoc['value'] }
13
+ @docs = rdocs.map { |rdoc| rdoc['doc'] or rdoc['value'] }
12
14
  @post_eval_calls = []
15
+ @accessor = Accessor.new
13
16
  end
14
17
 
15
18
  def where &predicate
@@ -25,7 +28,7 @@ module Caster
25
28
  def evaluate target_doc
26
29
  @docs.each do |doc|
27
30
  if @predicate.call doc
28
- value = deref(doc, @value_field)
31
+ value = @accessor.get doc, @value_field
29
32
  @post_eval_calls.each do |args|
30
33
  value = value.send args[0], *args[1]
31
34
  end
@@ -34,12 +37,5 @@ module Caster
34
37
  end
35
38
  nil
36
39
  end
37
-
38
- private
39
- def deref doc, accessor
40
- return doc if accessor == nil
41
- value = eval 'doc' << accessor.split('.').map { |field| "['#{field}']" }.join
42
- (value.is_a? Fixnum)? value : value.clone
43
- end
44
40
  end
45
41
  end
@@ -1,4 +1,5 @@
1
1
  require 'couchrest'
2
+ require 'caster/accessor'
2
3
 
3
4
  module Caster
4
5
  class Add
@@ -6,10 +7,11 @@ module Caster
6
7
  def initialize field, value
7
8
  @field = field
8
9
  @value = value
10
+ @accessor = Accessor.new
9
11
  end
10
12
 
11
13
  def execute doc
12
- doc[@field] = evaluate(@value, doc)
14
+ @accessor.set doc, @field, evaluate(@value, doc)
13
15
  doc
14
16
  end
15
17
 
@@ -1,12 +1,15 @@
1
+ require 'caster/accessor'
2
+
1
3
  module Caster
2
4
  class Remove
3
5
 
4
6
  def initialize field
5
7
  @field = field
8
+ @accessor = Accessor.new
6
9
  end
7
10
 
8
11
  def execute doc
9
- doc.delete @field
12
+ @accessor.delete doc, @field
10
13
  doc
11
14
  end
12
15
  end
@@ -1,14 +1,18 @@
1
+ require 'caster/accessor'
2
+
1
3
  module Caster
2
4
  class Rename
3
5
 
4
6
  def initialize old_name, new_name
5
7
  @old_name = old_name
6
8
  @new_name = new_name
9
+ @accessor = Accessor.new
7
10
  end
8
11
 
9
12
  def execute doc
10
13
  doc[@new_name] = doc[@old_name]
11
- doc.delete @old_name
14
+ @accessor.set(doc, @new_name, @accessor.get(doc, @old_name))
15
+ @accessor.delete doc, @old_name
12
16
  doc
13
17
  end
14
18
  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: 57
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 1
10
- version: 0.9.1
9
+ - 2
10
+ version: 0.9.2
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-08-16 00:00:00 Z
18
+ date: 2012-09-06 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: couchrest
@@ -55,11 +55,12 @@ extra_rdoc_files: []
55
55
 
56
56
  files:
57
57
  - lib/caster.rb
58
+ - lib/caster/accessor.rb
58
59
  - lib/caster/execution.rb
59
60
  - lib/caster/migration.rb
60
61
  - lib/caster/migrator.rb
61
62
  - lib/caster/operation.rb
62
- - lib/caster/ref/reference.rb
63
+ - lib/caster/reference.rb
63
64
  - lib/caster/transform/add.rb
64
65
  - lib/caster/transform/clone.rb
65
66
  - lib/caster/transform/create.rb