doeskeyvalue 0.1.3 → 0.2.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/doeskeyvalue.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{doeskeyvalue}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Awexome Labs"]
12
- s.date = %q{2011-06-09}
12
+ s.date = %q{2011-06-29}
13
13
  s.description = %q{Bring the fun of NoSQL into your SQL-backed Active Record objects in a compartmentalized way. Turns any text field on your objects into a schema-less key value store.}
14
14
  s.email = %q{gems@awexomelabs.com}
15
15
  s.extra_rdoc_files = [
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  "doeskeyvalue.gemspec",
28
28
  "lib/doeskeyvalue.rb",
29
29
  "lib/doeskeyvalue/indexes.rb",
30
+ "lib/doeskeyvalue/key_manager.rb",
30
31
  "lib/doeskeyvalue/keys.rb",
31
32
  "lib/doeskeyvalue/util.rb",
32
33
  "lib/generators/doeskeyvalue/doeskeyvalue_generator.rb",
data/lib/doeskeyvalue.rb CHANGED
@@ -6,6 +6,7 @@ require 'rails'
6
6
  require 'active_record'
7
7
  require 'hashie'
8
8
 
9
+ require 'doeskeyvalue/key_manager'
9
10
  require 'doeskeyvalue/keys'
10
11
  require 'doeskeyvalue/indexes'
11
12
  require 'doeskeyvalue/util'
@@ -53,9 +54,11 @@ module ActiveRecord
53
54
  extend DoesKeyValue::Indexes
54
55
 
55
56
  # Identify the AR text column holding our data and serialize it:
56
- @@key_value_column = column.to_sym
57
- cattr_accessor :key_value_column
58
- serialize @@key_value_column, Hashie::Mash
57
+ @column_name = column.to_sym
58
+ serialize @column_name, Hashie::Mash
59
+
60
+ # Add the column to the key and column manager so we can reference it later:
61
+ DoesKeyValue::KeyManager.instance.declare_column(self, @column_name)
59
62
  end
60
63
 
61
64
  Array.class_eval do
@@ -63,14 +66,31 @@ module ActiveRecord
63
66
  end
64
67
 
65
68
  instance_eval <<-EOS
66
- def #{@@key_value_column}_key(key_name, opts={})
69
+ def #{@column_name}_key(key_name, opts={})
70
+ printf("DOESKEYVALUE: %s.%s key declared on class %s\n", @column_name, key_name, self.to_s)
71
+ column_name = :#{@column_name}
67
72
  key_name = key_name.to_sym
68
- declare_key(@@key_value_column, key_name, opts)
73
+ declare_key(column_name, key_name, opts)
69
74
  end
70
75
 
71
- def #{@@key_value_column}_index(key_name, opts={})
76
+ def #{@column_name}_index(key_name, opts={})
77
+ column_name = :#{@column_name}
72
78
  key_name = key_name.to_sym
73
- declare_index(@@key_value_column, key_name, opts)
79
+ declare_index(column_name, key_name, opts)
80
+ end
81
+
82
+ def key_value_columns
83
+ return DoesKeyValue::KeyManager.instance.columns_for(self)
84
+ end
85
+
86
+ def #{@column_name}_keys
87
+ column_name = :#{@column_name}
88
+ return DoesKeyValue::KeyManager.instance.keys_for(self, column_name)
89
+ end
90
+
91
+ def #{@column_name}_indexes
92
+ column_name = :#{@column_name}
93
+ return DoesKeyValue::KeyManager.instance.indexes_for(self, column_name)
74
94
  end
75
95
  EOS
76
96
  end
@@ -93,8 +93,12 @@ module DoesKeyValue
93
93
  end
94
94
  after_destroy "update_index_#{key_value_column}_#{key_name}_after_destroy"
95
95
 
96
+
97
+ # Add the index to the key and column manager:
98
+ DoesKeyValue::KeyManager.instance.declare_index(self, key_value_column, key_name, opts)
99
+
96
100
  end
97
101
 
98
102
 
99
- end # Index
103
+ end # Indexes
100
104
  end # DoesKeyValue
@@ -0,0 +1,119 @@
1
+ # AWEXOME LABS
2
+ # DoesKeyValue
3
+ #
4
+ # KeyManager -- Holds and maintains key_value configuration for all
5
+ # classes and blob-containers implementing DoesKeyValue
6
+
7
+ module DoesKeyValue
8
+ class KeyManager
9
+
10
+ # There can be only one:
11
+ include Singleton
12
+
13
+
14
+ # Return the Hash of known columns, organized by declaring class
15
+ def columns
16
+ @columns ||= Hashie::Mash.new
17
+ end
18
+
19
+ # Declare a key_value columns' existing in a given class
20
+ def declare_column(klass, column_name)
21
+ @columns ||= Hashie::Mash.new
22
+ if @columns[klass].nil?
23
+ @columns[klass] = [column_name]
24
+ else
25
+ @columns[klass] << column_name
26
+ end
27
+ @columns[klass]
28
+ end
29
+
30
+ # Return the key columns present on a specific class
31
+ def columns_for(klass)
32
+ columns_this_klass = columns[klass]
33
+ columns_lineage = [ columns_this_klass ]
34
+ if ancestor = klass.ancestors[1]
35
+ unless ancestor == ActiveRecord::Base
36
+ columns_lineage << columns_for(ancestor)
37
+ end
38
+ end
39
+ columns_lineage.reject{|i| i.nil? }.flatten
40
+ end
41
+
42
+
43
+ # Return the Hash of known keys, organized by the declaring class
44
+ def keys
45
+ @keys ||= Hashie::Mash.new
46
+ end
47
+
48
+ # Declare a key in a specific column set for a specific class
49
+ def declare_key(klass, column_name, key, opts={})
50
+ # TODO: Store the key options in the manager
51
+ printf "KEY_MANAGER: KeyValueKey %s.%s declared on class %s\n", column_name, key, klass
52
+ column_name = column_name.to_sym
53
+ @keys ||= Hashie::Mash.new
54
+ if klass_keys = @keys[klass]
55
+ if column_keys = klass_keys[column_name]
56
+ column_keys << key
57
+ else
58
+ column_keys = [key]
59
+ end
60
+ else
61
+ @keys[klass] = {column_name => [key]}
62
+ end
63
+ @keys[klass][column_name]
64
+ end
65
+
66
+ # Return the keys present for the given column on a specific class
67
+ def keys_for(klass, column_name)
68
+ keys_this_klass = keys[klass][column_name] rescue []
69
+ keys_lineage = [ keys_this_klass ]
70
+ if ancestor = klass.ancestors[1]
71
+ unless ancestor == ActiveRecord::Base
72
+ keys_lineage << keys_for(ancestor, column_name)
73
+ end
74
+ end
75
+ keys_lineage.flatten
76
+ end
77
+
78
+
79
+
80
+ # Return the Hash of known Indexes, organized by the declaring class
81
+ def indexes
82
+ @indexes ||= Hashie::Mash.new
83
+ end
84
+
85
+ # Declare an index in a specific column set for a specific class
86
+ def declare_index(klass, column_name, key, opts={})
87
+ # TODO: Store the index options in the manager
88
+
89
+ printf "KEY_MANAGER: KeyValueIndex %s.%s declared on class %s\n", column_name, key, klass
90
+ column_name = column_name.to_sym
91
+ @indexes ||= Hashie::Mash.new
92
+ if klass_indexes = @indexes[klass]
93
+ if column_indexes = klass_indexes[column_name]
94
+ column_indexes << key
95
+ else
96
+ column_indexes = [key]
97
+ end
98
+ else
99
+ @indexes[klass] = {@column_name => [key]}
100
+ end
101
+ @indexes[klass][column_name]
102
+ end
103
+
104
+ # Return the indexes present for the given column on a specific class
105
+ def indexes_for(klass, column_name)
106
+ indexes_this_klass = indexes[klass][column_name] rescue []
107
+ indexes_lineage = [ indexes_this_klass ]
108
+ if ancestor = klass.ancestors[1]
109
+ unless ancestor == ActiveRecord::Base
110
+ indexes_lineage << indexes_for(ancestor, column_name)
111
+ end
112
+ end
113
+ indexes_lineage.flatten
114
+ end
115
+
116
+
117
+
118
+ end # KeyManager
119
+ end # DoesKeyValue
@@ -7,6 +7,8 @@ module DoesKeyValue
7
7
  module Keys
8
8
 
9
9
  def declare_key(key_value_column, key_name, opts={})
10
+ # printf("DECLARE_KEY: %s.%s key declaration beginning\n", key_value_column, key_name)
11
+
10
12
  raise DoesKeyValue::NoColumnNameSpecified unless key_value_column
11
13
  raise DoesKeyValue::NoKeyNameSpecified unless key_name
12
14
  raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
@@ -32,6 +34,9 @@ module DoesKeyValue
32
34
  if opts[:index] == true
33
35
  declare_index(key_value_column, key_name) # TODO: Provide mechanism for passing index options
34
36
  end
37
+
38
+ # Add the key to the key and column manager:
39
+ DoesKeyValue::KeyManager.instance.declare_key(self, key_value_column, key_name, opts)
35
40
 
36
41
  end
37
42
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: doeskeyvalue
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.3
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Awexome Labs
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-06-09 00:00:00 -04:00
13
+ date: 2011-06-29 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -66,6 +66,7 @@ files:
66
66
  - doeskeyvalue.gemspec
67
67
  - lib/doeskeyvalue.rb
68
68
  - lib/doeskeyvalue/indexes.rb
69
+ - lib/doeskeyvalue/key_manager.rb
69
70
  - lib/doeskeyvalue/keys.rb
70
71
  - lib/doeskeyvalue/util.rb
71
72
  - lib/generators/doeskeyvalue/doeskeyvalue_generator.rb
@@ -84,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
85
  requirements:
85
86
  - - ">="
86
87
  - !ruby/object:Gem::Version
87
- hash: 2538889220135644083
88
+ hash: 4446485574923543024
88
89
  segments:
89
90
  - 0
90
91
  version: "0"