rom-firebase 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6f3a6e278440146ffd1e563a0f9aec4f451fecd6a5f2e6526a47a2225a6aae43
4
+ data.tar.gz: 0efcfd54e8102022cf811a8fd32e9552ee998a97e8991b9bd1eeebbd182410a1
5
+ SHA512:
6
+ metadata.gz: 41f0c08842cdac15302751adcc4b2e57b8e78817a0be1d570ea3fb538bcdf26a472e9c10e28643cb2e2278e2ac136a4bf61cf147fd36bf8e51767cb40119b78e
7
+ data.tar.gz: b04c977c6b33b08e92618619f9f700e065dea426b665b5fa5a03f0c65fe8c5a9837bcd49c16a10a5bc677f355fbcc2b30079f943c6dac085eddcad02fbffa8ff
Binary file
@@ -0,0 +1,3 @@
1
+ Q�������% ��Ћ���UW�0�1O ��R��s\���՟,�~��MV�=���G����m��Sg z�!BI{�����9��M �y�1�(=b<�zު��E�6+��u��d��NZ4��@sG�O��Ճ�oN5��1K��6������7`��e(�$7�Vk<�<XR��U�勫[�
2
+ �:M����=TJȾq�?�;Dڭ����[gO��S��˙�ߢӎ��pa�U�WE��v�34�0dt��ֹ���R��G| ��o�8i�H!)T�qQ�{��a�bb���Ѷ�A[q'�G��ˀB�*�ځ��ے�q�h�����1��� �`'�.�Xu�L�W^�R��vS��3�?�'��h&�*�D���w
3
+ 8>w:�N�|
@@ -0,0 +1,2 @@
1
+ require 'rom'
2
+ require_relative 'rom/firebase'
@@ -0,0 +1,13 @@
1
+ require_relative 'firebase/commands/create'
2
+ require_relative 'firebase/commands/delete'
3
+ require_relative 'firebase/commands/update'
4
+ require_relative 'firebase/dataset'
5
+ require_relative 'firebase/gateway'
6
+ require_relative 'firebase/mapper_compiler'
7
+ require_relative 'firebase/relation'
8
+ require_relative 'firebase/repository'
9
+ require_relative 'firebase/request_handler'
10
+ require_relative 'firebase/response_handler'
11
+ require_relative 'firebase/types/timestamp'
12
+
13
+ ROM.register_adapter(:firebase, ROM::Firebase)
@@ -0,0 +1,15 @@
1
+ require 'rom/http/commands/create'
2
+
3
+ module ROM
4
+ module Firebase
5
+ module Commands
6
+ class Create < ROM::HTTP::Commands::Create
7
+ adapter :firebase
8
+
9
+ def execute(tuples)
10
+ relation.by_pk(super.first[:key])
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ require 'rom/http/commands/delete'
2
+
3
+ module ROM
4
+ module Firebase
5
+ module Commands
6
+ class Delete < ROM::HTTP::Commands::Delete
7
+ adapter :firebase
8
+
9
+ def execute(primary_key)
10
+ relation.by_pk(primary_key).delete
11
+ []
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'rom/http/commands/update'
2
+
3
+ module ROM
4
+ module Firebase
5
+ module Commands
6
+ class Update < ROM::HTTP::Commands::Update
7
+ adapter :firebase
8
+
9
+ def execute(key, params)
10
+ relation.by_pk(key).update(params)
11
+ relation.by_pk(key)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ require 'rom/http/dataset'
2
+
3
+ module ROM
4
+ module Firebase
5
+ class Dataset < ROM::HTTP::Dataset
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'rom/http/gateway'
2
+
3
+ module ROM
4
+ module Firebase
5
+ class Gateway < ROM::HTTP::Gateway
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ require 'rom/mapper_compiler'
2
+ require_relative 'struct_compiler'
3
+
4
+ module ROM
5
+ module Firebase
6
+ class MapperCompiler < ::ROM::MapperCompiler
7
+ def initialize(*args)
8
+ super
9
+ cache = Cache.new
10
+ @struct_compiler = StructCompiler.new(cache: cache)
11
+ @cache = cache.namespaced(:mappers)
12
+ @mapper_options = self.class.mapper_options
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rom/http/relation'
4
+
5
+ module ROM
6
+ module Firebase
7
+ class Relation < ROM::HTTP::Relation
8
+ adapter :firebase
9
+
10
+ def limit(count, key: DEFAULT_ORDER_BY)
11
+ with_params(order_by(key).merge(limitToLast: count))
12
+ end
13
+
14
+ def by_pk(primary_key)
15
+ with_path(CGI.escape(primary_key))
16
+ end
17
+
18
+ private
19
+
20
+ DEFAULT_ORDER_BY = 'createdAt'
21
+ private_constant :DEFAULT_ORDER_BY
22
+
23
+ def order_by(key)
24
+ { orderBy: %("#{key}") }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,55 @@
1
+ module ROM
2
+ module Firebase
3
+ class Repository < ROM::Repository::Root
4
+ commands :create, :delete, :update
5
+
6
+ def all
7
+ root.to_a
8
+ end
9
+
10
+ def count
11
+ all.size
12
+ end
13
+
14
+ def create(params)
15
+ find(super.key).one
16
+ end
17
+
18
+ def delete_all(keys)
19
+ execute_threaded(keys, &method(:delete))
20
+ end
21
+
22
+ def find(primary_key)
23
+ root.by_pk(primary_key)
24
+ end
25
+
26
+ def first
27
+ limit(1).to_a.first
28
+ end
29
+
30
+ def last
31
+ all.last
32
+ end
33
+
34
+ def limit(count)
35
+ root.limit(count)
36
+ end
37
+
38
+ def where(&block)
39
+ all.select(&block)
40
+ end
41
+
42
+ def update_all(keys, params)
43
+ execute_threaded(keys) { |key| update(key, params) }
44
+ end
45
+
46
+ private
47
+
48
+ def execute_threaded(list, &_block)
49
+ list.each_with_object([]) do |item, threads|
50
+ threads << Thread.new { yield item }
51
+ end.each(&:join).map(&:value)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,36 @@
1
+ require 'firebase'
2
+
3
+ module ROM
4
+ module Firebase
5
+ class RequestHandler
6
+ def call(dataset)
7
+ client(dataset.uri).send(
8
+ MAPPING[dataset.request_method],
9
+ dataset.uri.path.gsub(%r{\A/}, ''),
10
+ dataset.params
11
+ )
12
+ end
13
+
14
+ def initialize(config)
15
+ @config = config
16
+ end
17
+
18
+ private
19
+
20
+ MAPPING = {
21
+ delete: :delete,
22
+ get: :get,
23
+ post: :push,
24
+ put: :update
25
+ }.freeze
26
+
27
+ def client(uri)
28
+ ::Firebase::Client.new("#{uri.scheme}://#{uri.host}", config)
29
+ end
30
+
31
+ def config
32
+ File.read(@config)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ module ROM
2
+ module Firebase
3
+ class ResponseHandler
4
+ def self.call(response, dataset)
5
+ new(response, dataset).call
6
+ end
7
+
8
+ def initialize(response, dataset)
9
+ @response = response
10
+ @dataset = dataset
11
+ end
12
+
13
+ def call
14
+ return create_response if options[:request_method] == :post
15
+ return [path_response] unless path.nil? || path.empty?
16
+ return [] if options[:request_method] == :delete # delete always succeeds
17
+
18
+ collection_response
19
+ end
20
+
21
+ private
22
+
23
+ attr_accessor :dataset, :response
24
+
25
+ def create_response
26
+ { key: response_body['name'] }
27
+ end
28
+
29
+ def options
30
+ dataset.options
31
+ end
32
+
33
+ def path
34
+ options[:path]
35
+ end
36
+
37
+ def collection_response
38
+ response_body.map(&method(:response_hash))
39
+ end
40
+
41
+ def path_response
42
+ response_hash(path, response_body || {})
43
+ end
44
+
45
+ def response_body
46
+ response.body || {}
47
+ end
48
+
49
+ def response_hash(firebase_key, model)
50
+ { key: firebase_key }.merge(
51
+ model.map { |key, value| [key.to_sym, value] }.to_h
52
+ )
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ require 'rom/struct_compiler'
2
+
3
+ module ROM
4
+ module Firebase
5
+ class StructCompiler < ROM::StructCompiler
6
+ # @api private
7
+ def build_class(name, parent, ns, &block)
8
+ Dry::Core::ClassBuilder.
9
+ new(name: class_name(name), parent: parent, namespace: ns).
10
+ call do |struct|
11
+ struct.transform_types { |type| type.optional? ? type.required(false) : type }
12
+ block.call(struct)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'firebase/server_value'
4
+
5
+ module ROM
6
+ module Firebase
7
+ module Types
8
+ Timestamp = ::ROM::Types::Strict::Hash
9
+ .schema('.sv' => ::ROM::Types::Strict::String)
10
+ .default(::Firebase::ServerValue::TIMESTAMP.freeze)
11
+ .meta(read: ::ROM::Types::Strict::Integer)
12
+ end
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rom-firebase
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Philip Arndt
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEMjCCApqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhnZW1z
14
+ L0RDPXAvREM9YXJuZHQvREM9aW8wHhcNMTgxMDI5MDk0MjQ5WhcNMTkxMDI5MDk0
15
+ MjQ5WjAjMSEwHwYDVQQDDBhnZW1zL0RDPXAvREM9YXJuZHQvREM9aW8wggGiMA0G
16
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQClF0/voptshDoTILFgUjvkViCOPe3W
17
+ uuDwfSep+gc5AI83MmrmonN3L/dwm60D3HhZOtVt9el1n5E5b5aPzJngjdF9sFPX
18
+ OIx3UlYde+WkzbG4iR2U0/8dMZ6DYuz6ijgPEpU1UKodUJVqEmt3Vc+rzDET9zoK
19
+ TkIALNbSaV2G32ZDhoabeQJoJ0ce/2vjDqhM7awG7CYGRqRq4c0NOKKm0bGh+LOo
20
+ vQNDvRjXPs0yp5i3keCgf6IcQ26nluqILYGPjuTExJj+k6AKfq6SPWDVtzSqdfiH
21
+ STs/W85rwrKdLfEzfXxNsHvJ6Ryx+0A0hsNbfTTOhp4dkYm/6fyOejp7Of7qWRw/
22
+ kJhI/PTq1gqh+Irpr+wUz04xItGE8WglKv1ydTUqBlCz2l9NfVTChtUpYlrk4FvN
23
+ r7s6fcXH5cNX1ll2D1X2XLxmYEUgbAv5xApspvmpdRY5zlmSXZapi2KbW5iqpOV2
24
+ luxRjhjfcOKfMugvGrMUFiqDaDi5IXS25KECAwEAAaNxMG8wCQYDVR0TBAIwADAL
25
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFLzeU7GH0rvnvDchSWtJhceiUDDTMBoGA1Ud
26
+ EQQTMBGBD2dlbXNAcC5hcm5kdC5pbzAaBgNVHRIEEzARgQ9nZW1zQHAuYXJuZHQu
27
+ aW8wDQYJKoZIhvcNAQELBQADggGBABMRA737G23Oiy1xBgVJsDW5LgGbeK9JQCC9
28
+ eRdx22TDyrJ5vviqB22k13+zp/tq5fgeCsrk5iLAt5F/GgcP82p7pPm3qKi1QWip
29
+ cnQvy5fLKcl+PaIX/+PYGVKUfV/wA+NuP06RSnzvNPepcUvbTJdAr6nQVdIh/ftB
30
+ 64QhOWuk2CuGlt+tLMGbjR65W3SppBkvVd4yYHArbl4Z0qPG+TVrVrj2JEjo82rT
31
+ jIUDLkdUlQ/FmH5fHhbrtn5PMCXjto414YBC7aQUxQsiNCN2qhsjwiyzVBbBTjnA
32
+ 1sA043YnGOd1XylVtnrARK5eT7DhFGrMGMp/KvOg+T7q19+65jaopvHH4zFXzBcY
33
+ MxlH/7tMQ5+DdHcqbu3SOAe1/VaaRk28J0CdPZS6Y60YuRqL17Zg2WOODiBkA9WE
34
+ JjcyzdERZXsSPh+DT5PrllEbTNTZPbBcnAWjqdEWLtBIxD3JpgZHTmYP4I2ExAeu
35
+ 2Oqsxsw30MIZnh2Cw/xLRkc1I50luA==
36
+ -----END CERTIFICATE-----
37
+ date: 2019-03-27 00:00:00.000000000 Z
38
+ dependencies:
39
+ - !ruby/object:Gem::Dependency
40
+ name: firebase
41
+ requirement: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: 0.2.8
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: 0.2.8
53
+ - !ruby/object:Gem::Dependency
54
+ name: rom-http
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 0.7.0
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.7.0
67
+ description: Firebase support for ROM
68
+ email: gems@p.arndt.io
69
+ executables: []
70
+ extensions: []
71
+ extra_rdoc_files: []
72
+ files:
73
+ - lib/rom-firebase.rb
74
+ - lib/rom/firebase.rb
75
+ - lib/rom/firebase/commands/create.rb
76
+ - lib/rom/firebase/commands/delete.rb
77
+ - lib/rom/firebase/commands/update.rb
78
+ - lib/rom/firebase/dataset.rb
79
+ - lib/rom/firebase/gateway.rb
80
+ - lib/rom/firebase/mapper_compiler.rb
81
+ - lib/rom/firebase/relation.rb
82
+ - lib/rom/firebase/repository.rb
83
+ - lib/rom/firebase/request_handler.rb
84
+ - lib/rom/firebase/response_handler.rb
85
+ - lib/rom/firebase/struct_compiler.rb
86
+ - lib/rom/firebase/types/timestamp.rb
87
+ homepage: https://github.com/parndt/rom-firebase
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 2.6.1
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.0.3
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Firebase support for ROM
110
+ test_files: []
@@ -0,0 +1,4 @@
1
+ _B��D���w�o }�b�#kyO(������
2
+ (�u$H�����䋼�ե|�X23��ٲM�=�Qp ��(ԢjVΉ@
3
+ �{�>%D��l ��c8��#�;��r�WS4ݑ�`�0� �t9��x�
4
+ �~��u����:�,�L��w`Ӻ@�.�N;� o�qS�[V`�,��I*���^!.�![�1g$FMsu�z5g�u�6�nO�,[bn�wGӸ��8O���`�1Y���Y�W�՛�r��q�w�