python-jack-knife 0.6.7__tar.gz → 0.6.8__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 (85) hide show
  1. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/PKG-INFO +1 -1
  2. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/stdout.py +31 -7
  3. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/version.py +1 -1
  4. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/PKG-INFO +1 -1
  5. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/LICENSE +0 -0
  6. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/README.md +0 -0
  7. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/pyproject.toml +0 -0
  8. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/setup.cfg +0 -0
  9. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/__init__.py +0 -0
  10. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/common.py +0 -0
  11. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/components.py +0 -0
  12. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/integrations/opensearch_client.py +0 -0
  13. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/integrations/opensearch_index_sink.py +0 -0
  14. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/integrations/opensearch_query_pipe.py +0 -0
  15. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/integrations/postgres_pipe.py +0 -0
  16. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/integrations/snowflake_pipe.py +0 -0
  17. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/log.py +0 -0
  18. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/main.py +0 -0
  19. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/man_page.py +0 -0
  20. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/parser.py +0 -0
  21. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/__init__.py +0 -0
  22. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/denorm.py +0 -0
  23. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/factory.py +0 -0
  24. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/filter.py +0 -0
  25. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/head.py +0 -0
  26. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/join.py +0 -0
  27. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/let_reduce.py +0 -0
  28. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/map.py +0 -0
  29. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/move_field.py +0 -0
  30. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/progress_pipe.py +0 -0
  31. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/query_pipe.py +0 -0
  32. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/remove_field.py +0 -0
  33. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/sample.py +0 -0
  34. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/select.py +0 -0
  35. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/sort.py +0 -0
  36. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/tail.py +0 -0
  37. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/user_pipe_factory.py +0 -0
  38. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/pipes/where.py +0 -0
  39. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/progress.py +0 -0
  40. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/registry.py +0 -0
  41. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/__init__.py +0 -0
  42. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/create_sink.py +0 -0
  43. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/csv_sink.py +0 -0
  44. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/devnull.py +0 -0
  45. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/dir_sink.py +0 -0
  46. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/expect.py +0 -0
  47. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/factory.py +0 -0
  48. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/format_sink.py +0 -0
  49. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/graph.py +0 -0
  50. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/graph_bar_line.py +0 -0
  51. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/graph_cumulative.py +0 -0
  52. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/graph_hist.py +0 -0
  53. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/graph_scatter.py +0 -0
  54. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/json_sink.py +0 -0
  55. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/s3_sink.py +0 -0
  56. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/s3_stream.py +0 -0
  57. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/sinks.py +0 -0
  58. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/tsv_sink.py +0 -0
  59. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sinks/user_sink_factory.py +0 -0
  60. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/__init__.py +0 -0
  61. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/configs_source.py +0 -0
  62. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/csv_source.py +0 -0
  63. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/dir_source.py +0 -0
  64. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/factory.py +0 -0
  65. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/favorite_source.py +0 -0
  66. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/format_source.py +0 -0
  67. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/inline_source.py +0 -0
  68. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/json_source.py +0 -0
  69. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/lazy_file.py +0 -0
  70. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/lazy_file_local.py +0 -0
  71. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/lazy_file_s3.py +0 -0
  72. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/macro_source.py +0 -0
  73. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/npy_source.py +0 -0
  74. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/parquet_source.py +0 -0
  75. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/s3_source.py +0 -0
  76. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/source_list.py +0 -0
  77. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/sql_source.py +0 -0
  78. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/tsv_source.py +0 -0
  79. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/sources/user_source_factory.py +0 -0
  80. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/pjk/usage.py +0 -0
  81. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/SOURCES.txt +0 -0
  82. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/dependency_links.txt +0 -0
  83. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/entry_points.txt +0 -0
  84. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/requires.txt +0 -0
  85. {python_jack_knife-0.6.7 → python_jack_knife-0.6.8}/src/python_jack_knife.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-jack-knife
3
- Version: 0.6.7
3
+ Version: 0.6.8
4
4
  Summary: Python Jack Knife – a command line data processor
5
5
  Author-email: Mike Schultz <mike.schultz@gmail.com>
6
6
  License:
@@ -3,10 +3,36 @@
3
3
 
4
4
  import sys
5
5
  import yaml
6
+ from yaml.representer import SafeRepresenter
6
7
  from pjk.components import Sink, Source
7
8
  from pjk.usage import ParsedToken, Usage
8
9
  from pjk.common import pager_stdout
9
10
 
11
+ # --- NEW: minimal custom dumper that block-quotes only "tricky" strings ---
12
+ class _PjkDumper(yaml.SafeDumper):
13
+ pass
14
+
15
+ def _needs_block(s: str) -> bool:
16
+ # Strings that are annoying to copy if quoted/escaped:
17
+ # - contain YAML structural chars or JSON-ish payloads
18
+ # - contain colon-space (key-like), braces, brackets, quotes, or backslashes
19
+ # - multi-line strings
20
+ return (
21
+ "\n" in s
22
+ or ": " in s
23
+ or any(c in s for c in "{}[]'\"\\")
24
+ )
25
+
26
+ def _represent_str(dumper, data: str):
27
+ if _needs_block(data):
28
+ # Literal block scalar preserves content exactly, no escaping
29
+ return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|")
30
+ # Default behavior for ordinary strings
31
+ return SafeRepresenter.represent_str(dumper, data)
32
+
33
+ _PjkDumper.add_representer(str, _represent_str)
34
+ # --------------------------------------------------------------------------
35
+
10
36
  class StdoutSink(Sink):
11
37
  @classmethod
12
38
  def usage(cls):
@@ -21,25 +47,23 @@ class StdoutSink(Sink):
21
47
 
22
48
  def __init__(self, ptok: ParsedToken, usage: Usage):
23
49
  super().__init__(ptok, usage)
24
-
25
- # NOTE: self.use_pager is hardcoded for now; override via constructor if needed
26
50
  self.use_pager = True if usage.get_param('less') == None else usage.get_param('less') == 'true'
27
51
 
28
52
  def process(self) -> None:
29
- # Route all stdout into `less` while dumping
30
53
  try:
31
54
  with pager_stdout(self.use_pager):
32
55
  for record in self.input:
33
56
  try:
34
57
  yaml.dump(
35
58
  record,
36
- sys.stdout, # now points to less (if enabled)
59
+ sys.stdout,
60
+ Dumper=_PjkDumper, # <-- use the custom dumper
37
61
  sort_keys=False,
38
62
  explicit_start=True,
39
- width=10**9 # effectively no wrap without using a float
63
+ allow_unicode=True,
64
+ width=10**9
40
65
  )
41
66
  except BrokenPipeError:
42
- break # user quit pager
67
+ break
43
68
  except BrokenPipeError:
44
- # Swallow if pager closed early
45
69
  pass
@@ -1,4 +1,4 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
  # Copyright 2024 Mike Schultz
3
3
 
4
- __version__ = "0.6.7"
4
+ __version__ = "0.6.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-jack-knife
3
- Version: 0.6.7
3
+ Version: 0.6.8
4
4
  Summary: Python Jack Knife – a command line data processor
5
5
  Author-email: Mike Schultz <mike.schultz@gmail.com>
6
6
  License: