hypershield 0.5.1 → 0.6.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: e98e57d104b0806c9e066fd885b90f79879feb86796be24d88ff7d8c434b9146
4
- data.tar.gz: 414ef3140f273f2668302edd4b6c49f10720ca8a88c070eeb4cf09100a4b734b
3
+ metadata.gz: b6ecd356af71a6dcfcc090e7a77ff942d4bdedef2da1eaefe194c9b0f92cf7e0
4
+ data.tar.gz: 0f4af74bfe94e4848f0da087a30d0031c2da72b18219fca7e5c5d943c05b37f7
5
5
  SHA512:
6
- metadata.gz: f308e251a24d11e3189cff94f846514bff39f14a6896a55e0ccfe53e7f671e3e69001b24f223575a163d54655e761b46818d6584da77c508947e9d93320a8a85
7
- data.tar.gz: 14261989078513cc393460e4fa2d27bb2ba157e1e496baa64dfe8323ed86a431f69f3a7291dab81ae337d82e36c39e58afb33471ad22ea9e3e7980376756db8b
6
+ metadata.gz: defa8e62d56cfb81fbf06df39b35d85103d24b2763b14be7f9e711b0867f29c0833a775da5b2f27c5a12a921bf11571dd9e417d0242cb81c71a497197b286585
7
+ data.tar.gz: 3d2e07ddb85d84a80f02cf2a5da12c6b12f98b3e852c4ea7856fbde8f9314cc789f1742c9f978acae831b9195d32866bfa812e59d06d6b0910cbe304d70d4f2d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.6.1 (2026-05-23)
2
+
3
+ - Added `materialized_views` option
4
+
5
+ ## 0.6.0 (2026-04-14)
6
+
7
+ - Dropped support for Ruby < 3.3 and Rails < 7.2
8
+
1
9
  ## 0.5.1 (2025-04-26)
2
10
 
3
11
  - Added support for Trilogy
data/README.md CHANGED
@@ -129,6 +129,12 @@ Enable or disable Hypershield in an environment
129
129
  Hypershield.enabled = Rails.env.production?
130
130
  ```
131
131
 
132
+ Include materialized views for Postgres
133
+
134
+ ```ruby
135
+ Hypershield.materialized_views = true
136
+ ```
137
+
132
138
  ## History
133
139
 
134
140
  View the [changelog](CHANGELOG.md)
@@ -1,3 +1,3 @@
1
1
  module Hypershield
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.1"
3
3
  end
data/lib/hypershield.rb CHANGED
@@ -10,9 +10,10 @@ require_relative "hypershield/engine" if defined?(Rails)
10
10
 
11
11
  module Hypershield
12
12
  class << self
13
- attr_accessor :enabled, :log_sql, :schemas
13
+ attr_accessor :enabled, :materialized_views, :log_sql, :schemas
14
14
  end
15
15
  self.enabled = true
16
+ self.materialized_views = false
16
17
  self.log_sql = false
17
18
  self.schemas = {
18
19
  hypershield: {
@@ -107,6 +108,10 @@ module Hypershield
107
108
  adapter_name.match?(/mysql|trilogy/i)
108
109
  end
109
110
 
111
+ def postgresql?
112
+ adapter_name.match?(/postg/i)
113
+ end
114
+
110
115
  def tables(schema = nil)
111
116
  if schema
112
117
  schema = quote(schema)
@@ -119,23 +124,43 @@ module Hypershield
119
124
  end
120
125
  end
121
126
 
122
- query = <<-SQL
127
+ query = <<~SQL
123
128
  SELECT
124
129
  table_name,
125
130
  column_name,
126
- ordinal_position,
127
- data_type
131
+ ordinal_position
128
132
  FROM
129
133
  information_schema.columns
130
134
  WHERE
131
- table_schema = #{schema}
135
+ table_schema = %{schema}
132
136
  SQL
133
137
 
134
- select_all(query.squish)
138
+ if materialized_views && postgresql?
139
+ query += <<~SQL
140
+ UNION ALL
141
+ SELECT
142
+ c.relname AS table_name,
143
+ a.attname AS column_name,
144
+ a.attnum AS ordinal_position
145
+ FROM
146
+ pg_attribute a
147
+ INNER JOIN
148
+ pg_class c ON a.attrelid = c.oid
149
+ INNER JOIN
150
+ pg_namespace n ON c.relnamespace = n.oid
151
+ WHERE
152
+ n.nspname = %{schema} AND
153
+ a.attnum > 0 AND
154
+ NOT a.attisdropped AND
155
+ c.relkind = 'm' AND
156
+ has_column_privilege(c.oid, a.attnum, 'SELECT')
157
+ SQL
158
+ end
159
+
160
+ select_all(query.squish % {schema: schema})
135
161
  .map { |c| c.transform_keys(&:downcase) }
136
162
  .group_by { |c| c["table_name"] }
137
- .map { |t, cs| [t, cs.sort_by { |c| c["ordinal_position"].to_i }.map { |c| c["column_name"] }] }
138
- .to_h
163
+ .to_h { |t, cs| [t, cs.sort_by { |c| c["ordinal_position"].to_i }.map { |c| c["column_name"] }] }
139
164
  end
140
165
 
141
166
  def select_all(sql)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hypershield
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '7.1'
18
+ version: '7.2'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '7.1'
25
+ version: '7.2'
26
26
  email: andrew@ankane.org
27
27
  executables: []
28
28
  extensions: []
@@ -49,14 +49,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
49
49
  requirements:
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: '3.2'
52
+ version: '3.3'
53
53
  required_rubygems_version: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  requirements: []
59
- rubygems_version: 3.6.7
59
+ rubygems_version: 4.0.10
60
60
  specification_version: 4
61
61
  summary: Shield sensitive data in Postgres and MySQL
62
62
  test_files: []