gdatastore_mapper 0.1.1 → 0.1.2bata

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: 252614e80440189db611c059b54b585ef35fb463
4
- data.tar.gz: 327bfa042abefc8ab140922550911efc6b156806
3
+ metadata.gz: 96cdd7dfe7d4ff1f1770ae525b2e142bd12ca1d3
4
+ data.tar.gz: 4c25acbe84f26e5480ddf5d42e80e25bde7080a5
5
5
  SHA512:
6
- metadata.gz: dbd509bfd392f50b11e5bbf1c331932915b8d2984637c20d16788be5bafa1a718493c777a7491ecda8fdea11a3a103c2169866430595a2a9c74fdb345725f221
7
- data.tar.gz: ffa79b0e909e5912fad1fbf1d2f3977934b09a75f8148adf652877467fc18ab863cbcde423f8abbd88c738f2daa923256fc416480dc0e77806bd72720c605bbb
6
+ metadata.gz: 0d8aef851f6ed9db4960e0eb3836f25fe3726a5365266fa9d6ec9a0522e9b14aa0168220643677019ac8c3b7a650def18c2f75595d2b61acce76069a3bb1283d
7
+ data.tar.gz: cc1489a449780b14b03bbd42d029c8f9f06f4fb074ef6ddbf8bfd7b3fb99717fc61f7bfe04af050ee6b55586a423e947f85dadaee9981536d5e76b9a86abcb60
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GdatastoreMapper
2
2
 
3
- GdatastoreMapper is a mapper framework for Google Cloud Datastore in Ruby / Ruby on Rails
3
+ GdatastoreMapper is a mapper framework for Google Cloud Datastore in Ruby / Ruby on Rails.
4
4
  Once you install GdatastoreMapper you can use Google Cloud Datastore like ActiveRecord.
5
5
 
6
6
  ## Installation
@@ -44,8 +44,8 @@ test:
44
44
 
45
45
  Only 2 things you need to do.
46
46
 
47
- 1 To include GdatastoreMapper
48
- 2 To set attr_accessor as column
47
+ 1. To include GdatastoreMapper
48
+ 2. To set attr_accessor as column
49
49
 
50
50
  That's it!
51
51
 
@@ -69,10 +69,10 @@ book = Book.new(title: 'Harry Potter')
69
69
  book.save
70
70
  ```
71
71
  ```
72
- Book.create(title: 'Harry Potter'
72
+ Book.create(title: 'Harry Potter')
73
73
  ```
74
74
  ```
75
- book.update(title: 'Harry Potter 2'
75
+ book.update(title: 'Harry Potter 2')
76
76
  ```
77
77
  ```
78
78
  book.delete
@@ -82,17 +82,84 @@ book.delete
82
82
 
83
83
  ```
84
84
  Book.where(title: 'Harry Potter')
85
+ => [#<Book:0x00 @created_at=2017-04-08 21:22:31 +0200, @title="Harry Potter",
86
+ @id=70, @updated_at=2017-04-08 21:22:31 +0200>]
85
87
  ```
86
88
  ```
87
89
  Book.find(12)
90
+ => #<Book:0x00 @created_at=2017-04-07 10:03:54 +0200, @title="Harry Potter",
91
+ @id=12, @updated_at=2017-04-07 22:57:57 +0200>
88
92
  ```
89
93
  ```
90
94
  Book.find_by(title: 'Harry Potter')
95
+ => #<Book:0x00 @created_at ....
91
96
  ```
92
97
  ```
93
98
  Book.order(title: :asc)
99
+ => [#<Book:0x00 @created_at .... ]
94
100
  ```
101
+ ```
102
+ Book.first
103
+ => #<Book:0x00 @created_at ....
104
+ ```
105
+ ```
106
+ Book.last
107
+ => #<Book:0x00 @created_at ....
108
+ ```
109
+ ```
110
+ Book.count
111
+ => 100
112
+ ```
113
+ ```
114
+ Book.all
115
+ => [#<Book:0x00 @created_at .... ]
116
+ ```
117
+
118
+ ## Associations
119
+
120
+ example of one to many relationship
121
+
122
+ ```ruby
123
+ class Book
124
+ include GdatastoreMapper::Base
125
+
126
+ attr_accessor :title
127
+
128
+ belongs_to :author
129
+ end
130
+ ```
131
+
132
+ ```ruby
133
+ class Author
134
+ include GdatastoreMapper::Base
135
+
136
+ attr_accessor :name
95
137
 
138
+ has_many :books
139
+ end
140
+ ```
141
+
142
+ books.create
143
+ ```
144
+ j_k_rolling = Author.create(name: 'J K Rolling')
145
+ harry_poter = j_k_rolling.books.create(title: 'Harry Poter')
146
+ harry_poter_2 = j_k_rolling.books.create(title: 'Harry Poter 2')
147
+ ```
148
+ books
149
+ ```
150
+ j_k_rolling.books
151
+ => [#<Book:0x00 @created_at .... ]
152
+ ```
153
+
154
+ books.count
155
+ ```
156
+ j_k_rolling.books.count
157
+ => 2
158
+ ```
159
+ ```
160
+ harry_poter.author
161
+ => [#<Author:0x00 @created_at .... ]
162
+ ```
96
163
 
97
164
  ## Development
98
165
 
@@ -102,7 +169,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
102
169
 
103
170
  ## Contributing
104
171
 
105
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/gdatastore_mapper. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
172
+ Bug reports and pull requests are welcome on GitHub at https://github.com/shinyaK14/gdatastore_mapper. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
106
173
 
107
174
 
108
175
  ## License
@@ -5,4 +5,3 @@ require "gdatastore_mapper/version"
5
5
  require "gdatastore_mapper/session"
6
6
  require "gdatastore_mapper/base"
7
7
 
8
-
@@ -1,18 +1,38 @@
1
+ # encoding: utf-8
1
2
  require "google/cloud"
3
+ require "gdatastore_mapper/relation"
4
+ require "gdatastore_mapper/associations/has_many"
2
5
 
3
6
  module GdatastoreMapper
4
7
  module Associations
8
+ extend ActiveSupport::Concern
9
+
10
+ def self.included(klass)
11
+ klass.include Associations
12
+ end
5
13
 
6
14
  def has_many models
15
+ self.class_eval("attr_accessor :#{models.to_s + '_id'}")
7
16
 
17
+ define_method models do
18
+ association = GdatastoreMapper::Associations::HasMany.new(self, models)
19
+ belongings = GdatastoreMapper::Relation.new(self, association)
20
+ if self.attributes.include?(id_ models) && !self.send(id_ models).nil?
21
+ self.send(id_ models).each do |id|
22
+ belongings << (models.to_s.classify.constantize.find id)
23
+ end
24
+ end
25
+ belongings
26
+ end
8
27
  end
9
28
 
10
29
  def belongs_to model
11
- # if @belongs_to_mode.defined?
12
- @belongs = model
30
+ self.class_eval("attr_accessor :#{model.to_s + '_id'}")
13
31
 
14
- define_method @belongs do
15
- p 'succseed'
32
+ define_method model do
33
+ if self.attributes.include?(id_ model)
34
+ model.to_s.classify.constantize.find self.send(id_ model)
35
+ end
16
36
  end
17
37
  end
18
38
 
@@ -0,0 +1,28 @@
1
+ module GdatastoreMapper
2
+ module Associations
3
+ class HasMany
4
+
5
+ attr_accessor :owner, :belonging
6
+
7
+ def initialize(owner, belonging)
8
+ @owner = owner
9
+ @belonging = belonging
10
+ end
11
+
12
+ def belonging_klass
13
+ @belonging.to_s.classify.constantize
14
+ end
15
+
16
+ def owner_attributes
17
+ {
18
+ (@owner.class.to_s.underscore + '_id') => @owner.id
19
+ }
20
+ end
21
+
22
+ def belonging_id
23
+ @belonging.to_s + '_id'
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -54,17 +54,24 @@ module GdatastoreMapper
54
54
  end
55
55
 
56
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
-
57
+ entity_timestamp
60
58
  attributes.each do |attribute|
61
- entity[attribute] = self.send attribute if self.send attribute
59
+ @entity[attribute] = self.send attribute if self.send attribute
62
60
  end
61
+ @entity
62
+ end
63
63
 
64
- entity['created_at'] = id ? self.created_at : Time.zone.now
65
- entity["updated_at"] = Time.zone.now
66
- entity
64
+ private
65
+
66
+ def entity_timestamp
67
+ @entity = Google::Cloud::Datastore::Entity.new
68
+ @entity.key = Google::Cloud::Datastore::Key.new self.class.to_s, id
69
+ @entity['created_at'] = id ? self.created_at : Time.zone.now
70
+ @entity["updated_at"] = Time.zone.now
67
71
  end
68
72
 
73
+ def id_ model
74
+ (model.to_s + '_id').to_sym
75
+ end
69
76
  end
70
77
  end
@@ -1,5 +1,28 @@
1
1
  module GdatastoreMapper
2
- class Relation
3
- include Enumerable
2
+ class Relation < Array
3
+ def initialize(klass, association)
4
+ @klass = klass
5
+ @association = association
6
+ end
7
+
8
+ def create attributes
9
+ belonging = create_belonging attributes
10
+ update_owner belonging
11
+ end
12
+
13
+ private
14
+
15
+ def create_belonging attributes
16
+ belonging_attr = attributes.merge(@association.owner_attributes)
17
+ @association.belonging_klass.create(belonging_attr)
18
+ end
19
+
20
+ def update_owner belonging
21
+ existing_ids = @association.owner.send(@association.belonging_id)
22
+ existing_ids = [] if existing_ids.nil?
23
+ owner_attr = {}
24
+ owner_attr[@association.belonging_id] = (existing_ids << belonging.id)
25
+ @association.owner.update(owner_attr)
26
+ end
4
27
  end
5
28
  end
@@ -1,11 +1,12 @@
1
1
  require "google/cloud"
2
+ require "gdatastore_mapper/relation"
2
3
 
3
4
  module GdatastoreMapper
4
5
  module Scoping
5
6
 
6
7
  def where condition
7
8
  return nil unless condition.is_a?(Hash)
8
- entities = dataset_run(where_query condition)
9
+ dataset_run(where_query condition)
9
10
  end
10
11
 
11
12
  def find id
@@ -20,11 +21,37 @@ module GdatastoreMapper
20
21
  where(condition)&.first
21
22
  end
22
23
 
24
+ def find_or_create condition
25
+ return nil unless condition.is_a?(Hash)
26
+ if record = where(condition)&.first
27
+ record
28
+ else
29
+ create condition
30
+ end
31
+ end
32
+
23
33
  def order condition
24
34
  return nil unless condition.is_a?(Hash)
25
35
  dataset_run(order_query condition)
26
36
  end
27
37
 
38
+ def all
39
+ order(created_at: :asc)
40
+ end
41
+
42
+
43
+ def first
44
+ all.first
45
+ end
46
+
47
+ def last
48
+ all.last
49
+ end
50
+
51
+ def count
52
+ all.count
53
+ end
54
+
28
55
  private
29
56
 
30
57
  def where_query condition
@@ -47,9 +74,11 @@ module GdatastoreMapper
47
74
 
48
75
  def dataset_run query
49
76
  entities = GdatastoreMapper::Session.dataset.run query
50
- entities.map do |entity|
51
- from_entity entity
77
+ result = GdatastoreMapper::Relation.new(self, nil)
78
+ entities.each do |entity|
79
+ result << (from_entity entity)
52
80
  end
81
+ result
53
82
  end
54
83
  end
55
84
  end
@@ -1,3 +1,3 @@
1
1
  module GdatastoreMapper
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2bata"
3
3
  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.1
4
+ version: 0.1.2bata
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-10 00:00:00.000000000 Z
11
+ date: 2017-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,6 +86,7 @@ files:
86
86
  - gdatastore_mapper.gemspec
87
87
  - lib/gdatastore_mapper.rb
88
88
  - lib/gdatastore_mapper/associations.rb
89
+ - lib/gdatastore_mapper/associations/has_many.rb
89
90
  - lib/gdatastore_mapper/base.rb
90
91
  - lib/gdatastore_mapper/persistence.rb
91
92
  - lib/gdatastore_mapper/relation.rb
@@ -107,9 +108,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
108
  version: '0'
108
109
  required_rubygems_version: !ruby/object:Gem::Requirement
109
110
  requirements:
110
- - - ">="
111
+ - - ">"
111
112
  - !ruby/object:Gem::Version
112
- version: '0'
113
+ version: 1.3.1
113
114
  requirements: []
114
115
  rubyforge_project:
115
116
  rubygems_version: 2.6.11