ons-firestore 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ONSFirestore
4
+ module Version
5
+ MAJOR = 1
6
+ MINOR = 0
7
+ TINY = 0
8
+ end
9
+ VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
10
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ons-firestore/firestore'
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: []