firestore-odm 0.1.1 → 0.1.2

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
  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