jade-sql 0.4.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: 203373e2a0789908e800cda5e81acee5883edb436205ec016f281549451218cd
4
- data.tar.gz: 3338e7d2e8132fdf4ed4de0e8b53658d8a2cce64ee8f13394cc7dca53413906c
3
+ metadata.gz: dc57c65fc3061afaeaec95ab2027a6f60b5389f2e0af9ac3571cc0f731b1e77f
4
+ data.tar.gz: fe8b6a8678a40dbbcbda32baf96447783f3089aa0cd6ab6b3fbad200305b410f
5
5
  SHA512:
6
- metadata.gz: f5e68d85a8d74169946d1368aa91ef46fe99c05a6b3250a5f11b44cc0ee13f75c66b3e1a3bbe59febb9c63ebee3f32ea419396444dffb699fa239a211f943821
7
- data.tar.gz: 4ad41bf4b0b780a78b599bba48bd90f7b14a35dfd2564a38b8153bbeec8dd8a7abd77a08d6c43db9888df49096429702aa31d2a6ceebd606446023d729988dd7
6
+ metadata.gz: 59bcf23879be7c6e646bb4aa40c83529c54aec49f4274f8e197d828c6b4a5436ae148a270651881c616e04d00822ccc128cd268d68635e8b3e4f13b2e6b13fd7
7
+ data.tar.gz: 279cfe150ac241a333bd39fd97a12b5c8860bd8563a0e7a95a88a63dc722b4e9100708487f194feb974399d8d7695531a640e40c8cfebe846e5ff20a2235d962
@@ -66,11 +66,12 @@ module JadeSql
66
66
  Table = Data.define(:name, :columns, :pk_columns)
67
67
  Column = Data.define(:name, :jade_type, :nullable)
68
68
 
69
- def generate(sql, tables: nil, module_name: 'Schema')
69
+ def generate(sql, tables: nil, columns: nil, module_name: 'Schema')
70
70
  bodies = scan_table_bodies(sql)
71
71
  bodies = select_tables(bodies, tables) if tables
72
72
  pks = parse_pks(sql)
73
73
  parsed = bodies.map { |name, body| Table[name, parse_columns(body, name), pks[name] || []] }
74
+ parsed = select_columns(parsed, columns) if columns
74
75
  format(emit(parsed, module_name))
75
76
  end
76
77
 
@@ -107,6 +108,29 @@ module JadeSql
107
108
  bodies.select { |name, _| whitelist.include?(name) }
108
109
  end
109
110
 
111
+ # A schema generated for one domain carries only the columns that domain
112
+ # was granted, so a column it wasn't granted is absent from `Cols` and
113
+ # naming it is a type error rather than a review comment.
114
+ def select_columns(tables, whitelist)
115
+ tables.map do |t|
116
+ allowed = whitelist[t.name]
117
+ next t unless allowed
118
+
119
+ validate_columns!(t, allowed)
120
+
121
+ t.with(columns: t.columns.select { allowed.include?(it.name) })
122
+ end
123
+ end
124
+
125
+ def validate_columns!(table, allowed)
126
+ unknown = allowed - table.columns.map(&:name)
127
+ raise "Unknown column(s) on #{table.name}: #{unknown.join(', ')}" if unknown.any?
128
+
129
+ (table.pk_columns - allowed).then do
130
+ raise "#{table.name}: primary key #{it.join(', ')} must be selected" if it.any?
131
+ end
132
+ end
133
+
110
134
  def parse_columns(body, table_name)
111
135
  body
112
136
  .split("\n")
@@ -1,19 +1,38 @@
1
1
  require 'jade-sql/bin/generate_schema'
2
2
 
3
3
  namespace :jade do
4
- desc "Generate schema.jd from db/structure.sql (INPUT, OUTPUT, TABLES, MODULE)"
4
+ desc "Generate schema.jd from db/structure.sql (INPUT, OUTPUT, TABLES, COLUMNS, MODULE)"
5
5
  task :schema do
6
6
  input = ENV['INPUT'] || 'db/structure.sql'
7
7
  output = ENV['OUTPUT'] || 'app/jade/schema.jd'
8
8
  tables = ENV['TABLES']&.split(',')&.map(&:strip)&.reject(&:empty?)
9
+ columns = parse_columns_env(ENV['COLUMNS'])
9
10
  module_name = ENV['MODULE'] || 'Schema'
10
11
 
11
12
  FileUtils.mkdir_p(File.dirname(output))
12
13
  File.write(
13
14
  output,
14
- JadeSql::SchemaGenerator.generate(File.read(input), tables: tables, module_name: module_name),
15
+ JadeSql::SchemaGenerator.generate(
16
+ File.read(input), tables:, columns:, module_name:
17
+ ),
15
18
  )
16
19
 
17
20
  puts "wrote #{output}"
18
21
  end
22
+
23
+ # COLUMNS="patients:id,age;visits:id,seen_on" — tables separated by `;`,
24
+ # their columns by `,`. A table left out keeps all of its columns.
25
+ def parse_columns_env(raw)
26
+ return nil unless raw
27
+
28
+ raw
29
+ .split(';')
30
+ .reject { it.strip.empty? }
31
+ .to_h do
32
+ table, cols = it.split(':', 2)
33
+ raise "COLUMNS entry #{it.inspect} needs the form table:col,col" if cols.nil?
34
+
35
+ [table.strip, cols.split(',').map(&:strip).reject(&:empty?)]
36
+ end
37
+ end
19
38
  end
@@ -1,3 +1,3 @@
1
1
  module JadeSql
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.1'
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jade-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - agustin
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-06-17 00:00:00.000000000 Z
10
+ date: 2026-07-31 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: jade-lang
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.0
18
+ version: 0.3.0
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: 0.2.0
25
+ version: 0.3.0
26
26
  description: Query and mutation builders, schema generation from db/structure.sql,
27
27
  and an ActiveRecord-backed runtime for the Jade language. Renders typed queries
28
28
  to (String, List(Value)) and decodes rows into Jade structs.
@@ -60,7 +60,7 @@ require_paths:
60
60
  - lib
61
61
  required_ruby_version: !ruby/object:Gem::Requirement
62
62
  requirements:
63
- - - "~>"
63
+ - - ">="
64
64
  - !ruby/object:Gem::Version
65
65
  version: '3.4'
66
66
  required_rubygems_version: !ruby/object:Gem::Requirement