systemlink-cli 1.4.6__tar.gz → 1.4.7__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 (74) hide show
  1. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/PKG-INFO +1 -1
  2. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/pyproject.toml +1 -1
  3. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/_version.py +1 -1
  4. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/user_click.py +43 -49
  5. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/LICENSE +0 -0
  6. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/dff-editor/editor.js +0 -0
  7. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/dff-editor/index.html +0 -0
  8. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/__init__.py +0 -0
  9. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/__main__.py +0 -0
  10. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/asset_click.py +0 -0
  11. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/cli_formatters.py +0 -0
  12. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/cli_utils.py +0 -0
  13. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/comment_click.py +0 -0
  14. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/completion_click.py +0 -0
  15. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/config.py +0 -0
  16. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/config_click.py +0 -0
  17. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/dff_click.py +0 -0
  18. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/dff_decorators.py +0 -0
  19. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/example_click.py +0 -0
  20. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/example_loader.py +0 -0
  21. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/example_provisioner.py +0 -0
  22. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/README.md +0 -0
  23. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/_schema/schema-v1.0.json +0 -0
  24. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/demo-complete-workflow/README.md +0 -0
  25. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/demo-complete-workflow/config.yaml +0 -0
  26. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/demo-test-plans/README.md +0 -0
  27. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/demo-test-plans/config.yaml +0 -0
  28. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
  29. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
  30. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
  31. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
  32. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
  33. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
  34. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
  35. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
  36. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
  37. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  38. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/feed_click.py +0 -0
  39. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/file_click.py +0 -0
  40. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/function_click.py +0 -0
  41. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/function_templates.py +0 -0
  42. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/main.py +0 -0
  43. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/mcp_click.py +0 -0
  44. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/mcp_server.py +0 -0
  45. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/notebook_click.py +0 -0
  46. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/platform.py +0 -0
  47. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/policy_click.py +0 -0
  48. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/policy_utils.py +0 -0
  49. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/profiles.py +0 -0
  50. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/response_handlers.py +0 -0
  51. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/routine_click.py +0 -0
  52. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skill_click.py +0 -0
  53. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/slcli/SKILL.md +0 -0
  54. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
  55. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/slcli/references/filtering.md +0 -0
  56. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/systemlink-webapp/SKILL.md +0 -0
  57. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/systemlink-webapp/references/deployment.md +0 -0
  58. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/systemlink-webapp/references/nimble-angular.md +0 -0
  59. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/skills/systemlink-webapp/references/systemlink-services.md +0 -0
  60. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/ssl_trust.py +0 -0
  61. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/system_click.py +0 -0
  62. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/table_utils.py +0 -0
  63. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/tag_click.py +0 -0
  64. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/templates_click.py +0 -0
  65. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/testmonitor_click.py +0 -0
  66. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/universal_handlers.py +0 -0
  67. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/utils.py +0 -0
  68. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/web_editor.py +0 -0
  69. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/webapp_click.py +0 -0
  70. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/workflow_preview.py +0 -0
  71. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/workflows_click.py +0 -0
  72. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/workitem_click.py +0 -0
  73. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/workspace_click.py +0 -0
  74. {systemlink_cli-1.4.6 → systemlink_cli-1.4.7}/slcli/workspace_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: systemlink-cli
3
- Version: 1.4.6
3
+ Version: 1.4.7
4
4
  Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
5
5
  License-File: LICENSE
6
6
  Author: Fred Visser
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "systemlink-cli"
3
- version = "1.4.6"
3
+ version = "1.4.7"
4
4
  description = "SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates."
5
5
  authors = ["Fred Visser <fred.visser@emerson.com>"]
6
6
  packages = [{ include = "slcli" }]
@@ -1,4 +1,4 @@
1
1
  """Version information for slcli."""
2
2
 
3
3
  # This file is auto-generated. Do not edit manually.
4
- __version__ = "1.4.6"
4
+ __version__ = "1.4.7"
@@ -13,6 +13,7 @@ from uuid import uuid4
13
13
 
14
14
  import click
15
15
  import questionary
16
+ from click.core import ParameterSource
16
17
 
17
18
  from .cli_utils import paginate_list_output, validate_output_format
18
19
  from .utils import (
@@ -25,6 +26,10 @@ from .utils import (
25
26
  from .workspace_utils import get_workspace_display_name, resolve_workspace_id
26
27
 
27
28
 
29
+ USER_QUERY_PAGE_SIZE = 100
30
+ USER_JSON_DEFAULT_TAKE = 1000
31
+
32
+
28
33
  def _get_policy_details(policy_id: str) -> Optional[dict]:
29
34
  """Fetch policy details from the Auth service.
30
35
 
@@ -412,6 +417,7 @@ def _query_all_users(
412
417
  sortby: str = "firstName",
413
418
  order: str = "asc",
414
419
  include_disabled: bool = False,
420
+ max_items: Optional[int] = None,
415
421
  ) -> list:
416
422
  """Query all users from the API with server-side pagination using continuation tokens.
417
423
 
@@ -430,6 +436,7 @@ def _query_all_users(
430
436
  sortby: Field to sort by
431
437
  order: Sort order ('asc' or 'desc')
432
438
  include_disabled: Whether to include disabled users
439
+ max_items: Maximum number of users to return. When omitted, fetches all pages.
433
440
 
434
441
  Returns:
435
442
  List of all users
@@ -437,7 +444,7 @@ def _query_all_users(
437
444
  url = f"{get_base_url()}/niuser/v1/users/query"
438
445
  all_users = []
439
446
  continuation_token = None
440
- page_size = 100 # API maximum take limit is 100
447
+ remaining_items = max_items if max_items and max_items > 0 else None
441
448
 
442
449
  # Build the base filter - combine user filter with active status filter if needed
443
450
  combined_filter = filter_str
@@ -451,8 +458,13 @@ def _query_all_users(
451
458
  combined_filter = active_filter
452
459
 
453
460
  while True:
461
+ request_take = (
462
+ USER_QUERY_PAGE_SIZE
463
+ if remaining_items is None
464
+ else min(USER_QUERY_PAGE_SIZE, remaining_items)
465
+ )
454
466
  payload = {
455
- "take": page_size,
467
+ "take": request_take,
456
468
  "sortby": sortby,
457
469
  "order": "ascending" if order == "asc" else "descending",
458
470
  }
@@ -472,6 +484,11 @@ def _query_all_users(
472
484
 
473
485
  all_users.extend(users)
474
486
 
487
+ if remaining_items is not None:
488
+ remaining_items -= len(users)
489
+ if remaining_items <= 0:
490
+ return all_users[:max_items]
491
+
475
492
  # Check for continuation token to get next page
476
493
  continuation_token = data.get("continuationToken")
477
494
  if not continuation_token:
@@ -499,8 +516,10 @@ def register_user_commands(cli: click.Group) -> None:
499
516
  "-t",
500
517
  type=int,
501
518
  default=25,
502
- show_default=True,
503
- help="Maximum number of users to return",
519
+ help=(
520
+ "Table page size (default 25). JSON returns up to 1000 users by default; "
521
+ "use --take to override."
522
+ ),
504
523
  )
505
524
  @click.option(
506
525
  "--format",
@@ -573,59 +592,34 @@ def register_user_commands(cli: click.Group) -> None:
573
592
  if user_type != "all":
574
593
  type_filter = f'type = "{user_type}"'
575
594
 
576
- # For JSON format, we can respect the take parameter and use server-side pagination
577
- # For table format, we fetch all users and do client-side pagination for better UX
578
- if format_output.lower() == "json":
579
- # Use server-side pagination for JSON output
580
- url = f"{get_base_url()}/niuser/v1/users/query"
581
-
582
- # Build the filter - combine search filter with active status filter if needed
583
- combined_filter = search_filter
584
- if not include_disabled:
585
- # Add active status filter to the query using correct Dynamic LINQ syntax
586
- # Note: User API uses 'status' field with values 'pending' or 'active'
587
- active_filter = 'status = "active"'
588
- if combined_filter:
589
- combined_filter = f"({combined_filter}) and {active_filter}"
590
- else:
591
- combined_filter = active_filter
592
-
593
- # Add type filter
594
- if type_filter:
595
- if combined_filter:
596
- combined_filter = f"({combined_filter}) and {type_filter}"
597
- else:
598
- combined_filter = type_filter
599
-
600
- payload = {
601
- "take": take,
602
- "sortby": sortby,
603
- "order": "ascending" if order == "asc" else "descending",
604
- }
605
-
595
+ combined_filter = search_filter
596
+ if type_filter:
606
597
  if combined_filter:
607
- payload["filter"] = combined_filter
598
+ combined_filter = f"({combined_filter}) and {type_filter}"
599
+ else:
600
+ combined_filter = type_filter
608
601
 
609
- resp = make_api_request("POST", url, payload=payload)
610
- data = resp.json()
611
- users = data.get("users", [])
602
+ if format_output.lower() == "json":
603
+ ctx = click.get_current_context()
604
+ take_source = ctx.get_parameter_source("take")
605
+ json_take = (
606
+ USER_JSON_DEFAULT_TAKE if take_source == ParameterSource.DEFAULT else take
607
+ )
608
+
609
+ users = _query_all_users(
610
+ filter_str=combined_filter,
611
+ sortby=sortby,
612
+ order=order,
613
+ include_disabled=include_disabled,
614
+ max_items=json_take,
615
+ )
612
616
 
613
617
  click.echo(json.dumps(users, indent=2))
614
618
  return
615
619
  else:
616
620
  # For table format, fetch all users for proper client-side pagination
617
- # Combine filters for table output
618
- combined_filter_for_table = search_filter
619
- if type_filter:
620
- if combined_filter_for_table:
621
- combined_filter_for_table = (
622
- f"({combined_filter_for_table}) and {type_filter}"
623
- )
624
- else:
625
- combined_filter_for_table = type_filter
626
-
627
621
  all_users = _query_all_users(
628
- filter_str=combined_filter_for_table,
622
+ filter_str=combined_filter,
629
623
  sortby=sortby,
630
624
  order=order,
631
625
  include_disabled=include_disabled,
File without changes