Skip to content

Commit

Permalink
feat(prisma-fmt): Add source file path to datasource block too (#4932)
Browse files Browse the repository at this point in the history
* feat(prisma-fmt): Add source file path to datasource block too

Contribute to prisma/team-orm#1210

* Fix tests

* Fix tests

* Clippy, why are you like this
  • Loading branch information
SevInf committed Jun 20, 2024
1 parent bd07760 commit 9f3337c
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 37 deletions.
18 changes: 9 additions & 9 deletions prisma-fmt/src/get_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ mod tests {
});

let expected = expect![[
r#"{"config":{"generators":[{"name":"js","provider":{"fromEnvVar":null,"value":"prisma-client-js"},"output":null,"config":{},"binaryTargets":[],"previewFeatures":["prismaSchemaFolder"],"sourceFilePath":"generator.prisma"}],"datasources":[{"name":"db","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":null,"value":"postgresql://example.com/db"},"schemas":[]}],"warnings":[]},"errors":[]}"#
r#"{"config":{"generators":[{"name":"js","provider":{"fromEnvVar":null,"value":"prisma-client-js"},"output":null,"config":{},"binaryTargets":[],"previewFeatures":["prismaSchemaFolder"],"sourceFilePath":"generator.prisma"}],"datasources":[{"name":"db","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":null,"value":"postgresql://example.com/db"},"schemas":[],"sourceFilePath":"datasource.prisma"}],"warnings":[]},"errors":[]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -247,7 +247,7 @@ mod tests {
"prismaSchema": schema,
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST","value":null},"schemas":[]}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mEnvironment variable not found: NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:4\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 3 | \u001b[0m provider = \"postgresql\"\n\u001b[1;94m 4 | \u001b[0m url = \u001b[1;91menv(\"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST","value":null},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mEnvironment variable not found: NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:4\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 3 | \u001b[0m provider = \"postgresql\"\n\u001b[1;94m 4 | \u001b[0m url = \u001b[1;91menv(\"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -267,7 +267,7 @@ mod tests {
"ignoreEnvVarErrors": true,
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST","value":null},"schemas":[]}],"warnings":[]},"errors":[]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"NON_EXISTING_ENV_VAR_WE_COUNT_ON_IT_AT_LEAST","value":null},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -289,7 +289,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"schemas":[]}],"warnings":[]},"errors":[]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -312,7 +312,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"directUrl":{"fromEnvVar":null,"value":"postgresql://example.com/direct"},"schemas":[]}],"warnings":[]},"errors":[]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"directUrl":{"fromEnvVar":null,"value":"postgresql://example.com/direct"},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -336,7 +336,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"directUrl":{"fromEnvVar":"DBDIRURL","value":"postgresql://example.com/direct"},"schemas":[]}],"warnings":[]},"errors":[]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":"postgresql://example.com/mydb"},"directUrl":{"fromEnvVar":"DBDIRURL","value":"postgresql://example.com/direct"},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -359,7 +359,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":null,"value":""},"schemas":[]}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mError validating datasource `thedb`: You must provide a nonempty direct URL\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91m\"\"\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":null,"value":""},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mError validating datasource `thedb`: You must provide a nonempty direct URL\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91m\"\"\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -382,7 +382,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":"DOES_NOT_EXIST","value":null},"schemas":[]}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mEnvironment variable not found: DOES_NOT_EXIST.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91menv(\"DOES_NOT_EXIST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":"DOES_NOT_EXIST","value":null},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mEnvironment variable not found: DOES_NOT_EXIST.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91menv(\"DOES_NOT_EXIST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand All @@ -406,7 +406,7 @@ mod tests {
}
});
let expected = expect![[
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":"DOES_NOT_EXIST","value":null},"schemas":[]}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mError validating datasource `thedb`: You must provide a nonempty direct URL. The environment variable `DOES_NOT_EXIST` resolved to an empty string.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91menv(\"DOES_NOT_EXIST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
r#"{"config":{"generators":[],"datasources":[{"name":"thedb","provider":"postgresql","activeProvider":"postgresql","url":{"fromEnvVar":"DBURL","value":null},"directUrl":{"fromEnvVar":"DOES_NOT_EXIST","value":null},"schemas":[],"sourceFilePath":"schema.prisma"}],"warnings":[]},"errors":[{"file_name":"schema.prisma","message":"\u001b[1;91merror\u001b[0m: \u001b[1mError validating datasource `thedb`: You must provide a nonempty direct URL. The environment variable `DOES_NOT_EXIST` resolved to an empty string.\u001b[0m\n \u001b[1;94m-->\u001b[0m \u001b[4mschema.prisma:5\u001b[0m\n\u001b[1;94m | \u001b[0m\n\u001b[1;94m 4 | \u001b[0m url = env(\"DBURL\")\n\u001b[1;94m 5 | \u001b[0m directUrl = \u001b[1;91menv(\"DOES_NOT_EXIST\")\u001b[0m\n\u001b[1;94m | \u001b[0m\n"}]}"#
]];
let response = get_config(&request.to_string());
expected.assert_eq(&response);
Expand Down
2 changes: 1 addition & 1 deletion psl/psl-core/src/mcf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pub struct SerializeableMcf {
fn model_to_serializable(config: &crate::Configuration, files: &Files) -> SerializeableMcf {
SerializeableMcf {
generators: generator::generators_to_json_value(&config.generators, files),
datasources: source::render_sources_to_json_value(&config.datasources),
datasources: source::render_sources_to_json_value(&config.datasources, files),
warnings: config.warnings.iter().map(|f| f.message().to_owned()).collect(),
}
}
19 changes: 12 additions & 7 deletions psl/psl-core/src/mcf/source.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
use parser_database::Files;
use schema_ast::ast::WithSpan;

use crate::configuration::{self, StringFromEnvVar};

#[derive(Debug, serde::Serialize)]
Expand All @@ -12,29 +15,30 @@ pub struct SourceConfig {
pub schemas: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
pub source_file_path: String,
}

pub fn render_sources_to_json_value(sources: &[configuration::Datasource]) -> serde_json::Value {
let res = sources_to_json_structs(sources);
pub fn render_sources_to_json_value(sources: &[configuration::Datasource], files: &Files) -> serde_json::Value {
let res = sources_to_json_structs(sources, files);
serde_json::to_value(res).expect("Failed to render JSON.")
}

pub fn render_sources_to_json(sources: &[configuration::Datasource]) -> String {
let res = sources_to_json_structs(sources);
pub fn render_sources_to_json(sources: &[configuration::Datasource], files: &Files) -> String {
let res = sources_to_json_structs(sources, files);
serde_json::to_string_pretty(&res).expect("Failed to render JSON.")
}

fn sources_to_json_structs(sources: &[configuration::Datasource]) -> Vec<SourceConfig> {
fn sources_to_json_structs(sources: &[configuration::Datasource], files: &Files) -> Vec<SourceConfig> {
let mut res: Vec<SourceConfig> = Vec::new();

for source in sources {
res.push(source_to_json_struct(source));
res.push(source_to_json_struct(source, files));
}

res
}

fn source_to_json_struct(source: &configuration::Datasource) -> SourceConfig {
fn source_to_json_struct(source: &configuration::Datasource, files: &Files) -> SourceConfig {
let schemas: Vec<String> = source
.namespaces
.iter()
Expand All @@ -49,5 +53,6 @@ fn source_to_json_struct(source: &configuration::Datasource) -> SourceConfig {
direct_url: source.direct_url.clone(),
documentation: source.documentation.clone(),
schemas,
source_file_path: files[source.span().file_id].0.clone(),
}
}
11 changes: 10 additions & 1 deletion psl/psl/tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pub(crate) use ::indoc::{formatdoc, indoc};
pub(crate) use asserts::*;
pub(crate) use expect_test::expect;

use psl::Configuration;
use psl::{parse_configuration_multi_file, Configuration, SourceFile};

pub(crate) fn reformat(input: &str) -> String {
psl::reformat(input, 2).unwrap_or_else(|| input.to_owned())
Expand Down Expand Up @@ -36,6 +36,15 @@ pub(crate) fn parse_configuration(datamodel_string: &str) -> Configuration {
}
}

#[track_caller]
pub(crate) fn render_datasources(datamodel_string: &str) -> String {
let src = SourceFile::new_allocated(datamodel_string.to_owned().into_boxed_str().into());
match parse_configuration_multi_file(&[("schema.prisma".into(), src)]) {
Ok((files, config)) => psl::get_config::render_sources_to_json(&config.datasources, &files),
Err((files, errors)) => panic!("Schema parsing failed:\n\n{}", files.render_diagnostics(&errors)),
}
}

#[track_caller]
pub(crate) fn expect_error(schema: &str, expectation: &expect_test::Expect) {
match psl::parse_schema(schema) {
Expand Down
25 changes: 12 additions & 13 deletions psl/psl/tests/config/datasources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ fn serialize_builtin_sources_to_dmmf() {
"fromEnvVar": null,
"value": "postgresql://localhost/postgres1"
},
"schemas": []
"schemas": [],
"sourceFilePath": "schema.prisma"
}
]"#]];

expect.assert_eq(&render_schema_json(schema));
expect.assert_eq(&render_datasources(schema));

let schema = indoc! {r#"
datasource pg2 {
Expand All @@ -63,11 +64,12 @@ fn serialize_builtin_sources_to_dmmf() {
"fromEnvVar": "pg2",
"value": null
},
"schemas": []
"schemas": [],
"sourceFilePath": "schema.prisma"
}
]"#]];

expect.assert_eq(&render_schema_json(schema));
expect.assert_eq(&render_datasources(schema));

let schema = indoc! {r#"
datasource sqlite1 {
Expand All @@ -86,11 +88,12 @@ fn serialize_builtin_sources_to_dmmf() {
"fromEnvVar": null,
"value": "file://file.db"
},
"schemas": []
"schemas": [],
"sourceFilePath": "schema.prisma"
}
]"#]];

expect.assert_eq(&render_schema_json(schema));
expect.assert_eq(&render_datasources(schema));

let schema = indoc! {r#"
datasource mysql1 {
Expand All @@ -109,11 +112,12 @@ fn serialize_builtin_sources_to_dmmf() {
"fromEnvVar": null,
"value": "mysql://localhost"
},
"schemas": []
"schemas": [],
"sourceFilePath": "schema.prisma"
}
]"#]];

expect.assert_eq(&render_schema_json(schema));
expect.assert_eq(&render_datasources(schema));
}

#[test]
Expand Down Expand Up @@ -272,11 +276,6 @@ fn schemas_array_without_preview_feature_should_error() {
expect_error(schema, &expect);
}

fn render_schema_json(schema: &str) -> String {
let config = parse_configuration(schema);
psl::get_config::render_sources_to_json(&config.datasources)
}

#[test]
fn parse_direct_url_should_work() {
let schema = indoc! {r#"
Expand Down
12 changes: 6 additions & 6 deletions psl/psl/tests/config/sources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -396,8 +396,7 @@ fn new_lines_in_source_must_work() {
}
"#};

let config = parse_configuration(schema);
let rendered = psl::render_sources_to_json(&config.datasources);
let rendered = render_datasources(schema);

let expected = expect![[r#"
[
Expand All @@ -409,7 +408,8 @@ fn new_lines_in_source_must_work() {
"fromEnvVar": null,
"value": "postgresql://localhost"
},
"schemas": []
"schemas": [],
"sourceFilePath": "schema.prisma"
}
]"#]];

Expand All @@ -431,8 +431,7 @@ fn multischema_must_work() {
}
"#};

let config = parse_configuration(schema);
let rendered = psl::render_sources_to_json(&config.datasources);
let rendered = render_datasources(schema);

// schemas are sorted in ascending order
let expected = expect![[r#"
Expand All @@ -448,7 +447,8 @@ fn multischema_must_work() {
"schemas": [
"public",
"transactional"
]
],
"sourceFilePath": "schema.prisma"
}
]"#]];

Expand Down

0 comments on commit 9f3337c

Please sign in to comment.