hypershield 0.6.0 → 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: 4e425a17360017a9217baf52168ecd222f9bdecf75cbbcf56f07fc6b68d7e209
4
- data.tar.gz: 076deb92c895ed1f899af7ac43c588ea31d8e37def75b1d97d91d5e50ca52936
3
+ metadata.gz: b6ecd356af71a6dcfcc090e7a77ff942d4bdedef2da1eaefe194c9b0f92cf7e0
4
+ data.tar.gz: 0f4af74bfe94e4848f0da087a30d0031c2da72b18219fca7e5c5d943c05b37f7
5
5
  SHA512:
6
- metadata.gz: b12d479061018b960312bfb9d2c9f688e2f0fc3989292189c3c49c21e9eefb6152ccbd0a017798c14e854206bb045b3ad39e02f66cf4ace1663b6e3b2e30da3d
7
- data.tar.gz: 4d74b975052da48e11ac4822faca31fcdb892c8f4a1359dbe2a2104980fbe54a896983179a3c1cb35ebd8ab508baf432abe9dd0af5f87763dc7f262842ce1e52
6
+ metadata.gz: defa8e62d56cfb81fbf06df39b35d85103d24b2763b14be7f9e711b0867f29c0833a775da5b2f27c5a12a921bf11571dd9e417d0242cb81c71a497197b286585
7
+ data.tar.gz: 3d2e07ddb85d84a80f02cf2a5da12c6b12f98b3e852c4ea7856fbde8f9314cc789f1742c9f978acae831b9195d32866bfa812e59d06d6b0910cbe304d70d4f2d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.6.1 (2026-05-23)
2
+
3
+ - Added `materialized_views` option
4
+
1
5
  ## 0.6.0 (2026-04-14)
2
6
 
3
7
  - Dropped support for Ruby < 3.3 and Rails < 7.2
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.6.0"
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)
@@ -123,19 +128,39 @@ module Hypershield
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.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  requirements: []
59
- rubygems_version: 4.0.6
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: []