langrove-plugin-mongodb 0.1

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/README.md ADDED
@@ -0,0 +1,61 @@
1
+ `Plugin::MongoDB`
2
+ =================
3
+
4
+ Intergates MongoDB support into LanGrove
5
+
6
+ `gem install langrove-plugin-mongodb`
7
+
8
+ Implements
9
+ ----------
10
+
11
+ * `LanGrove::Plugin::Persistor`
12
+
13
+ Supports
14
+ ---------
15
+
16
+ * `LanGrove::Behaviour::Persistable`
17
+ * `LanGrove::Behaviour::Preloadable`
18
+
19
+ Example
20
+ -------
21
+
22
+ ### Configuring the plugin.
23
+
24
+ <pre>
25
+
26
+ ...
27
+
28
+ :plugins:
29
+ :a_mongodb_collection:
30
+ :class: MongoDB
31
+ :database: database_name
32
+ :table: collection_name
33
+ :key:
34
+ _id: unique_field_name
35
+ #
36
+ # assuming @capsule['unique_field_name'] exists
37
+ #
38
+
39
+ ...
40
+
41
+ </pre>
42
+
43
+ <pre>
44
+
45
+ ...
46
+
47
+ :server:
48
+ :behavior:
49
+ :persistable:
50
+ :plugin: :a_mongodb_collection
51
+ :at:
52
+ :handler_after_receive:
53
+ #
54
+ # will default to storing the caspsule
55
+ # after the Handler.receive( data )
56
+ # method returns.
57
+ #
58
+
59
+ ...
60
+
61
+ </pre>
@@ -0,0 +1,2 @@
1
+ require 'langrove' unless defined?( LanGrove )
2
+ require 'plugin/mongo_db'
@@ -0,0 +1,125 @@
1
+ require 'mongo'
2
+
3
+ module Plugin
4
+
5
+ class MongoDB < LanGrove::Plugin::Persistor
6
+
7
+ def validate_config
8
+
9
+ super
10
+
11
+ connect
12
+
13
+ #
14
+ # Polulate this from :db:username: and :db:password
15
+ #
16
+ # auth = db.authenticate(username, password)
17
+
18
+ end
19
+
20
+ def connect
21
+
22
+ @logger.info "Connecting to mongo #{@database}.#{@table}"
23
+ @connection = Mongo::Connection.new
24
+ @db = @connection.db( @database )
25
+ @collection = @db.collection( @table )
26
+
27
+ end
28
+
29
+
30
+ def all_capsules( &block )
31
+
32
+ #
33
+ # raise Exception on failed (should bring down the daemon)
34
+ #
35
+ @collection.find().to_a.each do |capsule|
36
+
37
+ yield capsule['_id'], capsule
38
+
39
+ end
40
+
41
+ end
42
+
43
+
44
+ def store( handler )
45
+
46
+ gen_key( handler ) if handler.key.nil?
47
+
48
+ begin
49
+
50
+ id = handler.key['key']['_id']
51
+
52
+ @collection.update(
53
+
54
+ {'_id' => id },
55
+ handler.capsule,
56
+ :upsert => true
57
+
58
+ )
59
+
60
+ @logger.debug "Wrote #{handler.class} to mongo:#{@database}.#{@table} at _id: #{id}"
61
+
62
+ rescue Mongo::ConnectionFailure => e
63
+
64
+ @logger.error "ERROR: on fetch() #{e}"
65
+
66
+ connect
67
+
68
+ retry
69
+
70
+ end
71
+
72
+ true
73
+
74
+ end
75
+
76
+
77
+ def fetch( handler )
78
+
79
+ gen_key( handler ) if handler.key.nil?
80
+
81
+ id = handler.key['key']['_id']
82
+
83
+ begin
84
+
85
+ capsule = @collection.find_one('_id' => id )
86
+
87
+ if capsule.nil?
88
+
89
+ unless @allow_learn.nil?
90
+
91
+ handler.capsule = {}
92
+
93
+ @logger.warn( "WARN: Assumed NEW capsule for #{@table}._id: #{id}" )
94
+
95
+ return true
96
+
97
+ else
98
+
99
+ @logger.error "ERROR: Ignored #{@table}._id: #{id}. Enable :allow_learn:"
100
+
101
+ return false
102
+
103
+ end
104
+
105
+ end
106
+
107
+ rescue Mongo::ConnectionFailure => e
108
+
109
+ @logger.error "ERROR: on store() #{e}"
110
+
111
+ connect
112
+
113
+ retry
114
+
115
+ end
116
+
117
+ handler.capsule = capsule
118
+
119
+ return true
120
+
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,94 @@
1
+ require 'langrove'
2
+ require 'plugin/mongo_db'
3
+
4
+ ROOT = LanGrove::FakeRoot.new
5
+
6
+ MONGO_PERSISTOR_CONFIG = {
7
+
8
+ :database => 'test',
9
+
10
+ :table => 'collection',
11
+
12
+ :class => 'MongoDB',
13
+
14
+ :key => {
15
+
16
+ '_id' => 'hostname'
17
+
18
+ }
19
+
20
+ }
21
+
22
+ describe Plugin::MongoDB do
23
+
24
+ before :each do
25
+ @hostname = 'woot@server.awesome'
26
+ class FakeHandler
27
+
28
+ attr_accessor :key, :capsule
29
+ @key = {}
30
+ @capsule = {}
31
+
32
+ end
33
+ end
34
+
35
+ subject {
36
+
37
+ #
38
+ # Persist this handler
39
+ #
40
+
41
+ @handler = LanGrove::Handler::Base.new( nil )
42
+
43
+ @handler.instance_variable_set(
44
+
45
+ :@capsule, {
46
+ 'thing_a' => 'DATA',
47
+ 'thing_b' => 'DATATA',
48
+ 'hostname' => @hostname,
49
+ 'more_data' => {
50
+ 'date' => Time.now
51
+ }
52
+ }
53
+ )
54
+
55
+ LanGrove::ClassLoader.create( {
56
+
57
+ :module => 'Plugin',
58
+ :class => 'MongoDB'
59
+
60
+ } ).new( ROOT, MONGO_PERSISTOR_CONFIG, nil )
61
+
62
+ }
63
+
64
+ it 'can store()' do
65
+
66
+ subject.store( @handler )
67
+
68
+ end
69
+
70
+ it 'can fetch()' do
71
+
72
+ handler = FakeHandler.new
73
+ handler.key = {'key' => {'_id' => @hostname}}
74
+ subject.fetch( handler )
75
+
76
+ handler.capsule['thing_a'].should == 'DATA'
77
+
78
+ end
79
+
80
+ it 'can fetch_all()' do
81
+
82
+ result = nil
83
+
84
+ subject.all_capsules() do |key,capsule|
85
+
86
+ result = capsule
87
+
88
+ end
89
+
90
+ result['hostname'].should == @hostname
91
+
92
+ end
93
+
94
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: langrove-plugin-mongodb
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Richard
9
+ - ''
10
+ - ''
11
+ - ''
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2012-07-08 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: langrove
19
+ requirement: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ! '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: mongo
35
+ requirement: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: bson_ext
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ description: ''
66
+ email: ops@clue.co.za
67
+ executables: []
68
+ extensions: []
69
+ extra_rdoc_files: []
70
+ files:
71
+ - lib/langrove-plugin-mongodb.rb
72
+ - lib/plugin/mongo_db.rb
73
+ - spec/plugin/mongo_db_spec.rb
74
+ - README.md
75
+ homepage: ''
76
+ licenses: []
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 1.8.24
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: Intergates MongoDB support into LanGrove persistance layer
99
+ test_files: []