jade-sql 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/lib/jade-sql/bin/generate_schema.rb +25 -1
- data/lib/jade-sql/tasks.rake +21 -2
- data/lib/jade-sql/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: df48a8644fe4cc5364406e9e5c4fc306a325a8b8c1d74f67dffcea445e11ff7b
|
|
4
|
+
data.tar.gz: aeb330e8b520e3b7abe4dff3f815b961d0fc66754fe8ec650590fd005782e455
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4c78bfc6bf42a94222d5ea49812fdb592cad83850cf714ad412eda541ad933029a82b06dec6bca9a7206241ccb3657d9465f016481b9b4540cef59025c0c85b5
|
|
7
|
+
data.tar.gz: f2f6ba3266809cb49d32fc013966d74bb924e041bb32192d09dd938647f8226303e069c4829af4fab104b97b480ca6869415338ebab09cc1627a547025d378f3
|
|
@@ -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")
|
data/lib/jade-sql/tasks.rake
CHANGED
|
@@ -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(
|
|
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
|
data/lib/jade-sql/version.rb
CHANGED
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
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- agustin
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-
|
|
10
|
+
date: 2026-07-30 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.
|
|
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.
|
|
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.
|