firestore-odm 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6dbb42212308b32dcfd3d52e95f7b6d15a9dba8261ec9489541ecb94f46ba63
4
- data.tar.gz: 0f7a0fa74de356f22fe7dceb6c83188b658b4dc566e4004b62498d40555a2793
3
+ metadata.gz: 9c19b9311e05a559ae948eb18b2c1dcd45bab13f779e856f55304928fffdfe9b
4
+ data.tar.gz: e25f77db855209bc069a7ca45aae3f776bbb03c47d983fd8e25abbed8e96b472
5
5
  SHA512:
6
- metadata.gz: 29340ee23f122a2bc71cfd396d4c1aa33be49274990f1079fb4a81b599dd5d5cfbe014a76b2c6e3235e81de7f35891e8e84242a1b94b0fc913c0d04b59676714
7
- data.tar.gz: d00dcfa5a1b1c2aacd2fe5d3e8696015bf8ab77e022a3ea57346aff787e98c36fa63e75ee2f3630bc10ddce3fbce22fb815c71b70cb862809011b230a44a34d2
6
+ metadata.gz: 04b5050dbb29a05f521b0bb82830808fc2cbf4af3beac1338d99b07daf4e754429317579b2c6f3c01912ac0fb42d865fe52bd5f81139c41ba091c6b8e8427c34
7
+ data.tar.gz: a87df1fadd1972422370c484f81f0550ffb1265e957763fa1338e51888ae3003ff84c6db8066e8f889234472065a3173307c4cfd13db1e43ea2a1014b8c8a5ce
@@ -14,4 +14,68 @@ class Module
14
14
  def define_setter_method name, &block
15
15
  define_method("#{name}=", &block)
16
16
  end
17
+ end
18
+
19
+ module FirestoreODM
20
+ attr_reader :conversions
21
+
22
+ @conversions = {
23
+ String => :to_s,
24
+ Integer => :to_i,
25
+ Float => :to_f,
26
+ Date => :to_date,
27
+ DateTime => :to_datetime,
28
+ Time => :to_time
29
+ }
30
+
31
+ # Sets a conversion rule for a certain type.
32
+ # @param type [Class]
33
+ # @param target [Symbol, Proc]
34
+ def add_conversion type, target
35
+ @conversions[type] = target
36
+ return
37
+ end
38
+
39
+ # Gets a conversion.
40
+ # @param type [Class]
41
+ # @return [Proc]
42
+ def get_conversion type
43
+ case rule = conversions[type]
44
+ when Symbol
45
+ Proc.new { |value| value.method(rule).call }
46
+ when Proc
47
+ rule
48
+ else
49
+ raise "Conversion not found for type `#{type}`"
50
+ end
51
+ end
52
+
53
+ def more_than value
54
+ Proc.new { |o| value < o }
55
+ end
56
+
57
+ def min value
58
+ Proc.new { |o| value <= o }
59
+ end
60
+
61
+ def max value
62
+ Proc.new { |o| o <= value }
63
+ end
64
+
65
+ def less_than value
66
+ Proc.new { |o| o < value }
67
+ end
68
+
69
+ def check_option name, option
70
+ method = FirestoreODM.method name
71
+
72
+ case option
73
+ when Proc
74
+ check_option name, option.call
75
+ else
76
+ method.call option
77
+ end
78
+ end
79
+
80
+ extend self
17
81
  end
@@ -17,17 +17,21 @@ module FirestoreODM
17
17
  end
18
18
 
19
19
  # Creates a document.
20
- # @return [FirestoreODM::Model] the document.
20
+ # @param opts [Hash] a hash with options.
21
+ # @yield [doc]
22
+ # @return [FirestoreODM::Document] the document.
21
23
  def create opts = {}, &block
22
24
  block.call o = self.new
25
+
23
26
  doc = collection(opts[:relative_to]).add o.changes
24
27
  self.new doc
25
28
  end
26
29
 
27
- # Creates a document.
30
+ # Creates a document with an specific id.
28
31
  # @param id [String] the document id.
29
- # @param root [Google::Cloud::Firestore::DocumentReference]
30
- # @return [FirestoreODM::Model] the document.
32
+ # @param opts [Hash]
33
+ # @yield [doc]
34
+ # @return [FirestoreODM::Document] the document.
31
35
  def create_with_id id, opts = {}, &block
32
36
  block.call o = self.new
33
37
 
@@ -38,7 +42,8 @@ module FirestoreODM
38
42
 
39
43
  # Gets a document.
40
44
  # @param id [String]
41
- # @return [FirestoreODM::Model] the document.
45
+ # @param opts [Hash]
46
+ # @return [FirestoreODM::Document] the document.
42
47
  def from_id id, opts = {}
43
48
  doc = collection(opts[:relative_to]).doc id
44
49
  self.new doc
@@ -5,8 +5,27 @@ module FirestoreODM
5
5
  # @param type [Class] the field's type.
6
6
  # @param opts [Hash] the field's options.
7
7
  def field name, type, opts = {}
8
+ conversion = FirestoreODM.get_conversion type
9
+
10
+ list = []
11
+
12
+ list << FirestoreODM.check_option(:min, opts[:min]) if opts[:min]
13
+ list << FirestoreODM.check_option(:max, opts[:max]) if opts[:max]
14
+ list << FirestoreODM.check_option(:less_than, opts[:less_than]) if opts[:less_than]
15
+ list << FirestoreODM.check_option(:more_than, opts[:more_than]) if opts[:more_than]
16
+
17
+ define_singleton_method("parse_#{name}") do |value|
18
+ list.reduce(true) { |result, o| result and o.call(value) }
19
+ end
20
+
8
21
  define_method(name) { self[name] }
9
- define_setter_method(name) { |value| self[name] = value }
22
+
23
+ define_method("#{name}=") do |value|
24
+ value = conversion.call value
25
+ raise "#{value} is not a valid value for field #{name}" unless self.class.method("parse_#{name}").call value
26
+ self[name] = value
27
+ end
28
+
10
29
  return
11
30
  end
12
31
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firestore-odm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felipe Cabrera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-31 00:00:00.000000000 Z
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: ''
14
14
  email: fecabrera0@outlook.com