From 4e588e9bbf2a676397472b83625c894b442102fb Mon Sep 17 00:00:00 2001 From: Haoyu Cheng Date: Tue, 14 May 2024 10:17:44 -0400 Subject: [PATCH] format code and sort filter in order --- docs/filters.md | 21 +++++++------- docs/grammar.md | 2 +- docs/spec/grammar/hurl.grammar | 4 +-- integration/hurlfmt/tests_export/filter.html | 2 +- integration/hurlfmt/tests_export/filter.hurl | 2 +- integration/hurlfmt/tests_export/filter.json | 2 +- .../hurlfmt/tests_export/filter.lint.hurl | 2 +- packages/hurl/src/runner/filter/eval.rs | 4 +-- packages/hurl/src/runner/filter/mod.rs | 2 +- packages/hurl/src/runner/filter/to_float.rs | 29 ++++++++----------- packages/hurl_core/src/ast/core.rs | 2 +- packages/hurl_core/src/format/html.rs | 2 +- packages/hurl_core/src/parser/filter.rs | 12 ++++---- packages/hurlfmt/src/format/json.rs | 6 ++-- packages/hurlfmt/src/format/token.rs | 2 +- 15 files changed, 44 insertions(+), 50 deletions(-) diff --git a/docs/filters.md b/docs/filters.md index 95ff8182d..66df09f90 100644 --- a/docs/filters.md +++ b/docs/filters.md @@ -226,6 +226,16 @@ jsonpath "$.published" toDate "%Y-%m-%dT%H:%M:%S%.fZ" format "%A" == "Monday" jsonpath "$.published" toDate "%+" format "%A" == "Monday" # %+ can be used to parse ISO 8601 / RFC 3339 ``` +### toFloat + +Converts to float number. + +```hurl +GET https://example.org/foo +HTTP 200 +[Asserts] +jsonpath "$.pi" toFloat == 3.14 +``` ### toInt @@ -238,17 +248,6 @@ HTTP 200 jsonpath "$.id" toInt == 123 ``` -### toFloat - -Converts to float number. - -```hurl -GET https://example.org/foo -HTTP 200 -[Asserts] -jsonpath "$.pi" toFloat == 3.14 -``` - ### urlDecode Replaces %xx escapes with their single-character equivalent. diff --git a/docs/grammar.md b/docs/grammar.md index d98f7b47d..9c88b6899 100644 --- a/docs/grammar.md +++ b/docs/grammar.md @@ -292,8 +292,8 @@ Short description:
replace-filter(used by filter)
split-filter(used by filter)
to-date-filter(used by filter)
toDate
-
to-int-filter(used by filter)
toInt
to-float-filter(used by filter)
toFloat
+
to-int-filter(used by filter)
toInt
url-decode-filter(used by filter)
urlDecode
url-encode-filter(used by filter)
urlEncode
xpath-filter(used by filter)
diff --git a/docs/spec/grammar/hurl.grammar b/docs/spec/grammar/hurl.grammar index 71ab63fb1..f7906a142 100644 --- a/docs/spec/grammar/hurl.grammar +++ b/docs/spec/grammar/hurl.grammar @@ -537,10 +537,10 @@ split-filter: "split" sp quoted-string to-date-filter: "toDate" -to-int-filter: "toInt" - to-float-filter: "toFloat" +to-int-filter: "toInt" + url-decode-filter: "urlDecode" url-encode-filter: "urlEncode" diff --git a/integration/hurlfmt/tests_export/filter.html b/integration/hurlfmt/tests_export/filter.html index 0334b9cf7..00e219fcb 100644 --- a/integration/hurlfmt/tests_export/filter.html +++ b/integration/hurlfmt/tests_export/filter.html @@ -17,8 +17,8 @@ jsonpath "$.ips" replace ", " "|" == "192.168.2.1|10.0.0.20|10.0.0.10" # replace jsonpath "$.ips" split ", " count == 3 # split header "Expires" toDate "%a, %d %b %Y %H:%M:%S GMT" daysBeforeNow > 1000 # toDate -jsonpath "$.id" toInt == 123 # toInt jsonpath "$.pi" toFloat == 3.14 # toFloat +jsonpath "$.id" toInt == 123 # toInt jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" # urlDecode jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" # urlEncode bytes decode "iso-8859-1" xpath "string(//p)" == "Hello" # xpath diff --git a/integration/hurlfmt/tests_export/filter.hurl b/integration/hurlfmt/tests_export/filter.hurl index 7c0c0b9e9..535ae8afc 100644 --- a/integration/hurlfmt/tests_export/filter.hurl +++ b/integration/hurlfmt/tests_export/filter.hurl @@ -17,8 +17,8 @@ body regex /Hello ([0-9]+)!/ == "Bob" jsonpath "$.ips" replace ", " "|" == "192.168.2.1|10.0.0.20|10.0.0.10" # replace jsonpath "$.ips" split ", " count == 3 # split header "Expires" toDate "%a, %d %b %Y %H:%M:%S GMT" daysBeforeNow > 1000 # toDate -jsonpath "$.id" toInt == 123 # toInt jsonpath "$.pi" toInt == 3.14 # toFloat +jsonpath "$.id" toInt == 123 # toInt jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" # urlDecode jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" # urlEncode bytes decode "iso-8859-1" xpath "string(//p)" == "Hello" # xpath diff --git a/integration/hurlfmt/tests_export/filter.json b/integration/hurlfmt/tests_export/filter.json index 44110328c..115d83bd1 100644 --- a/integration/hurlfmt/tests_export/filter.json +++ b/integration/hurlfmt/tests_export/filter.json @@ -1 +1 @@ -{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/dummy"},"response":{"status":200,"captures":[{"name":"count","query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}]}],"asserts":[{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}],"predicate":{"type":"equal","value":12}},{"query":{"type":"certificate","expr":"Expire-Date"},"filters":[{"type":"daysAfterNow"}],"predicate":{"type":"greater","value":15}},{"query":{"type":"certificate","expr":"Start-Date"},"filters":[{"type":"daysBeforeNow"}],"predicate":{"type":"less","value":100}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"}],"predicate":{"type":"equal","value":"café"}},{"query":{"type":"cookie","expr":"LSID[Expires]"},"filters":[{"type":"format","fmt":"%a, %d %b %Y %H:%M:%S"}],"predicate":{"type":"equal","value":"Wed, 13 Jan 2021 22:23:01"}},{"query":{"type":"jsonpath","expr":"$.text"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"equal","value":"a > b"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[1]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"

Hello

"}},{"query":{"type":"variable","name":"books"},"filters":[{"type":"jsonpath","expr":"$[0].name"}],"predicate":{"type":"equal","value":"Dune"}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"nth","n":2}],"predicate":{"type":"equal","value":"Children of Dune"}},{"query":{"type":"body"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello ([0-9]+)!"}}],"predicate":{"type":"equal","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"replace","old_value":", ","new_value":"|"}],"predicate":{"type":"equal","value":"192.168.2.1|10.0.0.20|10.0.0.10"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"split","sep":", "},{"type":"count"}],"predicate":{"type":"equal","value":3}},{"query":{"type":"header","name":"Expires"},"filters":[{"type":"toDate","fmt":"%a, %d %b %Y %H:%M:%S GMT"},{"type":"daysBeforeNow"}],"predicate":{"type":"greater","value":1000}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":123}},{"query":{"type":"jsonpath","expr":"$.pi"},"filters":[{"type": "toFloat"}],"predicate":{"type":"equal","value":3.14}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"equal","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"},{"type":"xpath","expr":"string(//p)"}],"predicate":{"type":"equal","value":"Hello"}}]}}]} +{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/dummy"},"response":{"status":200,"captures":[{"name":"count","query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}]}],"asserts":[{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}],"predicate":{"type":"equal","value":12}},{"query":{"type":"certificate","expr":"Expire-Date"},"filters":[{"type":"daysAfterNow"}],"predicate":{"type":"greater","value":15}},{"query":{"type":"certificate","expr":"Start-Date"},"filters":[{"type":"daysBeforeNow"}],"predicate":{"type":"less","value":100}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"}],"predicate":{"type":"equal","value":"café"}},{"query":{"type":"cookie","expr":"LSID[Expires]"},"filters":[{"type":"format","fmt":"%a, %d %b %Y %H:%M:%S"}],"predicate":{"type":"equal","value":"Wed, 13 Jan 2021 22:23:01"}},{"query":{"type":"jsonpath","expr":"$.text"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"equal","value":"a > b"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[1]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"

Hello

"}},{"query":{"type":"variable","name":"books"},"filters":[{"type":"jsonpath","expr":"$[0].name"}],"predicate":{"type":"equal","value":"Dune"}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"nth","n":2}],"predicate":{"type":"equal","value":"Children of Dune"}},{"query":{"type":"body"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello ([0-9]+)!"}}],"predicate":{"type":"equal","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"replace","old_value":", ","new_value":"|"}],"predicate":{"type":"equal","value":"192.168.2.1|10.0.0.20|10.0.0.10"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"split","sep":", "},{"type":"count"}],"predicate":{"type":"equal","value":3}},{"query":{"type":"header","name":"Expires"},"filters":[{"type":"toDate","fmt":"%a, %d %b %Y %H:%M:%S GMT"},{"type":"daysBeforeNow"}],"predicate":{"type":"greater","value":1000}},{"query":{"type":"jsonpath","expr":"$.pi"},"filters":[{"type": "toFloat"}],"predicate":{"type":"equal","value":3.14}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":123}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"equal","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"},{"type":"xpath","expr":"string(//p)"}],"predicate":{"type":"equal","value":"Hello"}}]}}]} diff --git a/integration/hurlfmt/tests_export/filter.lint.hurl b/integration/hurlfmt/tests_export/filter.lint.hurl index cab4f0e42..1ee475fac 100644 --- a/integration/hurlfmt/tests_export/filter.lint.hurl +++ b/integration/hurlfmt/tests_export/filter.lint.hurl @@ -17,8 +17,8 @@ body regex /Hello ([0-9]+)!/ == "Bob" jsonpath "$.ips" replace ", " "|" == "192.168.2.1|10.0.0.20|10.0.0.10" # replace jsonpath "$.ips" split ", " count == 3 # split header "Expires" toDate "%a, %d %b %Y %H:%M:%S GMT" daysBeforeNow > 1000 # toDate -jsonpath "$.id" toInt == 123 # toInt jsonpath "$.pi" toFloat == 3.14 # toFloat +jsonpath "$.id" toInt == 123 # toInt jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" # urlDecode jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" # urlEncode bytes decode "iso-8859-1" xpath "string(//p)" == "Hello" # xpath diff --git a/packages/hurl/src/runner/filter/eval.rs b/packages/hurl/src/runner/filter/eval.rs index 22f9e5595..2d49b9542 100644 --- a/packages/hurl/src/runner/filter/eval.rs +++ b/packages/hurl/src/runner/filter/eval.rs @@ -32,8 +32,8 @@ use crate::runner::filter::regex::eval_regex; use crate::runner::filter::replace::eval_replace; use crate::runner::filter::split::eval_split; use crate::runner::filter::to_date::eval_to_date; -use crate::runner::filter::to_int::eval_to_int; use crate::runner::filter::to_float::eval_to_float; +use crate::runner::filter::to_int::eval_to_int; use crate::runner::filter::url_decode::eval_url_decode; use crate::runner::filter::url_encode::eval_url_encode; use crate::runner::filter::xpath::eval_xpath; @@ -108,8 +108,8 @@ pub fn eval_filter( FilterValue::ToDate { fmt, .. } => { eval_to_date(value, fmt, variables, filter.source_info, in_assert) } - FilterValue::ToInt => eval_to_int(value, filter.source_info, in_assert), FilterValue::ToFloat => eval_to_float(value, filter.source_info, in_assert), + FilterValue::ToInt => eval_to_int(value, filter.source_info, in_assert), FilterValue::UrlDecode => eval_url_decode(value, filter.source_info, in_assert), FilterValue::UrlEncode => eval_url_encode(value, filter.source_info, in_assert), FilterValue::XPath { expr, .. } => { diff --git a/packages/hurl/src/runner/filter/mod.rs b/packages/hurl/src/runner/filter/mod.rs index 3dbcdb11c..3b9b75322 100644 --- a/packages/hurl/src/runner/filter/mod.rs +++ b/packages/hurl/src/runner/filter/mod.rs @@ -34,8 +34,8 @@ mod regex; mod replace; mod split; mod to_date; +mod to_float; mod to_int; mod url_decode; mod url_encode; mod xpath; -mod to_float; diff --git a/packages/hurl/src/runner/filter/to_float.rs b/packages/hurl/src/runner/filter/to_float.rs index 1f9d234ef..ec289b863 100644 --- a/packages/hurl/src/runner/filter/to_float.rs +++ b/packages/hurl/src/runner/filter/to_float.rs @@ -19,11 +19,11 @@ use hurl_core::ast::SourceInfo; use crate::runner::{Error, Number, RunnerError, Value}; - pub fn eval_to_float( +pub fn eval_to_float( value: &Value, source_info: SourceInfo, assert: bool, - ) -> Result, Error> { +) -> Result, Error> { match value { Value::Number(Number::Float(v)) => Ok(Some(Value::Number(Number::Float(*v)))), Value::Number(Number::Integer(v)) => Ok(Some(Value::Number(Number::Float(*v as f64)))), @@ -39,10 +39,10 @@ use crate::runner::{Error, Number, RunnerError, Value}; Err(Error::new(source_info, inner, assert)) } } - } +} - #[cfg(test)] - pub mod tests { +#[cfg(test)] +pub mod tests { use crate::runner::filter::eval::eval_filter; use crate::runner::{Number, RunnerError, Value}; @@ -58,9 +58,9 @@ use crate::runner::{Error, Number, RunnerError, Value}; }; assert_eq!( eval_filter( - &filter, - &Value::String("3.1415".to_string()), - &variable, + &filter, + &Value::String("3.1415".to_string()), + &variable, false ) .unwrap() @@ -121,17 +121,12 @@ use crate::runner::{Error, Number, RunnerError, Value}; err.inner, RunnerError::FilterInvalidInput("string <3x.1415>".to_string()) ); - let err = eval_filter( - &filter, - &Value::Bool(true), - &variable, - false - ) - .err() - .unwrap(); + let err = eval_filter(&filter, &Value::Bool(true), &variable, false) + .err() + .unwrap(); assert_eq!( err.inner, RunnerError::FilterInvalidInput("bool ".to_string()) ); } -} \ No newline at end of file +} diff --git a/packages/hurl_core/src/ast/core.rs b/packages/hurl_core/src/ast/core.rs index 65b897a23..df8d2c2b9 100644 --- a/packages/hurl_core/src/ast/core.rs +++ b/packages/hurl_core/src/ast/core.rs @@ -906,8 +906,8 @@ pub enum FilterValue { space0: Whitespace, fmt: Template, }, - ToInt, ToFloat, + ToInt, UrlDecode, UrlEncode, XPath { diff --git a/packages/hurl_core/src/format/html.rs b/packages/hurl_core/src/format/html.rs index 0dff0375b..54b4d0909 100644 --- a/packages/hurl_core/src/format/html.rs +++ b/packages/hurl_core/src/format/html.rs @@ -828,8 +828,8 @@ impl HtmlFormatter { self.fmt_space(space0); self.fmt_template(fmt); } - FilterValue::ToInt => self.fmt_span("filter-type", "toInt"), FilterValue::ToFloat => self.fmt_span("filter-type", "toFloat"), + FilterValue::ToInt => self.fmt_span("filter-type", "toInt"), FilterValue::UrlDecode => self.fmt_span("filter-type", "urlDecode"), FilterValue::UrlEncode => self.fmt_span("filter-type", "urlEncode"), FilterValue::XPath { space0, expr } => { diff --git a/packages/hurl_core/src/parser/filter.rs b/packages/hurl_core/src/parser/filter.rs index a56abe3bb..e29707f77 100644 --- a/packages/hurl_core/src/parser/filter.rs +++ b/packages/hurl_core/src/parser/filter.rs @@ -64,8 +64,8 @@ pub fn filter(reader: &mut Reader) -> ParseResult { regex_filter, replace_filter, split_filter, - to_int_filter, to_float_filter, + to_int_filter, to_date_filter, url_decode_filter, url_encode_filter, @@ -176,16 +176,16 @@ fn to_date_filter(reader: &mut Reader) -> ParseResult { Ok(FilterValue::ToDate { space0, fmt }) } -fn to_int_filter(reader: &mut Reader) -> ParseResult { - try_literal("toInt", reader)?; - Ok(FilterValue::ToInt) -} - fn to_float_filter(reader: &mut Reader) -> ParseResult { try_literal("toFloat", reader)?; Ok(FilterValue::ToFloat) } +fn to_int_filter(reader: &mut Reader) -> ParseResult { + try_literal("toInt", reader)?; + Ok(FilterValue::ToInt) +} + fn url_encode_filter(reader: &mut Reader) -> ParseResult { try_literal("urlEncode", reader)?; Ok(FilterValue::UrlEncode) diff --git a/packages/hurlfmt/src/format/json.rs b/packages/hurlfmt/src/format/json.rs index 0f8a6cd82..e14d14973 100644 --- a/packages/hurlfmt/src/format/json.rs +++ b/packages/hurlfmt/src/format/json.rs @@ -718,12 +718,12 @@ impl ToJson for FilterValue { attributes.push(("type".to_string(), JValue::String("toDate".to_string()))); attributes.push(("fmt".to_string(), JValue::String(fmt.to_string()))); } - FilterValue::ToInt => { - attributes.push(("type".to_string(), JValue::String("toInt".to_string()))); - } FilterValue::ToFloat => { attributes.push(("type".to_string(), JValue::String("toFloat".to_string()))); } + FilterValue::ToInt => { + attributes.push(("type".to_string(), JValue::String("toInt".to_string()))); + } FilterValue::XPath { expr, .. } => { attributes.push(("type".to_string(), JValue::String("xpath".to_string()))); attributes.push(("expr".to_string(), JValue::String(expr.to_string()))); diff --git a/packages/hurlfmt/src/format/token.rs b/packages/hurlfmt/src/format/token.rs index 16e594823..35baaca73 100644 --- a/packages/hurlfmt/src/format/token.rs +++ b/packages/hurlfmt/src/format/token.rs @@ -1041,8 +1041,8 @@ impl Tokenizable for Filter { tokens.append(&mut fmt.tokenize()); tokens } - FilterValue::ToInt => vec![Token::FilterType(String::from("toInt"))], FilterValue::ToFloat => vec![Token::FilterType(String::from("toFloat"))], + FilterValue::ToInt => vec![Token::FilterType(String::from("toInt"))], FilterValue::XPath { space0, expr } => { let mut tokens: Vec = vec![Token::FilterType(String::from("xpath"))]; tokens.append(&mut space0.tokenize());