gdatastore_mapper 0.1.0 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8339e4271469d355d8321d712d6848c6e5c9e88f
4
- data.tar.gz: fcfbbce79a36070aa8aaf454045ef5da407c5383
3
+ metadata.gz: 252614e80440189db611c059b54b585ef35fb463
4
+ data.tar.gz: 327bfa042abefc8ab140922550911efc6b156806
5
5
  SHA512:
6
- metadata.gz: 65c1b76fe9def6a043986b51845e390123394548f35847692e4d7dfcc01e478feffe74db900d4ad9a9aca4ab5670df2bb39b51848472d1f54c9772a528874cc2
7
- data.tar.gz: 1493d956650d1b67a5190a85c6f927643c5902db011e67520e90badbf802e0af8d24dd81f024cab6756d6c32a3b937eace21a1e33fddcd614ceed133eee924c4
6
+ metadata.gz: dbd509bfd392f50b11e5bbf1c331932915b8d2984637c20d16788be5bafa1a718493c777a7491ecda8fdea11a3a103c2169866430595a2a9c74fdb345725f221
7
+ data.tar.gz: ffa79b0e909e5912fad1fbf1d2f3977934b09a75f8148adf652877467fc18ab863cbcde423f8abbd88c738f2daa923256fc416480dc0e77806bd72720c605bbb
data/Gemfile CHANGED
@@ -3,6 +3,10 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in gdatastore_mapper.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'activemodel', '~> 5.0.1'
7
+ gem 'activesupport', '~> 5.0.1'
8
+ gem 'rake'
9
+
6
10
  group :test do
7
11
  gem 'byebug', platform: :mri
8
12
  gem 'factory_girl_rails', require: false
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  # GdatastoreMapper
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/gdatastore_mapper`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ GdatastoreMapper is a mapper framework for Google Cloud Datastore in Ruby / Ruby on Rails
4
+ Once you install GdatastoreMapper you can use Google Cloud Datastore like ActiveRecord.
6
5
 
7
6
  ## Installation
8
7
 
@@ -20,9 +19,80 @@ Or install it yourself as:
20
19
 
21
20
  $ gem install gdatastore_mapper
22
21
 
22
+ ## Configuration
23
+
24
+ GdatastoreMapper configuration can be done through a database.yml. The simplest configuration is as follows, which sets the emulator_host to "localhost:8444" and dataset_id.
25
+
26
+ ```
27
+ # config/database.yml
28
+ production:
29
+ dataset_id: your-google-cloud-platform-project-id
30
+
31
+ staging:
32
+ dataset_id: your-google-cloud-platform-project-id
33
+
34
+ development:
35
+ dataset_id: your-google-cloud-platform-project-id
36
+ emulator_host: localhost:8444
37
+
38
+ test:
39
+ dataset_id: your-google-cloud-platform-project-id
40
+ emulator_host: localhost:8444
41
+ ```
42
+
23
43
  ## Usage
24
44
 
25
- TODO: Write usage instructions here
45
+ Only 2 things you need to do.
46
+
47
+ 1 To include GdatastoreMapper
48
+ 2 To set attr_accessor as column
49
+
50
+ That's it!
51
+
52
+ ```ruby
53
+ class Book
54
+ include GdatastoreMapper::Base
55
+
56
+ attr_accessor :title, :author
57
+ end
58
+ ```
59
+
60
+ ## Persistence Methods
61
+
62
+ ```
63
+ book = Book.new
64
+ book.title = 'Harry Potter'
65
+ book.save
66
+ ```
67
+ ```
68
+ book = Book.new(title: 'Harry Potter')
69
+ book.save
70
+ ```
71
+ ```
72
+ Book.create(title: 'Harry Potter'
73
+ ```
74
+ ```
75
+ book.update(title: 'Harry Potter 2'
76
+ ```
77
+ ```
78
+ book.delete
79
+ ```
80
+
81
+ ## Scoping Methods
82
+
83
+ ```
84
+ Book.where(title: 'Harry Potter')
85
+ ```
86
+ ```
87
+ Book.find(12)
88
+ ```
89
+ ```
90
+ Book.find_by(title: 'Harry Potter')
91
+ ```
92
+ ```
93
+ Book.order(title: :asc)
94
+ ```
95
+
26
96
 
27
97
  ## Development
28
98
 
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = %q{Google Cloud Datastore Mapper in Ruby / Ruby on Rails}
13
13
  spec.description = %q{Google Cloud Datastore ORM/ODM (Mapper) in Ruby and Ruby on Rails}
14
- spec.homepage = "https://github.com/shinyaK14/gcloud_orm_ruby"
14
+ spec.homepage = "https://github.com/shinyaK14/gdatastore_mapper"
15
15
  spec.license = "MIT"
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -0,0 +1,20 @@
1
+ require "google/cloud"
2
+
3
+ module GdatastoreMapper
4
+ module Associations
5
+
6
+ def has_many models
7
+
8
+ end
9
+
10
+ def belongs_to model
11
+ # if @belongs_to_mode.defined?
12
+ @belongs = model
13
+
14
+ define_method @belongs do
15
+ p 'succseed'
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,70 @@
1
+ require "google/cloud/datastore"
2
+ require "gdatastore_mapper/session"
3
+ require "gdatastore_mapper/scoping"
4
+ require "gdatastore_mapper/associations"
5
+ require "gdatastore_mapper/persistence"
6
+
7
+ module GdatastoreMapper
8
+ module Base
9
+ extend ActiveSupport::Concern
10
+ include ActiveModel::Model
11
+ include ActiveModel::Validations
12
+
13
+ attr_accessor :id, :created_at, :updated_at
14
+
15
+ def self.included(klass)
16
+ klass.extend Scoping
17
+ klass.extend Associations
18
+ klass.include Persistence
19
+ end
20
+
21
+ module ClassMethods
22
+
23
+ def attr_accessor(*vars)
24
+ @attributes ||= []
25
+ @attributes.concat vars
26
+ super
27
+ end
28
+
29
+ def attributes
30
+ @attributes.reject do |attr|
31
+ [:id, :created_at, :updated_at].include? attr
32
+ end
33
+ end
34
+
35
+ def from_entity entity
36
+ record = self.new
37
+ record.id = entity.key.id
38
+ entity.properties.to_hash.each do |name, value|
39
+ record.send "#{name}=", value if record.respond_to? "#{name}="
40
+ end
41
+ record
42
+ end
43
+
44
+ def create params
45
+ record = self.new params
46
+ record.save
47
+ record
48
+ end
49
+
50
+ end
51
+
52
+ def attributes
53
+ self.class.attributes
54
+ end
55
+
56
+ def to_entity
57
+ entity = Google::Cloud::Datastore::Entity.new
58
+ entity.key = Google::Cloud::Datastore::Key.new self.class.to_s, id
59
+
60
+ attributes.each do |attribute|
61
+ entity[attribute] = self.send attribute if self.send attribute
62
+ end
63
+
64
+ entity['created_at'] = id ? self.created_at : Time.zone.now
65
+ entity["updated_at"] = Time.zone.now
66
+ entity
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,35 @@
1
+ require "google/cloud"
2
+
3
+ module GdatastoreMapper
4
+ module Persistence
5
+
6
+ def save
7
+ return false if !valid?
8
+ entity = to_entity
9
+ GdatastoreMapper::Session.dataset.save(entity)
10
+ self.id = entity.key.id
11
+ true
12
+ end
13
+
14
+ def update attributes
15
+ attributes.each do |name, value|
16
+ send "#{name}=", value if respond_to? "#{name}="
17
+ end
18
+ save
19
+ end
20
+
21
+ def destroy
22
+ GdatastoreMapper::Session.dataset.delete \
23
+ Google::Cloud::Datastore::Key.new self.class.to_s, id
24
+ end
25
+
26
+ def delete
27
+ GdatastoreMapper::Session.dataset.delete \
28
+ Google::Cloud::Datastore::Key.new self.class.to_s, id
29
+ end
30
+
31
+ def persisted?
32
+ id.present?
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module GdatastoreMapper
2
+ class Relation
3
+ include Enumerable
4
+ end
5
+ end
@@ -0,0 +1,55 @@
1
+ require "google/cloud"
2
+
3
+ module GdatastoreMapper
4
+ module Scoping
5
+
6
+ def where condition
7
+ return nil unless condition.is_a?(Hash)
8
+ entities = dataset_run(where_query condition)
9
+ end
10
+
11
+ def find id
12
+ return nil unless id.is_a?(Fixnum)
13
+ query = Google::Cloud::Datastore::Key.new self.to_s, id.to_i
14
+ entities = GdatastoreMapper::Session.dataset.lookup query
15
+ from_entity entities.first if entities.any?
16
+ end
17
+
18
+ def find_by condition
19
+ return nil unless condition.is_a?(Hash)
20
+ where(condition)&.first
21
+ end
22
+
23
+ def order condition
24
+ return nil unless condition.is_a?(Hash)
25
+ dataset_run(order_query condition)
26
+ end
27
+
28
+ private
29
+
30
+ def where_query condition
31
+ query = Google::Cloud::Datastore::Query.new
32
+ query.kind self.to_s
33
+ condition.each do |property, value|
34
+ query.where(property.to_s, '=', value)
35
+ end
36
+ query
37
+ end
38
+
39
+ def order_query condition
40
+ query = Google::Cloud::Datastore::Query.new
41
+ query.kind self.to_s
42
+ condition.each do |property, value|
43
+ query.order(property.to_s, value)
44
+ end
45
+ query
46
+ end
47
+
48
+ def dataset_run query
49
+ entities = GdatastoreMapper::Session.dataset.run query
50
+ entities.map do |entity|
51
+ from_entity entity
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,18 @@
1
+ require "google/cloud"
2
+
3
+ module GdatastoreMapper
4
+ class Session
5
+
6
+ def self.dataset
7
+ config = Rails.application.config.database_configuration[Rails.env]
8
+ @dataset ||= Google::Cloud::Datastore.new(
9
+ project: config['dataset_id'],
10
+ emulator_host: config['emulator_host']
11
+ )
12
+ end
13
+
14
+ def self.destroy
15
+ @dataset = nil
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module GdatastoreMapper
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,5 +1,8 @@
1
+ require 'active_support/concern'
2
+ require 'active_model'
3
+
1
4
  require "gdatastore_mapper/version"
5
+ require "gdatastore_mapper/session"
6
+ require "gdatastore_mapper/base"
7
+
2
8
 
3
- module GdatastoreMapper
4
- # Your code goes here...
5
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gdatastore_mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinya Kitamura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-05 00:00:00.000000000 Z
11
+ date: 2017-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,8 +85,14 @@ files:
85
85
  - bin/setup
86
86
  - gdatastore_mapper.gemspec
87
87
  - lib/gdatastore_mapper.rb
88
+ - lib/gdatastore_mapper/associations.rb
89
+ - lib/gdatastore_mapper/base.rb
90
+ - lib/gdatastore_mapper/persistence.rb
91
+ - lib/gdatastore_mapper/relation.rb
92
+ - lib/gdatastore_mapper/scoping.rb
93
+ - lib/gdatastore_mapper/session.rb
88
94
  - lib/gdatastore_mapper/version.rb
89
- homepage: https://github.com/shinyaK14/gcloud_orm_ruby
95
+ homepage: https://github.com/shinyaK14/gdatastore_mapper
90
96
  licenses:
91
97
  - MIT
92
98
  metadata: {}