data_steroid 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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,9 @@
1
+ module DataSteroid
2
+ # Inject behaviour for query operations.
3
+ module Criteria
4
+ extend ActiveSupport::Concern
5
+
6
+ include Queryable
7
+ include Findable
8
+ end
9
+ end
@@ -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,6 @@
1
+ module DataSteroid
2
+ module Errors
3
+ class DatastoreError < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module DataSteroid
2
+ # Inject behaviour for poersistation operations.
3
+ module Persistable
4
+ extend ActiveSupport::Concern
5
+
6
+ include Savable
7
+ include Deletable
8
+ include Creatable
9
+ end
10
+ 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
@@ -0,0 +1,12 @@
1
+ require 'google/cloud/datastore/entity'
2
+
3
+ module DataSteroid
4
+ # Add validations to attributes of model.
5
+ module Validatable
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ include ActiveModel::Validations
10
+ end
11
+ end
12
+ end
@@ -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: []