ons-firestore 1.0.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.
- checksums.yaml +7 -0
- data/README.md +24 -0
- data/lib/ons-firestore/firestore.rb +76 -0
- data/lib/ons-firestore/version.rb +10 -0
- data/lib/ons-firestore.rb +3 -0
- metadata +105 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 86211db8e2182585d84762f6195444c9558cf20c880cd032dce29184ea166f47
|
|
4
|
+
data.tar.gz: 26bd51c53071774bba55547accaba38ab32f38dabafb6796949d96a1348c6321
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: f3ad8ca48f1f7273285f88e7cbdb1655a25dc999148aadca18552cb510d9058bb7021975ff5da1877ec552c1abbcaaf56b692a41dd21245df780824e9da74179
|
|
7
|
+
data.tar.gz: ca74cb6ba7a354ba7c0e2808891b75e8ee310fc7d10d96fa3888b5364392a5a710c9512fcae7bd689f39f5a9f2a9fe3a4718dfccce0497adbe867c7f7fd2aabb
|
data/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# ONS Firestore RubyGem
|
|
2
|
+
An opionated abstraction for reading and writing [Google Firestore](https://cloud.google.com/firestore) documents. Note that this gem targets Ruby 3.0 and above.
|
|
3
|
+
|
|
4
|
+
## Installation
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
gem install ons-firestore
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Examples
|
|
11
|
+
|
|
12
|
+
```ruby
|
|
13
|
+
require 'ons-firestore'
|
|
14
|
+
|
|
15
|
+
firestore = Firestore.new('my-project')
|
|
16
|
+
doc = firestore.read_document('cities', 'London')
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Licence
|
|
20
|
+
|
|
21
|
+
This library is licensed under the MIT licence. Full licence text is available in [LICENCE](LICENCE).
|
|
22
|
+
|
|
23
|
+
## Copyright
|
|
24
|
+
Copyright (C) 2022 Crown Copyright (Office for National Statistics)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'google/cloud/firestore'
|
|
4
|
+
require 'logger'
|
|
5
|
+
|
|
6
|
+
# Class to manage access to Firestore.
|
|
7
|
+
class Firestore
|
|
8
|
+
# Format to use for the timestamp of the +updated+ key within the Firestore document.
|
|
9
|
+
DATE_TIME_FORMAT = '%A %d %b %Y %H:%M:%S UTC'
|
|
10
|
+
|
|
11
|
+
# Constructor that initialises the Firestore client.
|
|
12
|
+
#
|
|
13
|
+
# Params:
|
|
14
|
+
# - project_id: The ID of the GCP project containing the Firestore database.
|
|
15
|
+
#
|
|
16
|
+
# An Argument error is raised if project_id is nil.
|
|
17
|
+
def initialize(project_id)
|
|
18
|
+
raise ArgumentError.new('project_id cannot be nil') if project_id.nil?
|
|
19
|
+
|
|
20
|
+
Google::Cloud::Firestore.configure { |config| config.project_id = project_id }
|
|
21
|
+
@client = Google::Cloud::Firestore.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Reads a Firestore document.
|
|
25
|
+
#
|
|
26
|
+
# Params:
|
|
27
|
+
# - collection_name: The name of the Firestore collection containing the document.
|
|
28
|
+
# - document_name: The name of the Firestore document.
|
|
29
|
+
#
|
|
30
|
+
# An Argument error is raised if collection_name or document_name are nil.
|
|
31
|
+
def read_document(collection_name, document_name)
|
|
32
|
+
raise ArgumentError.new('collection_name cannot be nil') if collection_name.nil?
|
|
33
|
+
raise ArgumentError.new('document_name cannot be nil') if document_name.nil?
|
|
34
|
+
|
|
35
|
+
document = @client.col(collection_name).doc(document_name)
|
|
36
|
+
snapshot = document.get
|
|
37
|
+
snapshot[:data]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Saves a Firestore document, overwriting any existing document with the same name.
|
|
41
|
+
#
|
|
42
|
+
# The passed data are saved under a +data+ key within the document.
|
|
43
|
+
# A timestamp at which the operation occurred is saved under the +updated+ key within the document.
|
|
44
|
+
#
|
|
45
|
+
# Params:
|
|
46
|
+
# - collection_name: The name of the Firestore collection containing the document.
|
|
47
|
+
# - document_name: The name of the Firestore document.
|
|
48
|
+
# - data: Data to save to the Firestore document.
|
|
49
|
+
#
|
|
50
|
+
# An Argument error is raised if collection_name or document_name are nil.
|
|
51
|
+
def save_document(collection_name, document_name, data)
|
|
52
|
+
raise ArgumentError.new('collection_name cannot be nil') if collection_name.nil?
|
|
53
|
+
raise ArgumentError.new('document_name cannot be nil') if document_name.nil?
|
|
54
|
+
|
|
55
|
+
document = @client.col(collection_name).doc(document_name)
|
|
56
|
+
if data.is_a?(Array)
|
|
57
|
+
hash_data = []
|
|
58
|
+
data.each { |element| element.respond_to?(:to_h) ? hash_data << element.to_h : hash_data << element }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
if data.is_a?(Hash)
|
|
62
|
+
hash_data = {}
|
|
63
|
+
data.each do |key, value|
|
|
64
|
+
hash_data[key] = value.map(&:to_h)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
begin
|
|
69
|
+
document.set({ data: hash_data, updated: Time.now.strftime(DATE_TIME_FORMAT) })
|
|
70
|
+
rescue StandardError => e
|
|
71
|
+
logger = Logger.new($stderr)
|
|
72
|
+
logger.error("Failed to save Firestore document #{document_name} in collection #{collection_name}: #{e.message}")
|
|
73
|
+
logger.error(e.backtrace.join("\n"))
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ons-firestore
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- John Topley
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2022-04-25 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: google-cloud-firestore
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.6'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.6'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: bundler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '2.3'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.3'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rake
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '13.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '13.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '1.17'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '1.17'
|
|
69
|
+
description: 'An opionated abstraction for reading and writing Google Firestore documents.
|
|
70
|
+
|
|
71
|
+
'
|
|
72
|
+
email:
|
|
73
|
+
- john.topley@ons.gov.uk
|
|
74
|
+
executables: []
|
|
75
|
+
extensions: []
|
|
76
|
+
extra_rdoc_files: []
|
|
77
|
+
files:
|
|
78
|
+
- README.md
|
|
79
|
+
- lib/ons-firestore.rb
|
|
80
|
+
- lib/ons-firestore/firestore.rb
|
|
81
|
+
- lib/ons-firestore/version.rb
|
|
82
|
+
homepage: https://github.com/ONSdigital/ons-firestore
|
|
83
|
+
licenses:
|
|
84
|
+
- MIT
|
|
85
|
+
metadata: {}
|
|
86
|
+
post_install_message:
|
|
87
|
+
rdoc_options: []
|
|
88
|
+
require_paths:
|
|
89
|
+
- lib
|
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - ">="
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: 3.0.0
|
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
|
+
requirements:
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: '0'
|
|
100
|
+
requirements: []
|
|
101
|
+
rubygems_version: 3.3.3
|
|
102
|
+
signing_key:
|
|
103
|
+
specification_version: 4
|
|
104
|
+
summary: Opinionated Google Firestore abstraction.
|
|
105
|
+
test_files: []
|