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 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: []