pg_examiner 0.5.0 → 0.5.1

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: 0f0b45d7de01a4c4c9eb219e9af2230c1be298054b0536532f0b8df59acfb975
4
- data.tar.gz: 480c34dce57910a34684d4628d59091c628cfc1c19d639609ce82f4f6642a1fa
3
+ metadata.gz: 97dbbbfede24a927c3f330b55b3ccf5df361d2fecd607fcd6a0567dfeb81ba00
4
+ data.tar.gz: f9dab98fdf931d26a2fb75d8e89f3b2ccd528fea1017619b618d154c697bdbbf
5
5
  SHA512:
6
- metadata.gz: aa526ad1672741dc313073398ddebc053fda99ea83cbe79e3fda05f66d96937ce28639e4e0fe86408520527ff897e35e00db44929fa73a74e63062e425567596
7
- data.tar.gz: 1a0a64fd9889d84d553a32c9bc8ff0e348b0460a94a1b4e782fd888c45598ebbafcb1405c10ff1538df1bb62575e09b148d2c1e1d92c15c7b18a985241e143b8
6
+ metadata.gz: 83409a8174c21bd6885f3cfc858fa6aba351188804ca235ac6e37f1d06316602dccddaae115f11e74f034ebd8d8e9b289c861841362904080bad10d375b11c42
7
+ data.tar.gz: da864e8f1ccdfdf7f014a2f56fa3657b35182c11e4d84b2017e30a7c79c7812847a3c214f042043902f7e85a960596b45c2bcc8d9934a825d81c872eae50b581
@@ -9,6 +9,7 @@ module PGExaminer
9
9
  "indexes" => "indexes",
10
10
  "constraints" => "constraints",
11
11
  "triggers" => "triggers",
12
+ "permissions" => "permissions",
12
13
  }
13
14
  end
14
15
 
@@ -43,6 +44,43 @@ module PGExaminer
43
44
  t['tgrelid'] == oid
44
45
  end.map{|row| Trigger.new(result, row, self)}.sort_by(&:name)
45
46
  end
47
+
48
+ def permissions
49
+ @permissions ||= begin
50
+ if acl = @row["relacl"]
51
+ acl[/^{(.*)}$/, 1].split(",").map{|acl| Permission.new(acl)}.sort_by(&:name)
52
+ else
53
+ []
54
+ end
55
+ end
56
+ end
57
+
58
+ class Permission < Base
59
+ attr_accessor :name, :grantor, :permissions
60
+
61
+ CHARS_TO_LABELS = {
62
+ "r" => "SELECT", # "read"
63
+ "w" => "UPDATE", # "write"
64
+ "a" => "INSERT", # "append"
65
+ "d" => "DELETE",
66
+ "D" => "TRUNCATE",
67
+ "x" => "REFERENCES",
68
+ "t" => "TRIGGER",
69
+ }.freeze
70
+
71
+ def initialize(acl)
72
+ @name, permissions = acl.split("=")
73
+ permissions, @grantor = permissions.split("/")
74
+ @permissions = permissions.split("").map{|char| CHARS_TO_LABELS.fetch(char)}
75
+ end
76
+
77
+ def diffable_methods
78
+ {
79
+ "grantor" => "grantor",
80
+ "permissions" => "permissions",
81
+ }
82
+ end
83
+ end
46
84
  end
47
85
  end
48
86
  end
@@ -64,7 +64,7 @@ module PGExaminer
64
64
  SQL
65
65
 
66
66
  @pg_class = load_table @pg_namespace.map{|ns| ns['oid']}, <<-SQL
67
- SELECT oid, relname AS name, relkind, relpersistence, reloptions, relnamespace
67
+ SELECT oid, relname AS name, relkind, relpersistence, reloptions, relnamespace, relacl
68
68
  FROM pg_class
69
69
  WHERE relnamespace IN (?)
70
70
  SQL
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PGExaminer
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.1'
5
5
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PGExaminer do
6
+ it "should be able to tell when roles have different permissions on tables" do
7
+ a = examine <<-SQL
8
+ CREATE ROLE user_1;
9
+
10
+ CREATE TABLE test_table (
11
+ id integer
12
+ );
13
+
14
+ GRANT SELECT ON test_table TO user_1;
15
+ SQL
16
+
17
+ b = examine <<-SQL
18
+ CREATE ROLE user_1;
19
+
20
+ CREATE TABLE test_table (
21
+ id integer
22
+ );
23
+
24
+ GRANT SELECT, UPDATE ON test_table TO user_1;
25
+ SQL
26
+
27
+ a.diff(b).should == {"schemas"=>{"public"=>{"tables"=>{"test_table"=>{"permissions"=>{"user_1"=>{"permissions"=>{["SELECT"]=>["SELECT", "UPDATE"]}}}}}}}}
28
+ end
29
+
30
+ it "should ignore inconsequential differences in permissions" do
31
+ a = examine <<-SQL
32
+ CREATE ROLE user_1;
33
+
34
+ CREATE TABLE test_table (
35
+ id integer
36
+ );
37
+
38
+ GRANT UPDATE, SELECT ON test_table TO user_1;
39
+ SQL
40
+
41
+ b = examine <<-SQL
42
+ CREATE ROLE user_1;
43
+
44
+ CREATE TABLE test_table (
45
+ id integer
46
+ );
47
+
48
+ GRANT SELECT, UPDATE ON test_table TO user_1;
49
+ SQL
50
+
51
+ a.diff(b).should == {}
52
+ end
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_examiner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Hanks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-23 00:00:00.000000000 Z
11
+ date: 2019-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -115,6 +115,7 @@ files:
115
115
  - spec/function_spec.rb
116
116
  - spec/index_spec.rb
117
117
  - spec/language_spec.rb
118
+ - spec/role_and_permissions_spec.rb
118
119
  - spec/schema_spec.rb
119
120
  - spec/sequence_spec.rb
120
121
  - spec/spec_helper.rb
@@ -150,6 +151,7 @@ test_files:
150
151
  - spec/function_spec.rb
151
152
  - spec/index_spec.rb
152
153
  - spec/language_spec.rb
154
+ - spec/role_and_permissions_spec.rb
153
155
  - spec/schema_spec.rb
154
156
  - spec/sequence_spec.rb
155
157
  - spec/spec_helper.rb