langrove-plugin-mongodb 0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []