data_steroid 0.4.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.
- checksums.yaml +7 -0
- data/README.md +41 -0
- data/lib/data_steroid/criteria.rb +9 -0
- data/lib/data_steroid/criteria/findable.rb +14 -0
- data/lib/data_steroid/criteria/queryable.rb +32 -0
- data/lib/data_steroid/entity.rb +69 -0
- data/lib/data_steroid/entity/initializable.rb +20 -0
- data/lib/data_steroid/errors/datastore_error.rb +6 -0
- data/lib/data_steroid/persistable.rb +10 -0
- data/lib/data_steroid/persistable/creatable.rb +16 -0
- data/lib/data_steroid/persistable/deletable.rb +18 -0
- data/lib/data_steroid/persistable/savable.rb +49 -0
- data/lib/data_steroid/properties.rb +57 -0
- data/lib/data_steroid/timestamps.rb +17 -0
- data/lib/data_steroid/validatable.rb +12 -0
- data/lib/date_steroid.rb +20 -0
- metadata +100 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 890052af87f8d091be85094d9d7dc9224550556d
|
|
4
|
+
data.tar.gz: 648d403b075eba488a15c3fffd2c00312bc909f1
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 2da98455efa756076cc9e8f27cb985dc8130d525ccef55d3a0b94fd58c2688972091090d26f94c57e592aea5bfd060bf41feb344911c1bda270dc8411827840b
|
|
7
|
+
data.tar.gz: 7d430b85ba9cb733bbc8ca13c12d520679b43782b8cf8125df7d8ed1d3b2774df6dcdbd93c6ac5e76ce9cd044e0f60ae08518d57c0154393cf63d51a92b6269d
|
data/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# DataSteroid
|
|
2
|
+
|
|
3
|
+
DataSteroid is an ODM (Object-Document-Mapper) framework for Google Datastore in Ruby based in Mongoid.
|
|
4
|
+
|
|
5
|
+
Install
|
|
6
|
+
-------
|
|
7
|
+
```sh
|
|
8
|
+
gem build data_steroid.gem
|
|
9
|
+
gem install data_steroid-<version>.gem
|
|
10
|
+
```
|
|
11
|
+
or
|
|
12
|
+
```ruby
|
|
13
|
+
gem 'data_steroid', '~> 0.4.0', git: 'https://github.com/b2beauty/data_steroid'
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Configure
|
|
17
|
+
---------
|
|
18
|
+
```sh
|
|
19
|
+
export DATASTORE_EMULATOR_HOST_PATH=datastore:8181/datastore
|
|
20
|
+
export DATASTORE_EMULATOR_HOST=datastore:8181
|
|
21
|
+
export DATASTORE_DATASET=<project-id>
|
|
22
|
+
export DATASTORE_PROJECT_ID=<project-id>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use
|
|
26
|
+
-------
|
|
27
|
+
```ruby
|
|
28
|
+
# Define product model product.rb
|
|
29
|
+
class Product
|
|
30
|
+
include DataSteroid::Entity # inject entity behaviour
|
|
31
|
+
include DataSteroid::Timestamps # add created and updated properties
|
|
32
|
+
|
|
33
|
+
kind 'Product' # Datastore Kind
|
|
34
|
+
|
|
35
|
+
property :barcode
|
|
36
|
+
property :name
|
|
37
|
+
property :price
|
|
38
|
+
|
|
39
|
+
validates :barcode, :name, :price, presence: true
|
|
40
|
+
end
|
|
41
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Criteria
|
|
3
|
+
# Defines behaviour for find operations.
|
|
4
|
+
module Findable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
class_methods do
|
|
8
|
+
def find(id)
|
|
9
|
+
run query.where('__key__', '=', gcloud_key(id.to_i))
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Criteria
|
|
3
|
+
# Defines behaviour for query operations.
|
|
4
|
+
module Queryable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
class_methods do
|
|
8
|
+
def query
|
|
9
|
+
datastore.query(kind)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run(query)
|
|
13
|
+
result = datastore.run query
|
|
14
|
+
new(result.first) if result.count == 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def fetch(query)
|
|
18
|
+
result = datastore.run query
|
|
19
|
+
if result.count > 0
|
|
20
|
+
result.map { |element| new(element) }
|
|
21
|
+
else
|
|
22
|
+
[]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def all
|
|
27
|
+
fetch query
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'google/cloud/datastore/entity'
|
|
2
|
+
|
|
3
|
+
module DataSteroid
|
|
4
|
+
# Inject behaviour for Datastore Entity.
|
|
5
|
+
module Entity
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
include Criteria
|
|
9
|
+
include Persistable
|
|
10
|
+
include Properties
|
|
11
|
+
include Validatable
|
|
12
|
+
|
|
13
|
+
include Entity::Initializable
|
|
14
|
+
|
|
15
|
+
included do
|
|
16
|
+
include ActiveModel::Conversion
|
|
17
|
+
extend ActiveModel::Naming
|
|
18
|
+
|
|
19
|
+
class_attribute :kind
|
|
20
|
+
|
|
21
|
+
def persisted?
|
|
22
|
+
id.present?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def gcloud_key
|
|
26
|
+
self.class.datastore.key(kind, id)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_gcloud
|
|
30
|
+
hash = {}
|
|
31
|
+
properties_names.each do |property|
|
|
32
|
+
hash[property] = send(property)
|
|
33
|
+
end
|
|
34
|
+
hash.sort.to_h
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def to_csv
|
|
38
|
+
values = to_gcloud.sort.to_h.values.map! do |v|
|
|
39
|
+
if v.class == Time
|
|
40
|
+
v.to_formatted_s(:db)
|
|
41
|
+
else
|
|
42
|
+
v.to_s.gsub(',', '')
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
values.join(',')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.kind(kind_name)
|
|
49
|
+
self.kind = kind_name
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class_methods do
|
|
54
|
+
def datastore
|
|
55
|
+
@datastore ||= Google::Cloud.new.datastore
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def datastore_entity
|
|
59
|
+
datastore.entity kind
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
protected
|
|
63
|
+
|
|
64
|
+
def gcloud_key(id)
|
|
65
|
+
datastore.key(kind, id)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Entity
|
|
3
|
+
# Define behaviour for initialization of Entity.
|
|
4
|
+
module Initializable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
def initialize(options = nil)
|
|
9
|
+
set_default_values
|
|
10
|
+
if options.is_a? Google::Cloud::Datastore::Entity
|
|
11
|
+
properties_names.each { |a| send("#{a}=", options[a.to_s]) }
|
|
12
|
+
send('id=', options.key.id)
|
|
13
|
+
elsif options.is_a? ::Hash
|
|
14
|
+
options.each_pair { |key, value| send("#{key}=", value) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Persistable
|
|
3
|
+
# Defines behaviour for create operations.
|
|
4
|
+
module Creatable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
class_methods do
|
|
8
|
+
def create(params)
|
|
9
|
+
obj = new params
|
|
10
|
+
return false if obj.invalid?
|
|
11
|
+
obj.save ? obj : nil
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Persistable
|
|
3
|
+
# Defines behaviour for delete operations.
|
|
4
|
+
module Deletable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
def delete
|
|
9
|
+
@gcloud_entity ||= self.class.datastore_entity
|
|
10
|
+
if !@gcloud_entity.persisted? && id.present?
|
|
11
|
+
@gcloud_entity.key = gcloud_key
|
|
12
|
+
end
|
|
13
|
+
self.class.datastore.delete @gcloud_entity
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
module Persistable
|
|
3
|
+
# Defines behaviour for save operations.
|
|
4
|
+
module Savable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
class_attribute :before_save_methods
|
|
9
|
+
|
|
10
|
+
self.before_save_methods = []
|
|
11
|
+
|
|
12
|
+
def save
|
|
13
|
+
return false if invalid?
|
|
14
|
+
|
|
15
|
+
before_save_methods.each do |name|
|
|
16
|
+
send(name)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@gcloud_entity ||= self.class.datastore_entity
|
|
20
|
+
|
|
21
|
+
to_gcloud.each_pair do |key, value|
|
|
22
|
+
if key == 'id' && value.present?
|
|
23
|
+
@gcloud_entity.key = gcloud_key unless @gcloud_entity.persisted?
|
|
24
|
+
next
|
|
25
|
+
end
|
|
26
|
+
if value.present?
|
|
27
|
+
@gcloud_entity[key] = value
|
|
28
|
+
elsif @gcloud_entity.properties.exist? key
|
|
29
|
+
@gcloud_entity.properties.delete key
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if (result = self.class.datastore.save(@gcloud_entity).first)
|
|
34
|
+
send('id=', result.key.id) if id.nil?
|
|
35
|
+
true
|
|
36
|
+
else
|
|
37
|
+
false
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class_methods do
|
|
43
|
+
def before_save(method)
|
|
44
|
+
before_save_methods << method
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
# Define behaviour to properties of entity.
|
|
3
|
+
module Properties
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
class_attribute :properties
|
|
8
|
+
|
|
9
|
+
self.properties = {}
|
|
10
|
+
|
|
11
|
+
property :id # Default property
|
|
12
|
+
|
|
13
|
+
def properties=(properties)
|
|
14
|
+
if properties.is_a? ::Hash
|
|
15
|
+
properties.each_pair { |key, value| send("#{key}=", value) }
|
|
16
|
+
else
|
|
17
|
+
raise Datastore::Errors::DatastoreError.new 'Properties params need is Hash'
|
|
18
|
+
end
|
|
19
|
+
rescue
|
|
20
|
+
raise Datastore::Errors::DatastoreError.new 'Property invalid'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def properties_names
|
|
24
|
+
properties.keys
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def set_default_values
|
|
28
|
+
properties.each_pair do |name, options|
|
|
29
|
+
send("#{name}=", properties[name][:default]) if options.key? :default
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class_methods do
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
def property(name, options = {})
|
|
38
|
+
add_property(name.to_s, options)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_property(name, options)
|
|
42
|
+
properties[name] = options
|
|
43
|
+
create_accessors(name)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# https://www.leighhalliday.com/ruby-metaprogramming-creating-methods
|
|
47
|
+
def create_accessors(name)
|
|
48
|
+
define_method(name) do # Define get method
|
|
49
|
+
instance_variable_get("@#{name}")
|
|
50
|
+
end
|
|
51
|
+
define_method("#{name}=") do |value| # Define set method
|
|
52
|
+
instance_variable_set("@#{name}", value)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
# Define behaviour to created_at and updated_at data
|
|
3
|
+
module Timestamps
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
property :created_at, default: DateTime.now
|
|
8
|
+
property :updated_at
|
|
9
|
+
|
|
10
|
+
before_save :update_updated_at
|
|
11
|
+
|
|
12
|
+
def update_updated_at
|
|
13
|
+
self.updated_at = DateTime.now
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/date_steroid.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module DataSteroid
|
|
2
|
+
require 'google/cloud'
|
|
3
|
+
require 'active_support/concern'
|
|
4
|
+
require 'active_model'
|
|
5
|
+
|
|
6
|
+
require 'data_steroid/criteria/findable'
|
|
7
|
+
require 'data_steroid/criteria/queryable'
|
|
8
|
+
require 'data_steroid/criteria'
|
|
9
|
+
require 'data_steroid/entity/initializable'
|
|
10
|
+
require 'data_steroid/properties'
|
|
11
|
+
require 'data_steroid/persistable/creatable'
|
|
12
|
+
require 'data_steroid/persistable/deletable'
|
|
13
|
+
require 'data_steroid/persistable/savable'
|
|
14
|
+
require 'data_steroid/persistable'
|
|
15
|
+
require 'data_steroid/validatable'
|
|
16
|
+
require 'data_steroid/entity'
|
|
17
|
+
require 'data_steroid/errors/datastore_error'
|
|
18
|
+
require 'data_steroid/persistable'
|
|
19
|
+
require 'data_steroid/timestamps'
|
|
20
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: data_steroid
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.4.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Fabio Tomio
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: google-cloud-datastore
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.20'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0.20'
|
|
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.2'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '4.2'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activemodel
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '4.2'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '4.2'
|
|
55
|
+
description: Simple ODM to Google Datastore based on Mongoid
|
|
56
|
+
email: fabiotomio@gmail.com
|
|
57
|
+
executables: []
|
|
58
|
+
extensions: []
|
|
59
|
+
extra_rdoc_files: []
|
|
60
|
+
files:
|
|
61
|
+
- README.md
|
|
62
|
+
- lib/data_steroid/criteria.rb
|
|
63
|
+
- lib/data_steroid/criteria/findable.rb
|
|
64
|
+
- lib/data_steroid/criteria/queryable.rb
|
|
65
|
+
- lib/data_steroid/entity.rb
|
|
66
|
+
- lib/data_steroid/entity/initializable.rb
|
|
67
|
+
- lib/data_steroid/errors/datastore_error.rb
|
|
68
|
+
- lib/data_steroid/persistable.rb
|
|
69
|
+
- lib/data_steroid/persistable/creatable.rb
|
|
70
|
+
- lib/data_steroid/persistable/deletable.rb
|
|
71
|
+
- lib/data_steroid/persistable/savable.rb
|
|
72
|
+
- lib/data_steroid/properties.rb
|
|
73
|
+
- lib/data_steroid/timestamps.rb
|
|
74
|
+
- lib/data_steroid/validatable.rb
|
|
75
|
+
- lib/date_steroid.rb
|
|
76
|
+
homepage: http://github.com/b2beauty/data_steroid
|
|
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: 2.3.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.6.6
|
|
97
|
+
signing_key:
|
|
98
|
+
specification_version: 4
|
|
99
|
+
summary: Google Datastore ODM
|
|
100
|
+
test_files: []
|