glean-parser 18.2.0__tar.gz → 19.0.0__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.
Files changed (148) hide show
  1. {glean_parser-18.2.0 → glean_parser-19.0.0}/PKG-INFO +2 -2
  2. {glean_parser-18.2.0 → glean_parser-19.0.0}/README.md +1 -1
  3. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/__main__.py +3 -54
  4. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/go_server.py +8 -1
  5. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/lint.py +12 -4
  6. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/schemas/metrics.2-0-0.schema.yaml +3 -2
  7. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/schemas/pings.2-0-0.schema.yaml +2 -2
  8. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/go_server.jinja2 +1 -1
  9. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/javascript_server.jinja2 +1 -1
  10. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/python_server.jinja2 +24 -15
  11. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/ruby_server.jinja2 +1 -1
  12. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/rust_server.jinja2 +3 -3
  13. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/conftest.py +3 -1
  14. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_custom_ping_only_compare.go +1 -1
  15. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_custom_ping_only_compare.rs +3 -3
  16. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_events_and_custom_ping_compare.go +1 -1
  17. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_events_and_custom_ping_compare.rs +3 -3
  18. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_events_compare.rb +1 -1
  19. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_events_only_compare.go +1 -1
  20. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_events_only_compare.rs +3 -3
  21. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-py/test.py +4 -0
  22. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_kotlin.py +3 -3
  23. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_lint.py +14 -11
  24. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_parser.py +16 -4
  25. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_python_server.py +24 -23
  26. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_swift.py +2 -7
  27. glean_parser-18.2.0/glean_parser/coverage.py +0 -140
  28. {glean_parser-18.2.0 → glean_parser-19.0.0}/.gitignore +0 -0
  29. {glean_parser-18.2.0 → glean_parser-19.0.0}/AUTHORS.md +0 -0
  30. {glean_parser-18.2.0 → glean_parser-19.0.0}/LICENSE +0 -0
  31. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/__init__.py +0 -0
  32. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/data_review.py +0 -0
  33. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/javascript.py +0 -0
  34. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/javascript_server.py +0 -0
  35. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/kotlin.py +0 -0
  36. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/markdown.py +0 -0
  37. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/metrics.py +0 -0
  38. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/parser.py +0 -0
  39. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/pings.py +0 -0
  40. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/python_server.py +0 -0
  41. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/ruby_server.py +0 -0
  42. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/rust.py +0 -0
  43. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/rust_server.py +0 -0
  44. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/schemas/metrics.1-0-0.schema.yaml +0 -0
  45. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/schemas/pings.1-0-0.schema.yaml +0 -0
  46. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/schemas/tags.1-0-0.schema.yaml +0 -0
  47. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/swift.py +0 -0
  48. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/tags.py +0 -0
  49. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/data_review.jinja2 +0 -0
  50. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/javascript.buildinfo.jinja2 +0 -0
  51. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/javascript.jinja2 +0 -0
  52. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/kotlin.buildinfo.jinja2 +0 -0
  53. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/kotlin.jinja2 +0 -0
  54. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/markdown.jinja2 +0 -0
  55. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/qmldir.jinja2 +0 -0
  56. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/rust.jinja2 +0 -0
  57. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/templates/swift.jinja2 +0 -0
  58. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/translate.py +0 -0
  59. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/translation_options.py +0 -0
  60. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/util.py +0 -0
  61. {glean_parser-18.2.0 → glean_parser-19.0.0}/glean_parser/validate_ping.py +0 -0
  62. {glean_parser-18.2.0 → glean_parser-19.0.0}/pyproject.toml +0 -0
  63. {glean_parser-18.2.0 → glean_parser-19.0.0}/server_telemetry/sdk-metrics-compat.yaml +0 -0
  64. {glean_parser-18.2.0 → glean_parser-19.0.0}/server_telemetry/server-side-pings.yaml +0 -0
  65. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/all_metrics.yaml +0 -0
  66. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/all_pings.yaml +0 -0
  67. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/attribution.yaml +0 -0
  68. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/bad_attribution.yamlx +0 -0
  69. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/bad_ping.yamlx +0 -0
  70. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/core.yaml +0 -0
  71. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/custom_ping_no_event_metrics.yaml +0 -0
  72. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/custom_ping_no_event_pings.yaml +0 -0
  73. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/dual_labeled.yaml +0 -0
  74. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/dual_labeled_invalid.yaml +0 -0
  75. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/duplicate_labeled.yaml +0 -0
  76. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/duplicate_send_in_ping.yaml +0 -0
  77. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/empty.yaml +0 -0
  78. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/event_key_ordering.yaml +0 -0
  79. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/events_data_sensitivity.yaml +0 -0
  80. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/events_with_types.yaml +0 -0
  81. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/fxa-server-metrics.yaml +0 -0
  82. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/fxa-server-pings.yaml +0 -0
  83. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_custom_ping_only_metrics.yaml +0 -0
  84. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_custom_ping_only_pings.yaml +0 -0
  85. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_events_and_custom_ping_metrics.yaml +0 -0
  86. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_events_and_custom_ping_pings.yaml +0 -0
  87. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_events_only_metrics.yaml +0 -0
  88. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/go_server_metrics_unsupported.yaml +0 -0
  89. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/invalid-ping-names.yaml +0 -0
  90. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/invalid.yamlx +0 -0
  91. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/jwe.yaml +0 -0
  92. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/metric-with-tags.yaml +0 -0
  93. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/mixed-expirations.yaml +0 -0
  94. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/name_too_similar.yaml +0 -0
  95. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/object.yaml +0 -0
  96. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/old_event_api.yamlx +0 -0
  97. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/ordering.yaml +0 -0
  98. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/pings.yaml +0 -0
  99. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/python_server_metrics_unsupported.yaml +0 -0
  100. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rate.yaml +0 -0
  101. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/redefined_category.yamlx +0 -0
  102. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/redefined_metric.yamlx +0 -0
  103. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/redefined_ping.yamlx +0 -0
  104. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/reserved_categories.yamlx +0 -0
  105. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/ruby_server_metrics_unsupported.yaml +0 -0
  106. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/ruby_server_pings_unsupported.yaml +0 -0
  107. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_custom_ping_only_metrics.yaml +0 -0
  108. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_custom_ping_only_pings.yaml +0 -0
  109. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_events_and_custom_ping_metrics.yaml +0 -0
  110. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_events_and_custom_ping_pings.yaml +0 -0
  111. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_events_only_metrics.yaml +0 -0
  112. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/rust_server_metrics_unsupported.yaml +0 -0
  113. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/same_name_different_category.yaml +0 -0
  114. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/schema-violation.yaml +0 -0
  115. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/send_if_empty_with_metrics.yaml +0 -0
  116. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_metrics_no_events_no_pings.yaml +0 -0
  117. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_metrics_with_event.yaml +0 -0
  118. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/server_pings.yaml +0 -0
  119. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/single_labeled.yaml +0 -0
  120. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/smaller.yaml +0 -0
  121. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/tags.yaml +0 -0
  122. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/telemetry_mirror.yaml +0 -0
  123. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/text.yaml +0 -0
  124. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/text_invalid.yaml +0 -0
  125. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/unknown_ping_used.yaml +0 -0
  126. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/wrong_key.yamlx +0 -0
  127. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/data/yaml_nits.yamlx +0 -0
  128. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/detekt.yml +0 -0
  129. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-go/test.go.tmpl +0 -0
  130. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-js/package.json +0 -0
  131. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-js/test.js.tmpl +0 -0
  132. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-rb/test.rb.tmpl +0 -0
  133. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test-rs/test.rs.tmpl +0 -0
  134. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_cli.py +0 -0
  135. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_go_server.py +0 -0
  136. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_javascript.py +0 -0
  137. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_javascript_server.py +0 -0
  138. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_markdown.py +0 -0
  139. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_metrics.py +0 -0
  140. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_pings.py +0 -0
  141. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_ruby_server.py +0 -0
  142. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_rust.py +0 -0
  143. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_rust_server.py +0 -0
  144. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_tags.py +0 -0
  145. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_translate.py +0 -0
  146. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_utils.py +0 -0
  147. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/test_validate_ping.py +0 -0
  148. {glean_parser-18.2.0 → glean_parser-19.0.0}/tests/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: glean-parser
3
- Version: 18.2.0
3
+ Version: 19.0.0
4
4
  Summary: Parser tools for Mozilla's Glean telemetry
5
5
  Project-URL: Homepage, https://mozilla.github.io/glean
6
6
  Project-URL: Repository, https://github.com/mozilla/glean_parser
@@ -34,7 +34,7 @@ Parser tools for Mozilla's Glean telemetry.
34
34
 
35
35
  Contains various utilities for handling `metrics.yaml` and `pings.yaml` for [the
36
36
  Glean SDKs](https://mozilla.github.io/glean). This includes producing generated
37
- code for various integrations, linting and coverage testing.
37
+ code for various integrations and linting.
38
38
 
39
39
  ## Documentation
40
40
 
@@ -6,7 +6,7 @@ Parser tools for Mozilla's Glean telemetry.
6
6
 
7
7
  Contains various utilities for handling `metrics.yaml` and `pings.yaml` for [the
8
8
  Glean SDKs](https://mozilla.github.io/glean). This includes producing generated
9
- code for various integrations, linting and coverage testing.
9
+ code for various integrations and linting.
10
10
 
11
11
  ## Documentation
12
12
 
@@ -18,7 +18,6 @@ import json
18
18
  import glean_parser
19
19
 
20
20
 
21
- from . import coverage as mod_coverage
22
21
  from . import data_review as mod_data_review
23
22
  from . import lint
24
23
  from . import translate as mod_translate
@@ -172,7 +171,9 @@ def check(schema):
172
171
  type=click.INT,
173
172
  required=False,
174
173
  )
175
- def glinter(input, allow_reserved, allow_missing_files, require_tags, expire_by_version):
174
+ def glinter(
175
+ input, allow_reserved, allow_missing_files, require_tags, expire_by_version
176
+ ):
176
177
  """
177
178
  Runs a linter over the metrics.
178
179
  """
@@ -250,57 +251,6 @@ def dump(input, allow_reserved, allow_missing_files, require_tags):
250
251
  )
251
252
 
252
253
 
253
- @click.command()
254
- @click.option(
255
- "-c",
256
- "--coverage_file",
257
- type=click.Path(exists=True, dir_okay=False, file_okay=True, readable=True),
258
- required=True,
259
- multiple=True,
260
- )
261
- @click.argument(
262
- "metrics_files",
263
- type=click.Path(exists=True, dir_okay=False, file_okay=True, readable=True),
264
- nargs=-1,
265
- )
266
- @click.option(
267
- "-o",
268
- "--output",
269
- type=click.Path(exists=False, dir_okay=False, file_okay=True, writable=True),
270
- required=True,
271
- )
272
- @click.option(
273
- "--format",
274
- "-f",
275
- type=click.Choice(list(mod_coverage.OUTPUTTERS.keys())),
276
- required=True,
277
- )
278
- @click.option(
279
- "--allow-reserved",
280
- is_flag=True,
281
- help=(
282
- "If provided, allow the use of reserved fields. "
283
- "Should only be set when building the Glean library itself."
284
- ),
285
- )
286
- def coverage(coverage_file, metrics_files, format, output, allow_reserved):
287
- """
288
- Produce a coverage analysis file given raw coverage output and a set of
289
- metrics.yaml files.
290
- """
291
- sys.exit(
292
- mod_coverage.coverage(
293
- [Path(x) for x in coverage_file],
294
- [Path(x) for x in metrics_files],
295
- format,
296
- Path(output),
297
- {
298
- "allow_reserved": allow_reserved,
299
- },
300
- )
301
- )
302
-
303
-
304
254
  @click.command()
305
255
  @click.argument("bug", type=str)
306
256
  @click.argument(
@@ -334,7 +284,6 @@ main.add_command(translate)
334
284
  main.add_command(check)
335
285
  main.add_command(glinter)
336
286
  main.add_command(dump)
337
- main.add_command(coverage)
338
287
  main.add_command(data_review_request, "data-review")
339
288
 
340
289
 
@@ -32,7 +32,14 @@ from . import util
32
32
 
33
33
  # Adding a metric here will require updating the `generate_metric_type` function
34
34
  # and require adjustments to `metrics` variables the the template.
35
- SUPPORTED_METRIC_TYPES = ["string", "quantity", "event", "datetime", "boolean", "string_list"]
35
+ SUPPORTED_METRIC_TYPES = [
36
+ "string",
37
+ "quantity",
38
+ "event",
39
+ "datetime",
40
+ "boolean",
41
+ "string_list",
42
+ ]
36
43
 
37
44
 
38
45
  def generate_ping_type_name(ping_name: str) -> str:
@@ -35,7 +35,7 @@ NitGenerator = Generator["GlinterNit", None, None]
35
35
 
36
36
 
37
37
  def noop(*args):
38
- """ A noop `LintGenerator`. Never yields a GlinterNit."""
38
+ """A noop `LintGenerator`. Never yields a GlinterNit."""
39
39
  return
40
40
  yield
41
41
 
@@ -307,8 +307,12 @@ def check_event_on_non_events_ping(
307
307
  An event metric should usually go on the `events` ping or a custom ping,
308
308
  not on a builtin ping.
309
309
  """
310
- disallowed_pings = set(pings.RESERVED_PING_NAMES) - {"default", "events"} | {"health"}
311
- if metric.type == "event" and any([ping in disallowed_pings for ping in metric.send_in_pings]):
310
+ disallowed_pings = set(pings.RESERVED_PING_NAMES) - {"default", "events"} | {
311
+ "health"
312
+ }
313
+ if metric.type == "event" and any(
314
+ [ping in disallowed_pings for ping in metric.send_in_pings]
315
+ ):
312
316
  yield (
313
317
  "An event metric should usually go on the `events` ping or a custom ping, "
314
318
  + "not on a builtin ping."
@@ -709,7 +713,11 @@ def lint_metrics(
709
713
 
710
714
  for check_name, (check_func, check_type) in METRIC_CHECKS.items():
711
715
  new_nits = list(check_func(metric, parser_config))
712
- if check_unused_lints and check_name in metric.no_lint and not len(new_nits):
716
+ if (
717
+ check_unused_lints
718
+ and check_name in metric.no_lint
719
+ and not len(new_nits)
720
+ ):
713
721
  nits.append(
714
722
  GlinterNit(
715
723
  "UNUSED_NO_LINT",
@@ -254,7 +254,7 @@ definitions:
254
254
 
255
255
  A list of bug URLs (e.g. Bugzilla and Github) that are relevant to
256
256
  this metric, e.g., tracking its original implementation or later
257
- changes to it.
257
+ changes to it, including renewals.
258
258
 
259
259
  Prior to version 2.0.0 of the schema, bugs could also be integers.
260
260
  type: array
@@ -268,7 +268,8 @@ definitions:
268
268
  description: |
269
269
  **Required.**
270
270
 
271
- A list of URIs to any data collection reviews relevant to the metric.
271
+ A list of URLs to any data collection reviews relevant to the metric.
272
+ This should also include links to data reviews for renewals.
272
273
  type: array
273
274
  items:
274
275
  type: string
@@ -168,7 +168,7 @@ additionalProperties:
168
168
  ping, e.g., tracking its original implementation or later changes to
169
169
  it.
170
170
 
171
- It must be a URI to a bug page in a tracker.
171
+ It must be a URL to a bug page in a tracker.
172
172
 
173
173
  Prior to version 2.0.0 of the schema, bugs could also be integers.
174
174
  type: array
@@ -182,7 +182,7 @@ additionalProperties:
182
182
  description: |
183
183
  **Required.**
184
184
 
185
- A list of URIs to any data collection reviews relevant to the ping.
185
+ A list of URLs to any data collection reviews relevant to the ping.
186
186
  type: array
187
187
  items:
188
188
  type: string
@@ -187,7 +187,7 @@ func newGleanEvent(category, name string, extra map[string]string) gleanEvent {
187
187
  return gleanEvent{
188
188
  Category: category,
189
189
  Name: name,
190
- Timestamp: time.Now().UnixMilli(),
190
+ Timestamp: 0,
191
191
  Extra: extra,
192
192
  }
193
193
  }
@@ -126,7 +126,7 @@ class {{ ping|event_class_name(metrics_by_type) }} {
126
126
  const now = new Date();
127
127
  const timestamp = now.toISOString();
128
128
  {% if 'event' in metrics_by_type %}
129
- event.timestamp = now.getTime();
129
+ event.timestamp = 0;
130
130
  {% endif %}
131
131
  const eventPayload = {
132
132
  metrics: {
@@ -35,29 +35,34 @@ class {{ ping|camelize }}ServerEventLogger:
35
35
 
36
36
  def record(
37
37
  self,
38
- user_agent: str,
39
- ip_address: str,
38
+ user_agent: str | None = None,
39
+ ip_address: str | None = None,
40
40
  {% for metric_type, metrics in metrics_by_type.items() %}
41
41
  {% if metric_type != 'event' %}
42
42
  {% for metric in metrics %}
43
- {{ metric.category }}_{{ metric.name }}: {{ metric.type|py_metric_type }},
43
+ {{ metric.category }}_{{ metric.name }}: {{ metric.type|py_metric_type }} | None = None,
44
44
  {% endfor %}
45
45
  {% endif %}
46
46
  {% endfor %}
47
- events: list[dict[str, Any]]
47
+ events: list[dict[str, Any]] | None = None,
48
48
  ) -> None:
49
49
  now = datetime.now(timezone.utc)
50
50
  timestamp = now.isoformat()
51
+ events = [] if events is None else events
51
52
  for event in events:
52
- event["timestamp"] = int(1000.0 * now.timestamp()) # Milliseconds since epoch
53
+ event["timestamp"] = 0
53
54
  event_payload = {
54
55
  "metrics": {
55
56
  {% for metric_type, metrics in metrics_by_type.items() %}
56
57
  {% if metric_type != 'event' %}
57
58
  "{{ metric_type }}": {
58
- {% for metric in metrics %}
59
- "{{ metric.category }}.{{ metric.name }}": {{ metric.category }}_{{ metric.name }},
60
- {% endfor %}
59
+ key: value
60
+ for key, value in [
61
+ {% for metric in metrics %}
62
+ ("{{ metric.category }}.{{ metric.name }}", {{ metric.category }}_{{ metric.name }}),
63
+ {% endfor %}
64
+ ]
65
+ if value is not None
61
66
  },
62
67
  {% endif %}
63
68
  {% endfor %}
@@ -117,17 +122,17 @@ class {{ ping|camelize }}ServerEventLogger:
117
122
  {% for event in metrics_by_type["event"] %}
118
123
  def {{ event|record_event_function_name }}(
119
124
  self,
120
- user_agent: str,
121
- ip_address: str,
125
+ user_agent: str | None = None,
126
+ ip_address: str | None = None,
122
127
  {% for metric_type, metrics in metrics_by_type.items() %}
123
128
  {% if metric_type != 'event' %}
124
129
  {% for metric in metrics %}
125
- {{ metric.category }}_{{ metric.name }}: {{ metric.type|py_metric_type }},
130
+ {{ metric.category }}_{{ metric.name }}: {{ metric.type|py_metric_type }} | None = None,
126
131
  {% endfor %}
127
132
  {% endif %}
128
133
  {% endfor %}
129
134
  {% for extra, metadata in event.extra_keys.items() %}
130
- {{ extra }}: {{ metadata.type|py_metric_type }},
135
+ {{ extra }}: {{ metadata.type|py_metric_type }} | None = None,
131
136
  {% endfor %}
132
137
  ) -> None:
133
138
  """
@@ -156,9 +161,13 @@ class {{ ping|camelize }}ServerEventLogger:
156
161
  "name": "{{ event.name }}",
157
162
  {% if event.extra_keys %}
158
163
  "extra": {
159
- {% for extra, metadata in event.extra_keys.items() %}
160
- "{{ extra }}": str({{ extra }}){% if 'bool' == metadata.type|py_metric_type %}.lower(){% endif %},
161
- {% endfor %}
164
+ key: value
165
+ for key, value in [
166
+ {% for extra, metadata in event.extra_keys.items() %}
167
+ ("{{ extra }}", str({{ extra }}){% if 'bool' == metadata.type|py_metric_type %}.lower(){% endif %}),
168
+ {% endfor %}
169
+ ]
170
+ if value is not None
162
171
  },
163
172
  {% endif %}
164
173
  }
@@ -152,7 +152,7 @@ module Glean
152
152
  {
153
153
  'category' => '{{ event.category }}',
154
154
  'name' => '{{ event.name }}',
155
- 'timestamp' => (Time.now.utc.to_f * 1000).to_i,
155
+ 'timestamp' => 0,
156
156
  'extra' => [
157
157
  {% for extra, metadata in event.extra_keys.items() %}
158
158
  ['{{ extra }}', {{ extra }}.to_s],
@@ -108,7 +108,7 @@ pub fn new_glean_event(
108
108
  GleanEvent {
109
109
  category: category.to_owned(),
110
110
  name: name.to_owned(),
111
- timestamp: Utc::now().timestamp_millis(),
111
+ timestamp: 0,
112
112
  extra,
113
113
  }
114
114
  }
@@ -227,7 +227,7 @@ impl {{ ping|ping_events_type_name }} for {{ event|event_type_name }} {
227
227
  /// Create a GleanEvent for the above-defined Event struct ({{ event|event_type_name }}).
228
228
  /// Any metadata `extra` values are passed into the extra HashMap.
229
229
  fn glean_event(&self) -> GleanEvent {
230
- // Any `extra_keys` will be output below to be inserted into `extra`.
230
+ // Any `extra_keys` will be output below to be inserted into `extra`.
231
231
  // If there are none, an empty, immutable HashMap is created.
232
232
  {% if event.extra_keys.items()|length == 0 %}
233
233
  let extra: HashMap<String, String> = HashMap::new();
@@ -323,7 +323,7 @@ impl GleanEventsLogger {
323
323
  if let Some(event) = &params.event {
324
324
  events.push(event.glean_event());
325
325
  }
326
-
326
+
327
327
  {% else %}
328
328
  let events: Vec<GleanEvent> = Vec::new();
329
329
  {% endif %}
@@ -50,7 +50,9 @@ def pytest_collection_modifyitems(config, items):
50
50
  else:
51
51
  # Node.js removed some deprecated items currently in use by dependencies of mozlog.
52
52
  # We can't fix that.
53
- node_version = subprocess.check_output(["node", "--version"]).decode("utf-8").strip()
53
+ node_version = (
54
+ subprocess.check_output(["node", "--version"]).decode("utf-8").strip()
55
+ )
54
56
  major_version = int(node_version[1:].split(".")[0])
55
57
  print(f"jer. {node_version=}, {major_version=}")
56
58
  if major_version >= 24:
@@ -183,7 +183,7 @@ func newGleanEvent(category, name string, extra map[string]string) gleanEvent {
183
183
  return gleanEvent{
184
184
  Category: category,
185
185
  Name: name,
186
- Timestamp: time.Now().UnixMilli(),
186
+ Timestamp: 0,
187
187
  Extra: extra,
188
188
  }
189
189
  }
@@ -107,7 +107,7 @@ pub fn new_glean_event(
107
107
  GleanEvent {
108
108
  category: category.to_owned(),
109
109
  name: name.to_owned(),
110
- timestamp: Utc::now().timestamp_millis(),
110
+ timestamp: 0,
111
111
  extra,
112
112
  }
113
113
  }
@@ -217,7 +217,7 @@ impl ServerTelemetryScenarioOnePingEvent for BackendSpecialEventEvent {
217
217
  /// Create a GleanEvent for the above-defined Event struct (BackendSpecialEventEvent).
218
218
  /// Any metadata `extra` values are passed into the extra HashMap.
219
219
  fn glean_event(&self) -> GleanEvent {
220
- // Any `extra_keys` will be output below to be inserted into `extra`.
220
+ // Any `extra_keys` will be output below to be inserted into `extra`.
221
221
  // If there are none, an empty, immutable HashMap is created.
222
222
  let mut extra: HashMap<String, String> = HashMap::new();
223
223
 
@@ -295,7 +295,7 @@ impl GleanEventsLogger {
295
295
  if let Some(event) = &params.event {
296
296
  events.push(event.glean_event());
297
297
  }
298
-
298
+
299
299
  self.record("server-telemetry-scenario-one", request_info, metrics, events);
300
300
  }
301
301
  }
@@ -183,7 +183,7 @@ func newGleanEvent(category, name string, extra map[string]string) gleanEvent {
183
183
  return gleanEvent{
184
184
  Category: category,
185
185
  Name: name,
186
- Timestamp: time.Now().UnixMilli(),
186
+ Timestamp: 0,
187
187
  Extra: extra,
188
188
  }
189
189
  }
@@ -107,7 +107,7 @@ pub fn new_glean_event(
107
107
  GleanEvent {
108
108
  category: category.to_owned(),
109
109
  name: name.to_owned(),
110
- timestamp: Utc::now().timestamp_millis(),
110
+ timestamp: 0,
111
111
  extra,
112
112
  }
113
113
  }
@@ -217,7 +217,7 @@ impl EventsPingEvent for BackendTestEventEvent {
217
217
  /// Create a GleanEvent for the above-defined Event struct (BackendTestEventEvent).
218
218
  /// Any metadata `extra` values are passed into the extra HashMap.
219
219
  fn glean_event(&self) -> GleanEvent {
220
- // Any `extra_keys` will be output below to be inserted into `extra`.
220
+ // Any `extra_keys` will be output below to be inserted into `extra`.
221
221
  // If there are none, an empty, immutable HashMap is created.
222
222
  let mut extra: HashMap<String, String> = HashMap::new();
223
223
 
@@ -295,7 +295,7 @@ impl GleanEventsLogger {
295
295
  if let Some(event) = &params.event {
296
296
  events.push(event.glean_event());
297
297
  }
298
-
298
+
299
299
  self.record("events", request_info, metrics, events);
300
300
  }
301
301
  }
@@ -115,7 +115,7 @@ module Glean
115
115
  {{
116
116
  'category' => 'backend',
117
117
  'name' => 'object_update',
118
- 'timestamp' => (Time.now.utc.to_f * 1000).to_i,
118
+ 'timestamp' => 0,
119
119
  'extra' => [
120
120
  ['object_type', object_type.to_s],
121
121
  ['object_state', object_state.to_s],
@@ -183,7 +183,7 @@ func newGleanEvent(category, name string, extra map[string]string) gleanEvent {
183
183
  return gleanEvent{
184
184
  Category: category,
185
185
  Name: name,
186
- Timestamp: time.Now().UnixMilli(),
186
+ Timestamp: 0,
187
187
  Extra: extra,
188
188
  }
189
189
  }
@@ -107,7 +107,7 @@ pub fn new_glean_event(
107
107
  GleanEvent {
108
108
  category: category.to_owned(),
109
109
  name: name.to_owned(),
110
- timestamp: Utc::now().timestamp_millis(),
110
+ timestamp: 0,
111
111
  extra,
112
112
  }
113
113
  }
@@ -217,7 +217,7 @@ impl EventsPingEvent for BackendTestEventEvent {
217
217
  /// Create a GleanEvent for the above-defined Event struct (BackendTestEventEvent).
218
218
  /// Any metadata `extra` values are passed into the extra HashMap.
219
219
  fn glean_event(&self) -> GleanEvent {
220
- // Any `extra_keys` will be output below to be inserted into `extra`.
220
+ // Any `extra_keys` will be output below to be inserted into `extra`.
221
221
  // If there are none, an empty, immutable HashMap is created.
222
222
  let mut extra: HashMap<String, String> = HashMap::new();
223
223
 
@@ -295,7 +295,7 @@ impl GleanEventsLogger {
295
295
  if let Some(event) = &params.event {
296
296
  events.push(event.glean_event());
297
297
  }
298
-
298
+
299
299
  self.record("events", request_info, metrics, events);
300
300
  }
301
301
  }
@@ -15,3 +15,7 @@ logger.record_backend_object_update(
15
15
  object_state="some_object_state",
16
16
  linking=True,
17
17
  )
18
+
19
+ logger.record_backend_object_update()
20
+
21
+ logger.record()
@@ -334,9 +334,9 @@ def test_event_extra_keys_with_types(tmp_path):
334
334
  assert (
335
335
  'allowedExtraKeys = listOf("enabled", "preference", "swapped")' in content
336
336
  )
337
- assert "map.put(\"enabled\", it.toString())" in content
338
- assert "map.put(\"preference\", it)" in content
339
- assert "map.put(\"swapped\", it.toString())" in content
337
+ assert 'map.put("enabled", it.toString())' in content
338
+ assert 'map.put("preference", it)' in content
339
+ assert 'map.put("swapped", it.toString())' in content
340
340
 
341
341
 
342
342
  def test_reasons(tmp_path):
@@ -774,7 +774,11 @@ def test_events_data_sensitivity_from_file():
774
774
  "too_many_no_lints": {
775
775
  "type": "counter",
776
776
  "expires": "2100-01-01",
777
- "no_lint": ["EXPIRATION_DATE_TOO_FAR", "UNIT_IN_NAME", "UNUSED_NO_LINT"],
777
+ "no_lint": [
778
+ "EXPIRATION_DATE_TOO_FAR",
779
+ "UNIT_IN_NAME",
780
+ "UNUSED_NO_LINT",
781
+ ],
778
782
  }
779
783
  },
780
784
  0,
@@ -812,9 +816,8 @@ def test_unused_no_lint_warning(content, num_nits):
812
816
  nits = lint.lint_metrics(all_metrics.value)
813
817
  assert len(nits) == num_nits
814
818
  if num_nits > 0:
815
- assert set(["UNUSED_NO_LINT"]) == set(
816
- v.check_name for v in nits
817
- )
819
+ assert set(["UNUSED_NO_LINT"]) == set(v.check_name for v in nits)
820
+
818
821
 
819
822
  @pytest.mark.parametrize(
820
823
  "content,num_nits",
@@ -824,7 +827,11 @@ def test_unused_no_lint_warning(content, num_nits):
824
827
  "unknown_lint": {
825
828
  "type": "counter",
826
829
  "expires": "2100-01-01",
827
- "no_lint": ["EXPIRATION_DATE_TOO_FAR", "DOES_NOT_EXIST", "UNKNOWN_LINT"],
830
+ "no_lint": [
831
+ "EXPIRATION_DATE_TOO_FAR",
832
+ "DOES_NOT_EXIST",
833
+ "UNKNOWN_LINT",
834
+ ],
828
835
  }
829
836
  },
830
837
  0,
@@ -872,9 +879,7 @@ def test_unknown_lint_warning(content, num_nits):
872
879
  nits = lint.lint_metrics(all_metrics.value)
873
880
  assert len(nits) == num_nits
874
881
  if num_nits > 0:
875
- assert set(["UNKNOWN_LINT"]) == set(
876
- v.check_name for v in nits
877
- )
882
+ assert set(["UNKNOWN_LINT"]) == set(v.check_name for v in nits)
878
883
 
879
884
 
880
885
  @pytest.mark.parametrize(
@@ -958,6 +963,4 @@ def test_events_on_metrics_ping(content, num_nits):
958
963
  nits = lint.lint_metrics(all_metrics.value)
959
964
  assert len(nits) == num_nits
960
965
  if num_nits > 0:
961
- assert set(["EVENT_ON_NON_EVENTS_PING"]) == set(
962
- v.check_name for v in nits
963
- )
966
+ assert set(["EVENT_ON_NON_EVENTS_PING"]) == set(v.check_name for v in nits)
@@ -1299,28 +1299,40 @@ def test_object_invalid():
1299
1299
  (
1300
1300
  {
1301
1301
  "type": "object",
1302
- "properties": {"key": {"type": "string"}, "value": {"oneOf": [ { "type": "object" } ]}},
1302
+ "properties": {
1303
+ "key": {"type": "string"},
1304
+ "value": {"oneOf": [{"type": "object"}]},
1305
+ },
1303
1306
  },
1304
1307
  1,
1305
1308
  ),
1306
1309
  (
1307
1310
  {
1308
1311
  "type": "object",
1309
- "properties": {"key": {"type": "string"}, "value": {"oneOf": [ { "type": "number", "other": "unsupported" } ]}},
1312
+ "properties": {
1313
+ "key": {"type": "string"},
1314
+ "value": {"oneOf": [{"type": "number", "other": "unsupported"}]},
1315
+ },
1310
1316
  },
1311
1317
  1,
1312
1318
  ),
1313
1319
  (
1314
1320
  {
1315
1321
  "type": "object",
1316
- "properties": {"key": {"type": "string"}, "value": {"oneOf": [ { "type": "number" } ]}},
1322
+ "properties": {
1323
+ "key": {"type": "string"},
1324
+ "value": {"oneOf": [{"type": "number"}]},
1325
+ },
1317
1326
  },
1318
1327
  0,
1319
1328
  ),
1320
1329
  (
1321
1330
  {
1322
1331
  "type": "object",
1323
- "properties": {"key": {"type": "string"}, "value": {"oneOf": [ { "type": "number", "description": "desc" } ]}},
1332
+ "properties": {
1333
+ "key": {"type": "string"},
1334
+ "value": {"oneOf": [{"type": "number", "description": "desc"}]},
1335
+ },
1324
1336
  },
1325
1337
  0,
1326
1338
  ),