volt-mongo 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0288ac598fb2d952f519ad219fc91c084dc4c5c9
4
+ data.tar.gz: 79ed1942819553e40fbebebfac6d600878e62d24
5
+ SHA512:
6
+ metadata.gz: 8f0a152b61ec012b0215684c784b3ca0e469f23a6859b3d3d569214cafbb725b054dc0f3d7f42d6300ff0a1d88e0c4868843cfde6cc636505be2cdea081e1ea7
7
+ data.tar.gz: 140e76564deef0b8210ddd44359050c003628ba30e620ac1b2483fd5d84e7b7328f19e8ec6503b67af2ce06599f174fd26af97067a9cea0d42f8e6826b7ba3fb
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in volt-mongo.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # volt-mongo
2
+
3
+ This gem provides mongodb support for volt. Just include it in your gemfile and the gem will do the rest. It is included in new projects by default (currently).
4
+
5
+ ```
6
+ gem 'volt-mongo'
7
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1 @@
1
+ # Component dependencies
@@ -0,0 +1,14 @@
1
+ # Place any code you want to run when the component is included on the client
2
+ # or server.
3
+
4
+ # To include code only on the client use:
5
+ # if RUBY_PLATFORM == 'opal'
6
+ #
7
+ # To include code only on the server, use:
8
+ # unless RUBY_PLATFORM == 'opal'
9
+ # ^^ this will not send compile in code in the conditional to the client.
10
+ # ^^ this include code required in the conditional.
11
+ require 'mongo/lib/mongo_adaptor_client'
12
+ if RUBY_PLATFORM != 'opal'
13
+ require 'mongo/lib/mongo_adaptor_server'
14
+ end
@@ -0,0 +1 @@
1
+ # Component routes
@@ -0,0 +1,5 @@
1
+ require 'mongo/config/initializers/boot'
2
+ module Mongo
3
+ class MainController < Volt::ModelController
4
+ end
5
+ end
@@ -0,0 +1,74 @@
1
+ module Volt
2
+ class DataStore
3
+ class MongoAdaptorClient < BaseAdaptorClient
4
+ data_store_methods :find, :where, :skip, :order, :limit
5
+
6
+ module MongoArrayStore
7
+ # Find takes a query object
8
+ def where(query = {})
9
+ add_query_part(:find, query)
10
+ end
11
+ alias_method :find, :where
12
+
13
+ # .sort is already a ruby method, so we use order instead
14
+ def order(sort)
15
+ add_query_part(:sort, sort)
16
+ end
17
+ end
18
+
19
+ # Due to the way define_method works, we need to remove the generated
20
+ # methods from data_store_methods before we over-ride them.
21
+ Volt::Persistors::ArrayStore.send(:remove_method, :where)
22
+ Volt::Persistors::ArrayStore.send(:remove_method, :order)
23
+
24
+ # include mongo's methods on ArrayStore
25
+ Volt::Persistors::ArrayStore.include(MongoArrayStore)
26
+
27
+ def self.normalize_query(query)
28
+ query = merge_finds_and_move_to_front(query)
29
+
30
+ query = reject_skip_zero(query)
31
+
32
+ query
33
+ end
34
+
35
+ def self.merge_finds_and_move_to_front(query)
36
+ # Map first parts to string
37
+ query = query.map { |v| v[0] = v[0].to_s; v }
38
+ has_find = query.find { |v| v[0] == 'find' }
39
+
40
+ if has_find
41
+ # merge any finds
42
+ merged_find_query = {}
43
+ query = query.reject do |query_part|
44
+ if query_part[0] == 'find'
45
+ # on a find, merge into finds
46
+ find_query = query_part[1]
47
+ merged_find_query.merge!(find_query) if find_query
48
+
49
+ # reject
50
+ true
51
+ else
52
+ false
53
+ end
54
+ end
55
+
56
+ # Add finds to the front
57
+ query.insert(0, ['find', merged_find_query])
58
+ else
59
+ # No find was done, add it in the first position
60
+ query.insert(0, ['find'])
61
+ end
62
+
63
+ query
64
+ end
65
+
66
+ def self.reject_skip_zero(query)
67
+ query.reject do |query_part|
68
+ query_part[0] == 'skip' && query_part[1] == 0
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,68 @@
1
+ require 'mongo'
2
+
3
+ module Volt
4
+ class DataStore
5
+ class MongoAdaptorServer < BaseAdaptorServer
6
+ attr_reader :db, :mongo_db
7
+
8
+ def initialize
9
+ if Volt.config.db_uri.present?
10
+ @mongo_db ||= ::Mongo::MongoClient.from_uri(Volt.config.db_uri)
11
+ @db ||= @mongo_db.db(Volt.config.db_uri.split('/').last || Volt.config.db_name)
12
+ else
13
+ @mongo_db ||= ::Mongo::MongoClient.new(Volt.config.db_host, Volt.config.db_port)
14
+ @db ||= @mongo_db.db(Volt.config.db_name)
15
+ end
16
+ end
17
+
18
+ def insert(collection, values)
19
+ @db[collection].insert(values)
20
+ end
21
+
22
+ def update(collection, values)
23
+ # TODO: Seems mongo is dumb and doesn't let you upsert with custom id's
24
+ begin
25
+ @db[collection].insert(values)
26
+ rescue ::Mongo::OperationFailure => error
27
+ # Really mongo client?
28
+ if error.message[/^11000[:]/]
29
+ # Update because the id already exists
30
+ update_values = values.dup
31
+ id = update_values.delete(:_id)
32
+ @db[collection].update({ _id: id }, update_values)
33
+ else
34
+ return { error: error.message }
35
+ end
36
+ end
37
+
38
+ nil
39
+ end
40
+
41
+ def query(collection, query)
42
+ allowed_methods = %w(find skip limit)
43
+
44
+ cursor = @db[collection]
45
+
46
+ query.each do |query_part|
47
+ method_name, *args = query_part
48
+
49
+ unless allowed_methods.include?(method_name.to_s)
50
+ fail "`#{method_name}` is not part of a valid query"
51
+ end
52
+
53
+ cursor = cursor.send(method_name, *args)
54
+ end
55
+
56
+ cursor.to_a
57
+ end
58
+
59
+ def delete(collection, query)
60
+ @db[collection].remove(query)
61
+ end
62
+
63
+ def drop_database
64
+ db.connection.drop_database(Volt.config.db_name)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,2 @@
1
+ <:Body>
2
+ -- component --
data/lib/volt/mongo.rb ADDED
@@ -0,0 +1,26 @@
1
+ # If you need to require in code in the gem's app folder, keep in mind that
2
+ # the app is not on the load path when the gem is required. Use
3
+ # app/{gemname}/config/initializers/boot.rb to require in client or server
4
+ # code.
5
+ #
6
+ # Also, in volt apps, you typically use the lib folder in the
7
+ # app/{componentname} folder instead of this lib folder. This lib folder is
8
+ # for setting up gem code when Bundler.require is called. (or the gem is
9
+ # required.)
10
+ #
11
+ # If you need to configure volt in some way, you can add a Volt.configure block
12
+ # in this file.
13
+
14
+ Volt.configure do |config|
15
+ # Set the datastore to mongo
16
+ config.public.datastore_name = 'mongo'
17
+
18
+ # Include the mongo component on the client
19
+ config.default_components << 'mongo'
20
+ end
21
+
22
+ module Volt
23
+ module Mongo
24
+ # Your code goes here...
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ version = File.read(File.expand_path('../VERSION', __FILE__)).strip
6
+
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "volt-mongo"
10
+ spec.version = version
11
+ spec.authors = ["Ryan Stout"]
12
+ spec.email = ["ryan@agileproductions.com"]
13
+ spec.summary = %q{Mongo database drivers for volt}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency 'mongo', '~> 1.9.0'
23
+
24
+ spec.add_development_dependency "volt", "~> 0.9.2"
25
+ spec.add_development_dependency "rake"
26
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: volt-mongo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Stout
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mongo
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.9.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: volt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ - ryan@agileproductions.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - README.md
65
+ - Rakefile
66
+ - VERSION
67
+ - app/mongo/config/dependencies.rb
68
+ - app/mongo/config/initializers/boot.rb
69
+ - app/mongo/config/routes.rb
70
+ - app/mongo/controllers/main_controller.rb
71
+ - app/mongo/lib/mongo_adaptor_client.rb
72
+ - app/mongo/lib/mongo_adaptor_server.rb
73
+ - app/mongo/views/main/index.html
74
+ - lib/volt/mongo.rb
75
+ - volt-mongo.gemspec
76
+ homepage: ''
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.2.2
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Mongo database drivers for volt
100
+ test_files: []