crucible-emulator 0.1.0a2__tar.gz
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.
- crucible_emulator-0.1.0a2/.dockerignore +16 -0
- crucible_emulator-0.1.0a2/.github/CODEOWNERS +1 -0
- crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/bug_report.yml +43 -0
- crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/config.yml +5 -0
- crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/unsupported_feature.yml +33 -0
- crucible_emulator-0.1.0a2/.github/dependabot.yml +29 -0
- crucible_emulator-0.1.0a2/.github/workflows/ci.yml +194 -0
- crucible_emulator-0.1.0a2/.github/workflows/corpus-record.yml +100 -0
- crucible_emulator-0.1.0a2/.github/workflows/release.yml +96 -0
- crucible_emulator-0.1.0a2/.gitignore +13 -0
- crucible_emulator-0.1.0a2/.pre-commit-config.yaml +33 -0
- crucible_emulator-0.1.0a2/AGENTS.md +36 -0
- crucible_emulator-0.1.0a2/CHANGELOG.md +39 -0
- crucible_emulator-0.1.0a2/CODE_OF_CONDUCT.md +84 -0
- crucible_emulator-0.1.0a2/CONTRIBUTING.md +68 -0
- crucible_emulator-0.1.0a2/LICENSE +202 -0
- crucible_emulator-0.1.0a2/NOTICE +4 -0
- crucible_emulator-0.1.0a2/PKG-INFO +162 -0
- crucible_emulator-0.1.0a2/README.md +131 -0
- crucible_emulator-0.1.0a2/SECURITY.md +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/any_value.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_empty_input.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls_distinct.yaml +19 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls_order_limit_offset.yaml +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_null_element.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_order_by_limit_data.yaml +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_order_limit.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/countif.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/group_by_ordinal.yaml +19 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/string_agg.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_concat.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_length.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_length_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_subquery.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_to_string.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/array_to_string_null_text.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/generate_array.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/offset_out_of_range.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/offset_zero.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/array/safe_offset_out_of_range.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/anonymous_column_names.yaml +21 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/array_concat_operator_type.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/column_name_case_preserved.yaml +21 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/ctas_types.yaml +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/float_literal_is_float64.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_and_select_types.yaml +59 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_float_into_int64_error.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_int64_into_float64_coerces.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_string_literal_into_date.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/integer_literal_arithmetic_is_int64.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/numeric_literal_keeps_precision.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/numeric_multiplication_keeps_scale_9.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/select_star_keeps_stored_case.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/sum_int64_is_int64.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/sum_int64_overflow_error.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/table_name_is_case_sensitive.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/backbone/union_mismatched_columns.yaml +6 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_1e20_to_int64_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_0_1_to_numeric.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_1e30_to_numeric_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_halfway_to_int64_column.yaml +20 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_halfway_to_int64_literals.yaml +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_to_int.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_to_numeric_rounds_nine_places.yaml +19 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_nan_to_int64_error.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_negative_float_to_int.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_numeric_0_1_to_float64.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_numeric_to_int64_rounding.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_string_to_int.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/safe_cast_float.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast/safe_cast_invalid_string.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_compact_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_iso.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_leading_space.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_one_digit_fields.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_with_time_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_comma_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_decimal.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_empty_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_exponent.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_hex_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_inf.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_nan.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_neg_inf.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_padded_spaces.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_30_digits_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_decimal.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_exponent.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_nan_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_round_nine_places.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_round_nine_places_negative.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_compact.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_invalid_day_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_year_month.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_date_only.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_fraction_six.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_no_zone.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_not_a_time_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_offset.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_one_digit_fields.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_seven_fraction_digits_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_t_separator.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_utc_name.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_z_suffix.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_zone_name.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/conditional/greatest_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/conditional/if_null_condition.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/conditional/is_distinct_from_null.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/conditional/least_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/conditional/nullif.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_add_month_end.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_day.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_month.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_year.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_from_parts.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_from_timestamp.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_sub_month_end.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_trunc_month.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_trunc_week.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_diff_day_across_midnight.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_from_timestamp.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_sub_day.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/extract_dayofweek.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/extract_week_sunday_start.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/format_date.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/format_date_space_padded_day.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/generate_date_array.yaml +18 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/parse_date.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/safe_parse_timestamp_array_element.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_add_minute.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_diff_day.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_diff_hour.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_from_string.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_sub_hour.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/date_time/unix_seconds_array_element.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/array_with_null_element_in_result.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_empty_string_to_int64.yaml +13 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_exponent.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_hex.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_negative_hex.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_plus_sign.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_whitespace.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/div_by_zero_error.yaml +13 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/division_by_zero_from_data.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/ieee_divide_by_zero.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/int64_multiplication_overflow.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/mod_by_zero_error.yaml +13 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_in_result_is_empty.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_in_struct_is_empty.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_length_is_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/offset_negative.yaml +13 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/ordinal_out_of_range.yaml +13 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_cast_string_with_fraction_to_int64.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_divide_by_zero_with_data.yaml +19 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_ordinal_out_of_range.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_parse_json_valid.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_prefix_keeps_argument_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_prefix_suppresses_function_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/hash/farm_fingerprint.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/hash/to_hex_md5.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/hash/to_hex_sha256.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_extract_array.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_query_array.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_all_kinds.yaml +31 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_array.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_number.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_array.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_number.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_object.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_string.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/parse_json.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/safe_parse_json.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_bytes.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_000001.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_123.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_123456.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_none.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_float_whole.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_nan_infinity.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_null.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_integer.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_large.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_tiny.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_struct_field_case.yaml +21 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_000001.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_123.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_123456.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_5.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_none.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_000001.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_123.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_123456.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/abs.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/divide_by_zero_error.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/divide_integers.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/power.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/round_half.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/round_negative_half.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/round_numeric.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/math/safe_divide_by_zero.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/ordering/null_ordering_asc.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/ordering/null_ordering_desc.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/parse_date_of_regexp_extract_group.yaml +19 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_contains.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_all.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_empty_match.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_group.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_no_match.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_replace_all.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_replace_backreference.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/alter_table_add_column_if_not_exists.yaml +23 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/alter_table_set_options.yaml +18 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_month_partition.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_partition_cluster_options.yaml +24 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_range_bucket_partition.yaml +18 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/drop_table_then_select.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/insert_int64_array_into_float64_array.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/leading_json_comment.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_duplicate_source_match_error.yaml +20 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_keyed_updates_and_inserts.yaml +28 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_on_false_inserts.yaml +28 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/statements/view_with_options.yaml +16 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/concat_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/concat_operator_null.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/format.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/format_float_two_places.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/format_integer_and_string.yaml +18 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/format_null_argument.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/initcap.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/initcap_delimiters_array_element.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/length.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/lower.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/lower_dotted_capital_i.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/split.yaml +17 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/split_empty_string.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/starts_with.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/string_compare_collation.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/substr.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/substr_negative_position.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/to_hex.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/trim.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/trim_characters.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/string/upper.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/in_unnest.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/qualify.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/reserved_keyword_alias_error.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/scalar_subquery_unaliased.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/select_star_except.yaml +14 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/select_star_replace.yaml +18 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/unnest_struct_no_alias.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/syntax/unnest_with_offset.yaml +20 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_alias_wins_over_joined_column.yaml +33 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_offset_without_alias.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_struct_array_aliased.yaml +28 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_struct_array_cross_join.yaml +28 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_with_offset_from_data.yaml +23 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/window/lag.yaml +15 -0
- crucible_emulator-0.1.0a2/corpus/bigquery/window/last_value_ignore_nulls.yaml +18 -0
- crucible_emulator-0.1.0a2/docker/Dockerfile +45 -0
- crucible_emulator-0.1.0a2/docs/adr/0001-one-dialect-per-process.md +22 -0
- crucible_emulator-0.1.0a2/docs/adr/0002-namespace-mapping.md +35 -0
- crucible_emulator-0.1.0a2/docs/adr/0003-concurrency-and-transactions.md +25 -0
- crucible_emulator-0.1.0a2/docs/adr/0004-bigquery-jobs-synchronous.md +31 -0
- crucible_emulator-0.1.0a2/docs/adr/0005-storage-and-admin.md +18 -0
- crucible_emulator-0.1.0a2/docs/adr/0006-security-hardening.md +29 -0
- crucible_emulator-0.1.0a2/docs/adr/0007-starlette-not-fastapi.md +20 -0
- crucible_emulator-0.1.0a2/docs/adr/0008-sqlglot-pinning-and-dialect-generators.md +33 -0
- crucible_emulator-0.1.0a2/docs/adr/0009-unsupported-constructs-raise.md +18 -0
- crucible_emulator-0.1.0a2/docs/adr/0010-schema-aware-translation.md +34 -0
- crucible_emulator-0.1.0a2/docs/adr/0011-runtime-error-parity.md +49 -0
- crucible_emulator-0.1.0a2/docs/adr/0012-timezones.md +33 -0
- crucible_emulator-0.1.0a2/docs/adr/0013-corpus-format-and-recording.md +79 -0
- crucible_emulator-0.1.0a2/docs/adr/0014-type-mapping-and-canonical-values.md +82 -0
- crucible_emulator-0.1.0a2/docs/architecture.md +203 -0
- crucible_emulator-0.1.0a2/docs/client-compat.md +747 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/.gitignore +1 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/README.md +50 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/.gitignore +4 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/.user.yml +1 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/README.md +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/dbt_project.yml +32 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/macros/cents_to_dollars.sql +3 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/customers.sql +18 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/customers.yml +31 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/orders.sql +23 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/orders.yml +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/products.sql +22 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/products.yml +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_customers.sql +6 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_customers.yml +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_order_items.sql +6 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_order_items.yml +19 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_orders.sql +8 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_orders.yml +18 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_products.sql +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_products.yml +18 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/profiles.yml +12 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_customers.csv +13 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_order_items.csv +47 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_orders.csv +25 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_products.csv +7 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/tests/order_totals_are_not_negative.sql +4 -0
- crucible_emulator-0.1.0a2/examples/dbt-bigquery/requirements.txt +2 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/01_basic_query.py +55 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/02_tables.py +67 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/03_load_csv.py +72 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/04_errors.py +51 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/README.md +36 -0
- crucible_emulator-0.1.0a2/examples/python-bigquery/requirements.txt +1 -0
- crucible_emulator-0.1.0a2/pyproject.toml +101 -0
- crucible_emulator-0.1.0a2/scripts/check-corpus-verified.sh +11 -0
- crucible_emulator-0.1.0a2/src/crucible/__init__.py +5 -0
- crucible_emulator-0.1.0a2/src/crucible/cli.py +102 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/case.py +212 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/cli.py +175 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/record.py +230 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/record_api.py +645 -0
- crucible_emulator-0.1.0a2/src/crucible/corpus/runner.py +159 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/__init__.py +23 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/base.py +45 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/ddl.py +339 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/dialect.py +37 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/dml.py +203 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/errors.py +39 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/generator.py +136 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/keywords.py +106 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/metadata.py +96 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/statements.py +212 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/__init__.py +57 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/arrays.py +14 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/common.py +84 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/dates.py +279 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/errors.py +330 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/json.py +302 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/literals.py +74 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/regexp.py +72 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/safe.py +70 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/strings.py +258 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/unnest.py +153 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/translate.py +347 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/types.py +278 -0
- crucible_emulator-0.1.0a2/src/crucible/dialects/snowflake/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/__init__.py +24 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/catalog.py +156 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/engine.py +129 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/errors.py +99 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/pipeline.py +131 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/session.py +24 -0
- crucible_emulator-0.1.0a2/src/crucible/engine/types.py +26 -0
- crucible_emulator-0.1.0a2/src/crucible/py.typed +0 -0
- crucible_emulator-0.1.0a2/src/crucible/server/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/server/app.py +61 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/app.py +1058 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/encoding.py +225 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/errors.py +83 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/jobs.py +375 -0
- crucible_emulator-0.1.0a2/src/crucible/server/bigquery/load.py +390 -0
- crucible_emulator-0.1.0a2/src/crucible/server/snowflake/__init__.py +0 -0
- crucible_emulator-0.1.0a2/src/crucible/server/snowflake/app.py +48 -0
- crucible_emulator-0.1.0a2/tests/__init__.py +0 -0
- crucible_emulator-0.1.0a2/tests/clients/test_bigquery_client.py +261 -0
- crucible_emulator-0.1.0a2/tests/corpus/test_corpus.py +43 -0
- crucible_emulator-0.1.0a2/tests/corpus/test_corpus_wire.py +77 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/dbt_project.yml +9 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/customer_signups.sql +4 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/schema.yml +40 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/vip_customers.sql +5 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/vip_summary.sql +4 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/profiles.yml +14 -0
- crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/seeds/customers.csv +7 -0
- crucible_emulator-0.1.0a2/tests/dbt/test_dbt_bigquery.py +91 -0
- crucible_emulator-0.1.0a2/tests/fakes.py +41 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/00_datasets_insert.json +57 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/01_jobs_insert_ctas.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/02_jobs_get_ctas.json +394 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/03_jobs_insert_select.json +264 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/04_jobs_get_select.json +247 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/05_get_query_results.json +340 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/06_get_query_results_int64_timestamp.json +342 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/07_get_query_results_page_1.json +226 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/08_get_query_results_page_2.json +191 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/09_get_query_results_start_index.json +202 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/100_load_float_inf_nan_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/101_load_float_inf_nan_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/102_load_float_inf_nan_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/103_load_float_inf_nan_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/104_load_float_inf_nan_query_results.json +116 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/105_load_bad_value_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/106_load_bad_value_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/107_load_bad_value_jobs_get.json +97 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/108_load_bad_value_select_insert.json +78 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/109_load_bool_upper_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/10_get_query_results_wait.json +137 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/110_load_bool_upper_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/111_load_bool_upper_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/112_load_bool_upper_select_insert.json +190 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/113_load_bool_upper_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/114_load_bool_title_true_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/115_load_bool_title_true_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/116_load_bool_title_true_jobs_get.json +109 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/117_load_bool_title_true_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/118_load_bool_title_true_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/119_load_int_negative_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/11_jobs_query.json +71 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/120_load_int_negative_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/121_load_int_negative_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/122_load_int_negative_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/123_load_int_negative_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/124_load_int_plus_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/125_load_int_plus_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/126_load_int_plus_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/127_load_int_plus_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/128_load_int_plus_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/129_load_int_quoted_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/12_jobs_query_job_creation_optional.json +63 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/130_load_int_quoted_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/131_load_int_quoted_jobs_get.json +109 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/132_load_int_quoted_select_insert.json +190 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/133_load_int_quoted_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/134_load_ts_t_no_z_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/135_load_ts_t_no_z_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/136_load_ts_t_no_z_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/137_load_ts_t_no_z_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/138_load_ts_t_no_z_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/139_load_ts_fraction_3_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/13_tables_get.json +125 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/140_load_ts_fraction_3_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/141_load_ts_fraction_3_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/142_load_ts_fraction_3_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/143_load_ts_fraction_3_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/144_load_date_invalid_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/145_load_date_invalid_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/146_load_date_invalid_jobs_get.json +98 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/147_load_date_invalid_select_insert.json +78 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/148_load_numeric_many_digits_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/149_load_numeric_many_digits_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/14_tables_get_anonymous.json +142 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/150_load_numeric_many_digits_jobs_get.json +97 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/151_load_numeric_many_digits_select_insert.json +78 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/152_load_string_escaped_quote_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/153_load_string_escaped_quote_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/154_load_string_escaped_quote_jobs_get.json +109 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/155_load_string_escaped_quote_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/156_load_string_escaped_quote_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/157_load_crlf_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/158_load_crlf_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/159_load_crlf_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/15_tables_list.json +31 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/160_load_crlf_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/161_load_crlf_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/162_tables_patch_add_column.json +225 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/163_jobs_insert_runtime_error.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/164_jobs_get_runtime_error.json +84 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/165_get_query_results_runtime_error.json +28 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/166_jobs_query_syntax_error.json +37 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/167_tables_get_not_found.json +26 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/168_jobs_insert_conflict.json +43 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/169_datasets_insert_conflict.json +31 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/16_datasets_get.json +49 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/170_jobs_insert_partitioned_day.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/171_tables_get_partitioned_day.json +67 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/172_jobs_insert_partitioned_hour.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/173_tables_get_partitioned_hour.json +53 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/174_jobs_insert_partitioned_month.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/175_tables_get_partitioned_month.json +53 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/176_jobs_insert_partitioned_range.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/177_tables_get_partitioned_range.json +57 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/178_tables_list_partitioned.json +381 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/179_tables_delete.json +13 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/17_datasets_list.json +33 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/18_routines_list.json +13 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/19_tabledata_list.json +224 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/20_tabledata_list_page_1.json +110 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/21_tabledata_list_page_2.json +75 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/22_tabledata_list_start_index.json +86 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/23_tabledata_list_int64_timestamp.json +226 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/24_tabledata_list_anonymous.json +224 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/25_jobs_insert_dml.json +74 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/26_jobs_get_dml.json +278 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/27_load_baseline_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/28_load_baseline_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/29_load_baseline_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/30_load_baseline_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/31_load_baseline_query_results.json +116 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/32_load_empty_fields_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/33_load_empty_fields_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/34_load_empty_fields_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/35_load_empty_fields_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/36_load_empty_fields_query_results.json +116 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/37_load_bool_t_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/38_load_bool_t_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/39_load_bool_t_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/40_load_bool_t_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/41_load_bool_t_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/42_load_bool_1_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/43_load_bool_1_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/44_load_bool_1_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/45_load_bool_1_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/46_load_bool_1_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/47_load_bool_yes_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/48_load_bool_yes_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/49_load_bool_yes_jobs_get.json +110 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/50_load_bool_yes_select_insert.json +190 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/51_load_bool_yes_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/52_load_bool_mixed_case_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/53_load_bool_mixed_case_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/54_load_bool_mixed_case_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/55_load_bool_mixed_case_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/56_load_bool_mixed_case_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/57_load_ts_t_z_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/58_load_ts_t_z_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/59_load_ts_t_z_jobs_get.json +110 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/60_load_ts_t_z_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/61_load_ts_t_z_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/62_load_ts_utc_suffix_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/63_load_ts_utc_suffix_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/64_load_ts_utc_suffix_jobs_get.json +111 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/65_load_ts_utc_suffix_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/66_load_ts_utc_suffix_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/67_load_ts_offset_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/68_load_ts_offset_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/69_load_ts_offset_jobs_get.json +120 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/70_load_ts_offset_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/71_load_ts_offset_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/72_load_ts_epoch_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/73_load_ts_epoch_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/74_load_ts_epoch_jobs_get.json +109 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/75_load_ts_epoch_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/76_load_ts_epoch_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/77_load_ts_date_only_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/78_load_ts_date_only_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/79_load_ts_date_only_jobs_get.json +97 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/80_load_ts_date_only_select_insert.json +78 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/81_load_ts_slashes_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/82_load_ts_slashes_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/83_load_ts_slashes_jobs_get.json +110 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/84_load_ts_slashes_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/85_load_ts_slashes_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/86_load_date_one_digit_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/87_load_date_one_digit_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/88_load_date_one_digit_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/89_load_date_one_digit_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/90_load_date_one_digit_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/91_load_date_slashes_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/92_load_date_slashes_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/93_load_date_slashes_jobs_get.json +98 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/94_load_date_slashes_select_insert.json +78 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/95_load_numeric_exponent_initiate.json +65 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/96_load_numeric_exponent_upload.json +81 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/97_load_numeric_exponent_jobs_get.json +101 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/98_load_numeric_exponent_select_insert.json +183 -0
- crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/99_load_numeric_exponent_query_results.json +91 -0
- crucible_emulator-0.1.0a2/tests/unit/__init__.py +0 -0
- crucible_emulator-0.1.0a2/tests/unit/bigquery.py +41 -0
- crucible_emulator-0.1.0a2/tests/unit/conftest.py +11 -0
- crucible_emulator-0.1.0a2/tests/unit/redaction_samples/00_jobs_insert.json +46 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bigquery_backbone.py +306 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bigquery_fixtures.py +357 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bigquery_job_lifecycle.py +236 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bigquery_server.py +951 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_arrays_unnest.py +161 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_dates.py +265 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_errors_and_safe.py +248 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_json.py +88 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_load_csv.py +319 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_partitioning.py +66 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_regexp.py +90 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_statements.py +214 -0
- crucible_emulator-0.1.0a2/tests/unit/test_bq_strings.py +155 -0
- crucible_emulator-0.1.0a2/tests/unit/test_check_corpus_verified.py +59 -0
- crucible_emulator-0.1.0a2/tests/unit/test_corpus_case.py +196 -0
- crucible_emulator-0.1.0a2/tests/unit/test_corpus_record.py +444 -0
- crucible_emulator-0.1.0a2/tests/unit/test_corpus_runner.py +224 -0
- crucible_emulator-0.1.0a2/tests/unit/test_engine.py +220 -0
- crucible_emulator-0.1.0a2/tests/unit/test_fixture_redaction.py +207 -0
- crucible_emulator-0.1.0a2/tests/unit/test_record_api.py +298 -0
- crucible_emulator-0.1.0a2/tests/unit/test_release_workflow.py +34 -0
- crucible_emulator-0.1.0a2/tests/unit/test_server.py +61 -0
- crucible_emulator-0.1.0a2/uv.lock +1460 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @CallumWalterWhite
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Crucible returns a different result or error than real BigQuery, or crashes.
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for the report. Please do not include credentials, project IDs or private data.
|
|
9
|
+
For an "unsupported" error, use the "Unsupported feature" template instead.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: query
|
|
12
|
+
attributes:
|
|
13
|
+
label: Query or request
|
|
14
|
+
description: The smallest SQL (or API call) that shows the problem, with any CREATE TABLE / INSERT it needs.
|
|
15
|
+
render: sql
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: bigquery
|
|
20
|
+
attributes:
|
|
21
|
+
label: What real BigQuery returns
|
|
22
|
+
description: Rows, types or the exact error message. Say if you have not checked against BigQuery.
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: crucible
|
|
27
|
+
attributes:
|
|
28
|
+
label: What Crucible returns
|
|
29
|
+
description: Rows, types or the exact error message.
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: input
|
|
33
|
+
id: version
|
|
34
|
+
attributes:
|
|
35
|
+
label: Crucible version
|
|
36
|
+
description: The Docker tag or `pip show crucible-emulator` version, or the commit if built from source.
|
|
37
|
+
validations:
|
|
38
|
+
required: true
|
|
39
|
+
- type: input
|
|
40
|
+
id: client
|
|
41
|
+
attributes:
|
|
42
|
+
label: Client and version
|
|
43
|
+
description: For example google-cloud-bigquery 3.46.1, dbt-core 1.12.6 with dbt-bigquery 1.12.1, or curl.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Unsupported feature
|
|
2
|
+
description: Crucible answers "Not supported by Crucible" for something you need.
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Please do not include credentials, project IDs or private data.
|
|
9
|
+
- type: input
|
|
10
|
+
id: message
|
|
11
|
+
attributes:
|
|
12
|
+
label: Error message
|
|
13
|
+
description: The full "Not supported by Crucible ..." message.
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: textarea
|
|
17
|
+
id: query
|
|
18
|
+
attributes:
|
|
19
|
+
label: Query or request
|
|
20
|
+
description: The smallest SQL (or API call) that triggers it.
|
|
21
|
+
render: sql
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: expected
|
|
26
|
+
attributes:
|
|
27
|
+
label: What real BigQuery returns
|
|
28
|
+
description: The rows or result you expect, if you know them.
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: context
|
|
31
|
+
attributes:
|
|
32
|
+
label: Where you hit it
|
|
33
|
+
description: For example a dbt package or macro, a client method, or your own SQL.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "uv"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
groups:
|
|
8
|
+
minor-and-patch:
|
|
9
|
+
update-types:
|
|
10
|
+
- "minor"
|
|
11
|
+
- "patch"
|
|
12
|
+
- package-ecosystem: "github-actions"
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "weekly"
|
|
16
|
+
groups:
|
|
17
|
+
minor-and-patch:
|
|
18
|
+
update-types:
|
|
19
|
+
- "minor"
|
|
20
|
+
- "patch"
|
|
21
|
+
- package-ecosystem: "docker"
|
|
22
|
+
directory: "/docker"
|
|
23
|
+
schedule:
|
|
24
|
+
interval: "weekly"
|
|
25
|
+
groups:
|
|
26
|
+
minor-and-patch:
|
|
27
|
+
update-types:
|
|
28
|
+
- "minor"
|
|
29
|
+
- "patch"
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_call:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
runs-on: ubuntu-24.04
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
20
|
+
- run: uv sync --locked --all-extras --group dev
|
|
21
|
+
- run: uv run ruff check
|
|
22
|
+
- run: uv run ruff format --check
|
|
23
|
+
- run: uv run pyright
|
|
24
|
+
- run: uv run lint-imports
|
|
25
|
+
|
|
26
|
+
corpus-guard:
|
|
27
|
+
if: github.event_name == 'pull_request'
|
|
28
|
+
runs-on: ubuntu-24.04
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
31
|
+
with:
|
|
32
|
+
persist-credentials: false
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
- name: Only corpus-record/ branches may set verified true (ADR 0013)
|
|
35
|
+
env:
|
|
36
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
37
|
+
HEAD_REF: ${{ github.head_ref }}
|
|
38
|
+
run: scripts/check-corpus-verified.sh "$BASE_SHA" "$HEAD_REF"
|
|
39
|
+
|
|
40
|
+
test:
|
|
41
|
+
runs-on: ubuntu-24.04
|
|
42
|
+
strategy:
|
|
43
|
+
fail-fast: false
|
|
44
|
+
matrix:
|
|
45
|
+
python: ["3.11", "3.12", "3.13"]
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
48
|
+
with:
|
|
49
|
+
persist-credentials: false
|
|
50
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
51
|
+
- run: uv sync --locked --all-extras --python ${{ matrix.python }}
|
|
52
|
+
- run: uv run pytest
|
|
53
|
+
|
|
54
|
+
docker:
|
|
55
|
+
runs-on: ubuntu-24.04
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
58
|
+
with:
|
|
59
|
+
persist-credentials: false
|
|
60
|
+
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
|
|
61
|
+
- name: Build image
|
|
62
|
+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
63
|
+
with:
|
|
64
|
+
context: .
|
|
65
|
+
file: docker/Dockerfile
|
|
66
|
+
tags: crucible:ci
|
|
67
|
+
load: true
|
|
68
|
+
push: false
|
|
69
|
+
- name: Start emulators and wait for health
|
|
70
|
+
run: |
|
|
71
|
+
wait_for_health() { # <container> <port>
|
|
72
|
+
for _ in $(seq 60); do
|
|
73
|
+
if curl -fsS --max-time 2 "http://127.0.0.1:$2/_crucible/health" >/dev/null; then
|
|
74
|
+
echo "$1 healthy on port $2"
|
|
75
|
+
return 0
|
|
76
|
+
fi
|
|
77
|
+
sleep 1
|
|
78
|
+
done
|
|
79
|
+
echo "$1 not healthy after 60s" >&2
|
|
80
|
+
docker logs "$1" >&2 || true
|
|
81
|
+
return 1
|
|
82
|
+
}
|
|
83
|
+
# The image sets CRUCIBLE_HOST=0.0.0.0, so the server listens on all container interfaces.
|
|
84
|
+
docker run -d --name crucible-bigquery -p 127.0.0.1:9050:9050 \
|
|
85
|
+
crucible:ci serve --dialect bigquery --port 9050
|
|
86
|
+
docker run -d --name crucible-snowflake -p 127.0.0.1:8080:8080 \
|
|
87
|
+
crucible:ci serve --dialect snowflake --port 8080
|
|
88
|
+
wait_for_health crucible-bigquery 9050
|
|
89
|
+
wait_for_health crucible-snowflake 8080
|
|
90
|
+
|
|
91
|
+
clients:
|
|
92
|
+
needs: docker
|
|
93
|
+
runs-on: ubuntu-24.04
|
|
94
|
+
strategy:
|
|
95
|
+
fail-fast: false
|
|
96
|
+
matrix:
|
|
97
|
+
include:
|
|
98
|
+
- dialect: bigquery
|
|
99
|
+
port: 9050
|
|
100
|
+
client: google-cloud-bigquery==3.27.0
|
|
101
|
+
- dialect: bigquery
|
|
102
|
+
port: 9050
|
|
103
|
+
client: google-cloud-bigquery
|
|
104
|
+
steps:
|
|
105
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
106
|
+
with:
|
|
107
|
+
persist-credentials: false
|
|
108
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
109
|
+
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
|
|
110
|
+
- name: Build image
|
|
111
|
+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
112
|
+
with:
|
|
113
|
+
context: .
|
|
114
|
+
file: docker/Dockerfile
|
|
115
|
+
tags: crucible:ci
|
|
116
|
+
load: true
|
|
117
|
+
push: false
|
|
118
|
+
- name: Start emulator and wait for health
|
|
119
|
+
env:
|
|
120
|
+
DIALECT: ${{ matrix.dialect }}
|
|
121
|
+
PORT: ${{ matrix.port }}
|
|
122
|
+
run: |
|
|
123
|
+
docker run -d --name crucible -p "127.0.0.1:${PORT}:${PORT}" \
|
|
124
|
+
crucible:ci serve --dialect "$DIALECT" --port "$PORT"
|
|
125
|
+
for _ in $(seq 60); do
|
|
126
|
+
if curl -fsS --max-time 2 "http://127.0.0.1:${PORT}/_crucible/health" >/dev/null; then
|
|
127
|
+
echo "healthy on port ${PORT}"
|
|
128
|
+
exit 0
|
|
129
|
+
fi
|
|
130
|
+
sleep 1
|
|
131
|
+
done
|
|
132
|
+
echo "not healthy after 60s" >&2
|
|
133
|
+
docker logs crucible >&2 || true
|
|
134
|
+
exit 1
|
|
135
|
+
- name: Run official client tests
|
|
136
|
+
env:
|
|
137
|
+
CLIENT_SPEC: ${{ matrix.client }}
|
|
138
|
+
DIALECT: ${{ matrix.dialect }}
|
|
139
|
+
CRUCIBLE_URL: http://127.0.0.1:${{ matrix.port }}
|
|
140
|
+
run: uv run --with "$CLIENT_SPEC" pytest -m clients tests/clients -k "$DIALECT"
|
|
141
|
+
|
|
142
|
+
dbt:
|
|
143
|
+
needs: docker
|
|
144
|
+
runs-on: ubuntu-24.04
|
|
145
|
+
strategy:
|
|
146
|
+
fail-fast: false
|
|
147
|
+
matrix:
|
|
148
|
+
include:
|
|
149
|
+
- dialect: bigquery
|
|
150
|
+
port: 9050
|
|
151
|
+
core: dbt-core==1.9.11
|
|
152
|
+
adapter: dbt-bigquery==1.9.0
|
|
153
|
+
- dialect: bigquery
|
|
154
|
+
port: 9050
|
|
155
|
+
core: dbt-core
|
|
156
|
+
adapter: dbt-bigquery
|
|
157
|
+
steps:
|
|
158
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
159
|
+
with:
|
|
160
|
+
persist-credentials: false
|
|
161
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
162
|
+
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
|
|
163
|
+
- name: Build image
|
|
164
|
+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
165
|
+
with:
|
|
166
|
+
context: .
|
|
167
|
+
file: docker/Dockerfile
|
|
168
|
+
tags: crucible:ci
|
|
169
|
+
load: true
|
|
170
|
+
push: false
|
|
171
|
+
- name: Start emulator and wait for health
|
|
172
|
+
env:
|
|
173
|
+
DIALECT: ${{ matrix.dialect }}
|
|
174
|
+
PORT: ${{ matrix.port }}
|
|
175
|
+
run: |
|
|
176
|
+
docker run -d --name crucible -p "127.0.0.1:${PORT}:${PORT}" \
|
|
177
|
+
crucible:ci serve --dialect "$DIALECT" --port "$PORT"
|
|
178
|
+
for _ in $(seq 60); do
|
|
179
|
+
if curl -fsS --max-time 2 "http://127.0.0.1:${PORT}/_crucible/health" >/dev/null; then
|
|
180
|
+
echo "healthy on port ${PORT}"
|
|
181
|
+
exit 0
|
|
182
|
+
fi
|
|
183
|
+
sleep 1
|
|
184
|
+
done
|
|
185
|
+
echo "not healthy after 60s" >&2
|
|
186
|
+
docker logs crucible >&2 || true
|
|
187
|
+
exit 1
|
|
188
|
+
- name: Run dbt tests
|
|
189
|
+
env:
|
|
190
|
+
CORE_SPEC: ${{ matrix.core }}
|
|
191
|
+
ADAPTER_SPEC: ${{ matrix.adapter }}
|
|
192
|
+
DIALECT: ${{ matrix.dialect }}
|
|
193
|
+
CRUCIBLE_URL: http://127.0.0.1:${{ matrix.port }}
|
|
194
|
+
run: uv run --with "$CORE_SPEC" --with "$ADAPTER_SPEC" pytest -m dbt tests/dbt -k "$DIALECT"
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
name: Corpus record
|
|
2
|
+
|
|
3
|
+
# Records corpus cases against a real warehouse, which spends credits. Manual runs only.
|
|
4
|
+
on:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
inputs:
|
|
7
|
+
dialect:
|
|
8
|
+
description: Warehouse to record against
|
|
9
|
+
type: choice
|
|
10
|
+
options: [bigquery, snowflake]
|
|
11
|
+
required: true
|
|
12
|
+
path:
|
|
13
|
+
description: Directory for the recorded YAML. Empty means corpus/<dialect>
|
|
14
|
+
type: string
|
|
15
|
+
default: ""
|
|
16
|
+
max_bytes_billed:
|
|
17
|
+
description: BigQuery bytes-billed cap per query (ignored for Snowflake)
|
|
18
|
+
type: string
|
|
19
|
+
default: "104857600"
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
record:
|
|
26
|
+
if: github.repository == 'CallumWalterWhite/crucible'
|
|
27
|
+
runs-on: ubuntu-24.04
|
|
28
|
+
environment: corpus-record
|
|
29
|
+
permissions:
|
|
30
|
+
contents: write
|
|
31
|
+
pull-requests: write
|
|
32
|
+
id-token: write # Workload Identity Federation
|
|
33
|
+
env:
|
|
34
|
+
DIALECT: ${{ inputs.dialect }}
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
37
|
+
with:
|
|
38
|
+
persist-credentials: false
|
|
39
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
40
|
+
- name: Install dependencies for the dialect
|
|
41
|
+
run: uv sync --locked --extra "record-$DIALECT"
|
|
42
|
+
|
|
43
|
+
# Workload Identity Federation: no long-lived key. The provider and service account are
|
|
44
|
+
# repository variables, not secrets; the service account only needs BigQuery job and
|
|
45
|
+
# dataset create/delete rights in the sandbox project.
|
|
46
|
+
- name: Authenticate to Google Cloud
|
|
47
|
+
if: inputs.dialect == 'bigquery'
|
|
48
|
+
uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
|
|
49
|
+
with:
|
|
50
|
+
workload_identity_provider: ${{ vars.GCP_WORKLOAD_IDENTITY_PROVIDER }}
|
|
51
|
+
service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
|
|
52
|
+
|
|
53
|
+
- name: Set the BigQuery project
|
|
54
|
+
if: inputs.dialect == 'bigquery'
|
|
55
|
+
env:
|
|
56
|
+
BIGQUERY_PROJECT: ${{ vars.BIGQUERY_PROJECT }}
|
|
57
|
+
run: echo "BIGQUERY_PROJECT=$BIGQUERY_PROJECT" >> "$GITHUB_ENV"
|
|
58
|
+
|
|
59
|
+
# TODO(phase-5): move Snowflake to key-pair auth; password secrets are a stopgap.
|
|
60
|
+
- name: Write Snowflake credentials
|
|
61
|
+
if: inputs.dialect == 'snowflake'
|
|
62
|
+
env:
|
|
63
|
+
SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
|
|
64
|
+
SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
|
|
65
|
+
SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
|
|
66
|
+
SNOWFLAKE_WAREHOUSE: ${{ secrets.SNOWFLAKE_WAREHOUSE }}
|
|
67
|
+
run: |
|
|
68
|
+
set -euo pipefail
|
|
69
|
+
echo "::add-mask::$SNOWFLAKE_PASSWORD"
|
|
70
|
+
{
|
|
71
|
+
echo "SNOWFLAKE_ACCOUNT=$SNOWFLAKE_ACCOUNT"
|
|
72
|
+
echo "SNOWFLAKE_USER=$SNOWFLAKE_USER"
|
|
73
|
+
echo "SNOWFLAKE_PASSWORD=$SNOWFLAKE_PASSWORD"
|
|
74
|
+
echo "SNOWFLAKE_WAREHOUSE=$SNOWFLAKE_WAREHOUSE"
|
|
75
|
+
} >> "$GITHUB_ENV"
|
|
76
|
+
|
|
77
|
+
- name: Record corpus cases
|
|
78
|
+
env:
|
|
79
|
+
INPUT_PATH: ${{ inputs.path }}
|
|
80
|
+
MAX_BYTES: ${{ inputs.max_bytes_billed }}
|
|
81
|
+
run: |
|
|
82
|
+
set -euo pipefail
|
|
83
|
+
path="${INPUT_PATH:-corpus/$DIALECT}"
|
|
84
|
+
echo "CORPUS_PATH=$path" >> "$GITHUB_ENV"
|
|
85
|
+
uv run --no-sync crucible corpus record \
|
|
86
|
+
--dialect "$DIALECT" \
|
|
87
|
+
--path "$path" \
|
|
88
|
+
--max-bytes-billed "$MAX_BYTES" \
|
|
89
|
+
--i-understand-this-spends-credits
|
|
90
|
+
|
|
91
|
+
- name: Open pull request with recorded cases
|
|
92
|
+
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
|
|
93
|
+
with:
|
|
94
|
+
branch: corpus-record/${{ inputs.dialect }}
|
|
95
|
+
base: main
|
|
96
|
+
add-paths: ${{ env.CORPUS_PATH }}
|
|
97
|
+
commit-message: "corpus: record ${{ inputs.dialect }} cases"
|
|
98
|
+
title: "corpus: record ${{ inputs.dialect }} cases"
|
|
99
|
+
body: |
|
|
100
|
+
Recorded by workflow run ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
dry_run:
|
|
9
|
+
description: Build everything but publish nothing
|
|
10
|
+
type: boolean
|
|
11
|
+
default: true
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: release-${{ github.ref }}
|
|
18
|
+
cancel-in-progress: false
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
checks:
|
|
22
|
+
uses: ./.github/workflows/ci.yml
|
|
23
|
+
|
|
24
|
+
build:
|
|
25
|
+
runs-on: ubuntu-24.04
|
|
26
|
+
outputs:
|
|
27
|
+
version: ${{ steps.version.outputs.version }}
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
30
|
+
with:
|
|
31
|
+
persist-credentials: false
|
|
32
|
+
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
|
|
33
|
+
- name: Read package version
|
|
34
|
+
id: version
|
|
35
|
+
run: echo "version=$(uv version --short)" >> "$GITHUB_OUTPUT"
|
|
36
|
+
- name: Validate release tag
|
|
37
|
+
if: github.event_name == 'push' || inputs.dry_run == false
|
|
38
|
+
env:
|
|
39
|
+
PACKAGE_VERSION: ${{ steps.version.outputs.version }}
|
|
40
|
+
run: |
|
|
41
|
+
test "$GITHUB_REF_TYPE" = tag
|
|
42
|
+
test "$GITHUB_REF_NAME" = "v$PACKAGE_VERSION"
|
|
43
|
+
- run: uv build
|
|
44
|
+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
45
|
+
with:
|
|
46
|
+
name: dist
|
|
47
|
+
path: dist/
|
|
48
|
+
|
|
49
|
+
pypi:
|
|
50
|
+
needs: [build, checks]
|
|
51
|
+
if: vars.PYPI_PUBLISHING_ENABLED == 'true' && (github.event_name == 'push' || inputs.dry_run == false)
|
|
52
|
+
runs-on: ubuntu-24.04
|
|
53
|
+
environment: pypi
|
|
54
|
+
permissions:
|
|
55
|
+
id-token: write
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
58
|
+
with:
|
|
59
|
+
name: dist
|
|
60
|
+
path: dist/
|
|
61
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
62
|
+
|
|
63
|
+
image:
|
|
64
|
+
needs: [build, checks]
|
|
65
|
+
runs-on: ubuntu-24.04
|
|
66
|
+
permissions:
|
|
67
|
+
contents: read
|
|
68
|
+
packages: write
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
71
|
+
with:
|
|
72
|
+
persist-credentials: false
|
|
73
|
+
- uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4.4.0
|
|
74
|
+
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
|
|
75
|
+
- name: Log in to GitHub Container Registry
|
|
76
|
+
if: github.event_name == 'push' || inputs.dry_run == false
|
|
77
|
+
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
|
78
|
+
with:
|
|
79
|
+
registry: ghcr.io
|
|
80
|
+
username: ${{ github.actor }}
|
|
81
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
82
|
+
- name: Build and push image
|
|
83
|
+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
|
|
84
|
+
with:
|
|
85
|
+
context: .
|
|
86
|
+
file: docker/Dockerfile
|
|
87
|
+
platforms: linux/amd64,linux/arm64
|
|
88
|
+
push: ${{ github.event_name == 'push' || inputs.dry_run == false }}
|
|
89
|
+
tags: |
|
|
90
|
+
ghcr.io/callumwalterwhite/crucible-emulator:v${{ needs.build.outputs.version }}
|
|
91
|
+
ghcr.io/callumwalterwhite/crucible-emulator:latest
|
|
92
|
+
labels: |
|
|
93
|
+
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
|
94
|
+
org.opencontainers.image.version=${{ needs.build.outputs.version }}
|
|
95
|
+
org.opencontainers.image.revision=${{ github.sha }}
|
|
96
|
+
org.opencontainers.image.licenses=Apache-2.0
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Install once with `uv run pre-commit install`. CI runs the same ruff, pyright and import-linter checks.
|
|
2
|
+
repos:
|
|
3
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
4
|
+
rev: v6.0.0
|
|
5
|
+
hooks:
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: trailing-whitespace
|
|
8
|
+
- id: check-yaml
|
|
9
|
+
- id: check-toml
|
|
10
|
+
- id: check-added-large-files
|
|
11
|
+
|
|
12
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
13
|
+
rev: v0.17.0
|
|
14
|
+
hooks:
|
|
15
|
+
- id: ruff-check
|
|
16
|
+
args: [--fix]
|
|
17
|
+
- id: ruff-format
|
|
18
|
+
|
|
19
|
+
- repo: local
|
|
20
|
+
hooks:
|
|
21
|
+
- id: pyright
|
|
22
|
+
name: pyright
|
|
23
|
+
entry: uv run pyright
|
|
24
|
+
language: system
|
|
25
|
+
types: [python]
|
|
26
|
+
pass_filenames: false
|
|
27
|
+
|
|
28
|
+
- id: lint-imports
|
|
29
|
+
name: lint-imports
|
|
30
|
+
entry: uv run lint-imports
|
|
31
|
+
language: system
|
|
32
|
+
types: [python]
|
|
33
|
+
pass_filenames: false
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
Local BigQuery API emulator on DuckDB (Snowflake planned). Pre-alpha.
|
|
4
|
+
|
|
5
|
+
## Commands (use `uv run`)
|
|
6
|
+
|
|
7
|
+
Setup: `uv sync --all-extras` then `uv run pre-commit install`.
|
|
8
|
+
|
|
9
|
+
Pre-PR checks (same as CI `lint` job, in this order):
|
|
10
|
+
```sh
|
|
11
|
+
uv run ruff check
|
|
12
|
+
uv run ruff format --check
|
|
13
|
+
uv run pyright
|
|
14
|
+
uv run lint-imports
|
|
15
|
+
uv run pytest
|
|
16
|
+
```
|
|
17
|
+
Default `pytest` runs only `tests/unit` + `tests/corpus`. Single test: `uv run pytest <path> [-k name]`. Single corpus case without a server: `uv run crucible corpus run --dialect bigquery --path corpus/bigquery/<area>/<case>.yaml`.
|
|
18
|
+
|
|
19
|
+
`clients`/`dbt` suites need a running Docker image + `CRUCIBLE_URL` (see `.github/workflows/ci.yml`); don't run them locally by default. `serve` needs the `server` extra (`--all-extras` covers it).
|
|
20
|
+
|
|
21
|
+
## Architecture
|
|
22
|
+
|
|
23
|
+
Layers enforced by `import-linter` (`pyproject.toml`): `crucible.cli` → `crucible.server | crucible.corpus` → `crucible.dialects` → `crucible.engine`. `bigquery` and `snowflake` dialect packages never import each other; engine is warehouse-agnostic and sees dialects only via the `Dialect` protocol (type-checking only). Request flow: `server/<dialect>` → `engine.Pipeline` (`dialect.split` → `dialect.plan` → `SqlPlan | CommandPlan`) → `Result` → dialect types → wire response.
|
|
24
|
+
|
|
25
|
+
- `engine/`: `engine.py` (one DuckDB, UTC-pinned, cursor per request), `catalog.py` (quote all identifiers via `engine.catalog.quote()`), `session.py`, `pipeline.py`, `types.py`, `errors.py`.
|
|
26
|
+
- `dialects/<d>/`: `statements.py`, `translate.py` (schema-aware: qualify against live catalog, annotate, transform, generate with the dialect's own SQLGlot DuckDB-generator subclass), `ddl.py`, `dml.py`, `types.py`, `metadata.py`, `errors.py`, `dialect.py`.
|
|
27
|
+
- `dialects/<d>/transforms/`: one module per area; ordered list `PIPELINE` in `transforms/__init__.py` is the only ordering. Transforms run on the qualified type-annotated AST, must preserve `.type` on rebuilt nodes, and raise `CrucibleUnsupportedError` for anything inexact.
|
|
28
|
+
- `server/`: one Starlette app per dialect per process. BigQuery `:9050`, Snowflake `:8080`, bind `127.0.0.1` by default (`CRUCIBLE_HOST=0.0.0.0` only inside Docker). Health: `GET /_crucible/health`. Unknown endpoints return the warehouse's "not implemented" shape, never a generic 404. Never expose on a network — no auth by design.
|
|
29
|
+
|
|
30
|
+
## Rules that fail CI or waste money
|
|
31
|
+
|
|
32
|
+
- **Unsupported means explicit.** Never return a best guess; raise `CrucibleUnsupportedError` (mapped to the warehouse error at the server edge). `docs/architecture.md` + ADRs are design truth; `CONTRIBUTING.md` has the workflow.
|
|
33
|
+
- **Corpus is the proof.** Cases live in `corpus/<dialect>/<area>/<case>.yaml`. Never hand-set `verified: true` or `recorded_at` — only `crucible corpus record` writes them, and CI (`scripts/check-corpus-verified.sh`) fails any PR outside `corpus-record/*` that adds `verified: true`. Contributors never run `record`/`record-api` (spends real warehouse credits, requires `--max-bytes-billed` + `--i-understand-this-spends-credits`, maintainers only).
|
|
34
|
+
- **Every response shape needs a one-line comment** citing the client source or official API doc. Upstream SQLGlot bugs go upstream; keep only a local workaround with a comment linking the upstream PR.
|
|
35
|
+
- **Exact pins** `sqlglot==30.22.0`, `duckdb==1.5.6` are deliberate (ADR 0008) — do not loosen. `pytz` is a core dep (DuckDB needs it for TZ values). Python 3.11–3.13; `pyright` is `strict` on `src` only; ruff line-length 100.
|
|
36
|
+
- **`docs/compatibility.md` is generated** from corpus/client results — never hand-edit. Wire fixtures in `tests/fixtures/bigquery_api/` are redacted in code before writing.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project does not yet follow semantic versioning.
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0a2] - 2026-10-20
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Multipart uploads (`uploadType=multipart`) for CSV load jobs, used by dbt Fusion for seeds.
|
|
15
|
+
- CSV loads accept the BOOL spellings `True` and `False`, as written by Python tools.
|
|
16
|
+
- `examples/dbt-bigquery`: an original dbt project with seeds, views, tables, data tests and unit tests.
|
|
17
|
+
- README sections on supported dbt versions, current limits and alternatives.
|
|
18
|
+
- Issue templates for bug reports and unsupported features.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- The Python client examples moved to `examples/python-bigquery`.
|
|
23
|
+
- The project is described as a BigQuery emulator, with Snowflake planned.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- `crucible corpus record-api` now removes stale fixtures with three-digit numbers.
|
|
28
|
+
- Time travel (`FOR SYSTEM_TIME AS OF`) and functions DuckDB lacks (such as `ST_*`) raise
|
|
29
|
+
`Not supported by Crucible` instead of a DuckDB parser or catalog error.
|
|
30
|
+
|
|
31
|
+
## [0.1.0a1] - 2026-10-17
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Initial project scaffolding.
|
|
36
|
+
- BigQuery translation backbone: schema-aware translation, output types from the BigQuery AST,
|
|
37
|
+
BigQuery literal typing, NUMERIC as DECIMAL(38,9), CREATE TABLE and INSERT with BigQuery coercion.
|
|
38
|
+
- BigQuery error parity, SAFE., function fixes, UNNEST, ARRAY_AGG and the statements dbt emits.
|
|
39
|
+
- `crucible corpus record-api`: redacted wire-format fixtures from the real BigQuery REST API.
|