gistkv 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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/gistkv.rb +87 -0
  3. metadata +123 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a06b85e8def052e7de2cd6bd0e4cbb84c94289277da2666fba15043cdfc84dd1
4
+ data.tar.gz: 69b1ab53daaaed71998d3fb66ea05cde799883e47f7bfe308f85403c1179573e
5
+ SHA512:
6
+ metadata.gz: b64d00a265ce18843be70901d16695da79073b3bf7e085b246b131a7285a091c1f7297442d355daf71c77893a398b27cc5fb7f7df4bfa0652415c96fc662b849
7
+ data.tar.gz: a6fef18a1ac8eec377f0fc3bcd3d21583edaf6c02ee83596e4b255faca144202120631095bb2cf7ae946f54091966d62f9c282a3bba9c762440fcbee47a7c067
data/lib/gistkv.rb ADDED
@@ -0,0 +1,87 @@
1
+ require 'faraday'
2
+ require 'faraday/net_http'
3
+ require 'json'
4
+
5
+ module GistKV
6
+ GIST_URL = "https://api.github.com/gists"
7
+ KV_FILE = "__gistkv.json"
8
+ GIST_BASE = {
9
+ "description" => "GistKV database",
10
+ "public" => false,
11
+ "files" => { "#{KV_FILE}" => { "content" => "{}" } }
12
+ }
13
+
14
+ class Client
15
+ attr_reader :read_only
16
+
17
+ def initialize(gist_id, auth = nil)
18
+ @gist_id = gist_id
19
+ @auth = auth
20
+ @read_only = @auth.nil?
21
+ headers = GistKV::Client.headers(@auth)
22
+ @conn = GistKV::Client.conn(headers)
23
+ end
24
+
25
+ def self.create_database(auth)
26
+ return if auth.nil?
27
+ headers = GistKV::Client.headers(auth)
28
+ res = GistKV::Client.conn(headers).post(nil, GIST_BASE)
29
+ res.body["id"] if res.body
30
+ end
31
+
32
+ def keys
33
+ get_gist.keys
34
+ end
35
+
36
+ def get(key)
37
+ get_gist[key.to_s]
38
+ end
39
+
40
+ alias_method :[], :get
41
+
42
+ def set(key, value)
43
+ return if @auth.nil?
44
+ gist = get_gist
45
+ gist[key.to_s] = value
46
+ patch_gist(gist)
47
+ value
48
+ end
49
+
50
+ alias_method :[]=, :set
51
+
52
+ def update(changes)
53
+ gist = get_gist
54
+ changes.each {|key,val| gist[key.to_s] = val }
55
+ patch_gist(gist)
56
+ changes
57
+ end
58
+
59
+ private
60
+
61
+ def get_gist
62
+ res = @conn.get("#{GIST_URL}/#{@gist_id}")
63
+ content = res.body.dig("files", KV_FILE, "content")
64
+ JSON.parse(content) if content
65
+ end
66
+
67
+ def patch_gist(content)
68
+ payload = { "files" => { "#{KV_FILE}" => { "content" => content.to_json } } }
69
+ @conn.patch("#{GIST_URL}/#{@gist_id}", payload)
70
+ nil
71
+ end
72
+
73
+ def self.headers(auth = nil)
74
+ headers = { "Accept" => "application/vnd.github+json" }
75
+ headers["Authorization"] = "token #{auth}" if auth
76
+ headers
77
+ end
78
+
79
+ def self.conn(headers)
80
+ Faraday.new(url: GIST_URL, headers: headers) do |f|
81
+ f.request :json
82
+ f.response :json
83
+ f.response :raise_error
84
+ end
85
+ end
86
+ end
87
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gistkv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jon Kulton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: simplecov
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 0.21.2
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '1'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.21.2
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '1'
53
+ - !ruby/object:Gem::Dependency
54
+ name: webmock
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '3'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '4'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '3'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '4'
73
+ - !ruby/object:Gem::Dependency
74
+ name: faraday
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '2'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '2'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '3'
93
+ description:
94
+ email: hello@jkulton.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - lib/gistkv.rb
100
+ homepage: https://github.com/jkulton/gistkv
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 3.0.0
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubygems_version: 3.3.7
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Use GitHub gists as simple key/value databases
123
+ test_files: []