easymongo 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 +7 -0
- data/.gitignore +2 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +9 -0
- data/LICENSE +21 -0
- data/README.md +41 -0
- data/config/boot.rb +13 -0
- data/easymongo.gemspec +22 -0
- data/lib/easymongo/document.rb +56 -0
- data/lib/easymongo/query.rb +146 -0
- data/lib/easymongo/result.rb +36 -0
- data/lib/easymongo.rb +26 -0
- metadata +110 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e410057d0345f4702f71a094005449ca511dafca
|
4
|
+
data.tar.gz: 8b2dab525f5da96fedc58715b2ecd1ead20ed93f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 18c0bb86735521dbf4baf0b67ae551120989c4ee0848bdf62a93ebefd19ea3420638641d12ef4e24ae60b1d5478693d835aa4409aa34db27e7d49678765a65e5
|
7
|
+
data.tar.gz: f70bb4fedf16b5e3355cd0e18f14c1ff2b3055acdfb46c15212eba09ed10a6bc7075adf166f1d03905559edb5089c7f8af80168898dbc4a8690911e2b45ee962
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Fugroup
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Easymongo
|
2
|
+
Super easy MongoDB Ruby client. This is the way mongo should be.
|
3
|
+
|
4
|
+
If you need something closer to pure Mongo, have a look at [Minimongo.](https://github.com/fugroup/minimongo)
|
5
|
+
|
6
|
+
We also have [Mongocore](https://github.com/fugroup/mongocore) if you're looking for a full ORM.
|
7
|
+
|
8
|
+
### Installation
|
9
|
+
```
|
10
|
+
gem install easymongo
|
11
|
+
```
|
12
|
+
or add to Gemfile.
|
13
|
+
|
14
|
+
### Usage
|
15
|
+
```ruby
|
16
|
+
# All commands supported
|
17
|
+
# https://docs.mongodb.com/ruby-driver/master/quick-start
|
18
|
+
|
19
|
+
# Connect
|
20
|
+
$db = Easymongo::Query.new(['127.0.0.1:27017'], :database => "easymongo_#{ENV['RACK_ENV']}")
|
21
|
+
|
22
|
+
# First
|
23
|
+
$db.collection.get.first
|
24
|
+
|
25
|
+
# Last
|
26
|
+
$db.collection.get.last
|
27
|
+
|
28
|
+
# All
|
29
|
+
$db.collection.get.all
|
30
|
+
|
31
|
+
# Insert / Update
|
32
|
+
$db.collection.set(:name => name)
|
33
|
+
|
34
|
+
# Delete
|
35
|
+
$db.domains.delete(id)
|
36
|
+
|
37
|
+
```
|
38
|
+
|
39
|
+
Created and maintained by [Fugroup Ltd.](https://www.fugroup.net) We are the creators of [CrowdfundHQ.](https://crowdfundhq.com)
|
40
|
+
|
41
|
+
`@authors: Vidar`
|
data/config/boot.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require(:default, :development)
|
3
|
+
|
4
|
+
MODE = ENV['RACK_ENV'] || 'development'
|
5
|
+
|
6
|
+
require './lib/easymongo.rb'
|
7
|
+
|
8
|
+
Mongo::Logger.logger.level = ::Logger::FATAL
|
9
|
+
|
10
|
+
# Connect
|
11
|
+
$db = Easymongo::Query.new(['127.0.0.1:27017'], :database => "easymongo_#{MODE}")
|
12
|
+
|
13
|
+
include Futest::Helpers
|
data/easymongo.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'easymongo'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.date = '2017-07-12'
|
5
|
+
s.summary = "Super Easy MongoDB client"
|
6
|
+
s.description = "The way MongoDB for Ruby should be, can't get easier than this"
|
7
|
+
s.authors = ["Fugroup Limited"]
|
8
|
+
s.email = 'vidar@fugroup.net'
|
9
|
+
|
10
|
+
s.add_runtime_dependency 'mongo', '>= 2.2'
|
11
|
+
s.add_runtime_dependency 'activesupport', '>= 4.0'
|
12
|
+
s.add_runtime_dependency 'request_store', '>= 1.2'
|
13
|
+
s.add_development_dependency 'futest', '>= 0'
|
14
|
+
|
15
|
+
s.homepage = 'https://github.com/fugroup/easymongo'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.require_paths = ['lib']
|
19
|
+
s.files = `git ls-files -z`.split("\x0").reject do |f|
|
20
|
+
f.match(%r{^(test|spec|features)/})
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# The mongodb document
|
2
|
+
|
3
|
+
module Easymongo
|
4
|
+
class Document
|
5
|
+
|
6
|
+
attr_accessor :doc, :values
|
7
|
+
|
8
|
+
# Takes a BSON::Document
|
9
|
+
def initialize(doc)
|
10
|
+
|
11
|
+
# Replace _id with id
|
12
|
+
doc['id'] = doc.delete('_id')
|
13
|
+
|
14
|
+
# Convert all BSON::ObjectId to string
|
15
|
+
doc.each{|k, v| doc[k] = v.to_s if v.is_a?(BSON::ObjectId)}
|
16
|
+
|
17
|
+
# Symbolize keys
|
18
|
+
self.doc = doc.symbolize_keys
|
19
|
+
end
|
20
|
+
|
21
|
+
# Get bson id
|
22
|
+
def bson_id
|
23
|
+
@bson_id ||= BSON::ObjectId.from_string(doc[:id])
|
24
|
+
end
|
25
|
+
|
26
|
+
# Creation date
|
27
|
+
def date
|
28
|
+
bson_id.generation_time
|
29
|
+
end
|
30
|
+
|
31
|
+
# Read value
|
32
|
+
def [](key)
|
33
|
+
doc[key.to_sym]
|
34
|
+
end
|
35
|
+
|
36
|
+
# Write value
|
37
|
+
def []=(key, value)
|
38
|
+
doc[key.to_sym] = value
|
39
|
+
end
|
40
|
+
|
41
|
+
# Make the doc user friendly with dot notation
|
42
|
+
# Provides access to doc object methods too
|
43
|
+
def method_missing(name, *args, &block)
|
44
|
+
|
45
|
+
# Write value
|
46
|
+
return doc[name[0..-2].to_sym] = args.first if args.size == 1 and name[-1] == '='
|
47
|
+
|
48
|
+
# Read value
|
49
|
+
return doc[name] if doc.has_key?(name)
|
50
|
+
|
51
|
+
# Run method on doc object
|
52
|
+
return doc.send(name, *args) if doc.respond_to?(name)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# This is the easiest possible implementation of a mongodb client.
|
2
|
+
# We got rid of the ObjectID and the underscore, and made mongodb super easy to use.
|
3
|
+
# Use BSON::ObjectId.new.generation_time as timestamp if you need that
|
4
|
+
#
|
5
|
+
# If you need something close to pure Mongo, check out https://github.com/fugroup/minimongo
|
6
|
+
# If you need models for Easymongo, check out https://github.com/fugroup/modelize
|
7
|
+
# If you need an ORM, check out https://github.com/fugroup/mongocore
|
8
|
+
|
9
|
+
require 'mongo'
|
10
|
+
require 'active_support'
|
11
|
+
require 'active_support/core_ext'
|
12
|
+
require 'request_store'
|
13
|
+
|
14
|
+
module Easymongo
|
15
|
+
class Query
|
16
|
+
|
17
|
+
attr_accessor :client
|
18
|
+
|
19
|
+
# Set up connection
|
20
|
+
def initialize(uri, options)
|
21
|
+
self.client = Mongo::Client.new(uri, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Set up collection, stored in the thread
|
25
|
+
def method_missing(name, *args, &block)
|
26
|
+
s[:coll] = name; self
|
27
|
+
end
|
28
|
+
|
29
|
+
# Set values
|
30
|
+
def set(*args)
|
31
|
+
|
32
|
+
# Insert, add oid
|
33
|
+
data, values = args.size == 1 ? [{'_id' => oid}, *args] : args
|
34
|
+
|
35
|
+
# Using set and unset so we don't store nil in the db
|
36
|
+
options = {
|
37
|
+
:$set => values.select{|k, v| !v.nil?}, :$unset => values.select{|k, v| v.nil?}
|
38
|
+
}.delete_if{|k, v| v.empty?}
|
39
|
+
|
40
|
+
# Normalize data
|
41
|
+
data = ids(data)
|
42
|
+
|
43
|
+
# Update the collection
|
44
|
+
result = client[coll].update_one(data, options, :upsert => true)
|
45
|
+
|
46
|
+
# Return result
|
47
|
+
Easymongo::Result.new(result, data, values, options)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Get values, store cursor in thread
|
51
|
+
def get(data = {})
|
52
|
+
s[:cursor] = client[coll].find(ids(data)); self
|
53
|
+
end
|
54
|
+
|
55
|
+
# Limit
|
56
|
+
def limit(n)
|
57
|
+
g!; s[:cursor] = cursor.limit(n.to_i); self
|
58
|
+
end
|
59
|
+
|
60
|
+
# Sort
|
61
|
+
def sort(data)
|
62
|
+
g!; s[:cursor] = cursor.sort(data); self
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get first
|
66
|
+
def first
|
67
|
+
g!; cursor.first.tap{|r| return ed(r) if r; c!}
|
68
|
+
end
|
69
|
+
|
70
|
+
# Get last
|
71
|
+
def last
|
72
|
+
g!; cursor.sort(:$natural => -1).first.tap{|r| return ed(r) if r; c!}
|
73
|
+
end
|
74
|
+
|
75
|
+
# Get all
|
76
|
+
def all
|
77
|
+
g!; cursor.to_a.map{|r| ed(r)}.tap{ c!}
|
78
|
+
end
|
79
|
+
|
80
|
+
# Count
|
81
|
+
def count
|
82
|
+
g!; cursor.count.tap{ c!}
|
83
|
+
end
|
84
|
+
|
85
|
+
# Remove
|
86
|
+
def rm(data)
|
87
|
+
|
88
|
+
# Normalize data
|
89
|
+
data = ids(data)
|
90
|
+
|
91
|
+
# Delete doc
|
92
|
+
result = client[coll].delete_one(data)
|
93
|
+
|
94
|
+
# Return result
|
95
|
+
Easymongo::Result.new(result, data).tap{ c!}
|
96
|
+
end
|
97
|
+
|
98
|
+
# Make sure dataever passed works
|
99
|
+
def ids(data)
|
100
|
+
|
101
|
+
# Just return if nothing to do
|
102
|
+
return data if data.empty?
|
103
|
+
|
104
|
+
# Support passing id as string
|
105
|
+
data = {'_id' => data} if data.is_a?(String)
|
106
|
+
|
107
|
+
# Turn all keys to string
|
108
|
+
data = data.stringify_keys
|
109
|
+
|
110
|
+
# Convert id to _id for mongo
|
111
|
+
data['_id'] = data.delete('id') if data['id']
|
112
|
+
|
113
|
+
# Convert ids to BSON ObjectId
|
114
|
+
data.each{|k, v| data[k] = oid(v) if v.is_a?(String) and v =~ /^[0-9a-fA-F]{24}$/}
|
115
|
+
|
116
|
+
# Return data
|
117
|
+
data
|
118
|
+
end
|
119
|
+
|
120
|
+
# Convert to BSON ObjectId or make a new one
|
121
|
+
def oid(v = nil)
|
122
|
+
return BSON::ObjectId.new if v.nil?; BSON::ObjectId.from_string(v) rescue v
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
# Get the request store
|
128
|
+
def s; RequestStore.store; end
|
129
|
+
|
130
|
+
# Clear request store
|
131
|
+
def c!; RequestStore.clear!; end
|
132
|
+
|
133
|
+
# Run get if no cursor
|
134
|
+
def g!; get unless cursor; end
|
135
|
+
|
136
|
+
# Get the collection
|
137
|
+
def coll; s[:coll]; end
|
138
|
+
|
139
|
+
# Get the cursor
|
140
|
+
def cursor; s[:cursor]; end
|
141
|
+
|
142
|
+
# Short cut for creating documents
|
143
|
+
def ed(r); Easymongo::Document.new(r); end
|
144
|
+
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Easymongo
|
2
|
+
class Result
|
3
|
+
|
4
|
+
attr_accessor :result, :data, :values, :options
|
5
|
+
|
6
|
+
# Init takes a Mongo::Operation::Result
|
7
|
+
def initialize(result, data, values = nil, options = nil)
|
8
|
+
self.result = result
|
9
|
+
self.data = data
|
10
|
+
self.values = values
|
11
|
+
self.options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get the id as BSON::ObjectId
|
15
|
+
def bson_id
|
16
|
+
result.upserted_id || data['_id']
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get the id if available
|
20
|
+
def id
|
21
|
+
bson_id ? bson_id.to_s : nil
|
22
|
+
end
|
23
|
+
|
24
|
+
# Creation date
|
25
|
+
def date
|
26
|
+
bson_id ? bson_id.generation_time : nil
|
27
|
+
end
|
28
|
+
|
29
|
+
# For the mongo operation result
|
30
|
+
def method_missing(name, *args, &block)
|
31
|
+
return result.send(name, *args) if result.respond_to?(name)
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/lib/easymongo.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
|
3
|
+
module Easymongo
|
4
|
+
|
5
|
+
# # # # # #
|
6
|
+
# Easymongo MongoDB tiny Ruby library.
|
7
|
+
# @homepage: https://github.com/fugroup/easymongo
|
8
|
+
# @author: Vidar <vidar@fugroup.net>, Fugroup Ltd.
|
9
|
+
# @license: MIT, contributions are welcome.
|
10
|
+
# # # # # #
|
11
|
+
|
12
|
+
class << self; attr_accessor :db; end
|
13
|
+
end
|
14
|
+
|
15
|
+
require_relative 'easymongo/document'
|
16
|
+
require_relative 'easymongo/result'
|
17
|
+
require_relative 'easymongo/query'
|
18
|
+
|
19
|
+
# Indexing
|
20
|
+
# $db.client[:profiles].indexes.create_one({:key => 1}, :unique => true)
|
21
|
+
|
22
|
+
# Info on MongoDB Driver
|
23
|
+
# https://docs.mongodb.com/ruby-driver/master/quick-start/
|
24
|
+
# http://zetcode.com/db/mongodbruby/
|
25
|
+
# http://recipes.sinatrarb.com/p/databases/mongo
|
26
|
+
# https://github.com/steveren/ruby-driver-sample-app/blob/master/lib/neighborhood.rb
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easymongo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fugroup Limited
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-07-12 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: '2.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: request_store
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: futest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: The way MongoDB for Ruby should be, can't get easier than this
|
70
|
+
email: vidar@fugroup.net
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- ".gitignore"
|
76
|
+
- CHANGELOG.md
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE
|
79
|
+
- README.md
|
80
|
+
- config/boot.rb
|
81
|
+
- easymongo.gemspec
|
82
|
+
- lib/easymongo.rb
|
83
|
+
- lib/easymongo/document.rb
|
84
|
+
- lib/easymongo/query.rb
|
85
|
+
- lib/easymongo/result.rb
|
86
|
+
homepage: https://github.com/fugroup/easymongo
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
metadata: {}
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
requirements: []
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.6.10
|
107
|
+
signing_key:
|
108
|
+
specification_version: 4
|
109
|
+
summary: Super Easy MongoDB client
|
110
|
+
test_files: []
|