code-node-graph 0.2.0__tar.gz → 0.3.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 (186) hide show
  1. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/CHANGELOG.md +11 -1
  2. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/PKG-INFO +1 -1
  3. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/__init__.py +1 -1
  4. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/style.py +28 -8
  5. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/walk.py +42 -7
  6. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/tests/test_code_node.py +2 -0
  7. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/.gitignore +0 -0
  8. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/LICENSE +0 -0
  9. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/README.md +0 -0
  10. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/examples/books-api/README.md +0 -0
  11. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/examples/cart-service/README.md +0 -0
  12. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/examples/orders-service/README.md +0 -0
  13. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/pyproject.toml +0 -0
  14. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/__main__.py +0 -0
  15. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/__init__.py +0 -0
  16. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/aws_model.py +0 -0
  17. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/findings.py +0 -0
  18. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/graph.py +0 -0
  19. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/mapping.py +0 -0
  20. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/model.py +0 -0
  21. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/reader.py +0 -0
  22. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/syntax.py +0 -0
  23. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/analysis/terms.py +0 -0
  24. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/cli.py +0 -0
  25. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/deploys/__init__.py +0 -0
  26. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/deploys/sam.py +0 -0
  27. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/deploys/serverless.py +0 -0
  28. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/__init__.py +0 -0
  29. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/blocks.py +0 -0
  30. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/fmt.py +0 -0
  31. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/highlight.py +0 -0
  32. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/render.py +0 -0
  33. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/kit/text.py +0 -0
  34. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/libraries/__init__.py +0 -0
  35. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/libraries/llm.py +0 -0
  36. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/libraries/mongo.py +0 -0
  37. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/libraries/redis.py +0 -0
  38. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/libraries/sql.py +0 -0
  39. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/pages.py +0 -0
  40. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/platforms/__init__.py +0 -0
  41. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/platforms/aws_lambda.py +0 -0
  42. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/platforms/web.py +0 -0
  43. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/project.py +0 -0
  44. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/__init__.py +0 -0
  45. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/brands.py +0 -0
  46. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/build.py +0 -0
  47. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/editor.py +0 -0
  48. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/graph.py +0 -0
  49. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/README.md +0 -0
  50. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/anthropic-icon.svg +0 -0
  51. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-amplify.svg +0 -0
  52. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-api-gateway.svg +0 -0
  53. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-appflow.svg +0 -0
  54. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-appsync.svg +0 -0
  55. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-athena.svg +0 -0
  56. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-backup.svg +0 -0
  57. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-batch.svg +0 -0
  58. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-certificate-manager.svg +0 -0
  59. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-cloudformation.svg +0 -0
  60. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-cloudfront.svg +0 -0
  61. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-cloudtrail.svg +0 -0
  62. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-cloudwatch.svg +0 -0
  63. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-codebuild.svg +0 -0
  64. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-codecommit.svg +0 -0
  65. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-codedeploy.svg +0 -0
  66. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-codepipeline.svg +0 -0
  67. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-cognito.svg +0 -0
  68. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-config.svg +0 -0
  69. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-documentdb.svg +0 -0
  70. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-dynamodb.svg +0 -0
  71. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-ec2.svg +0 -0
  72. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-ecs.svg +0 -0
  73. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-eks.svg +0 -0
  74. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-elasticache.svg +0 -0
  75. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-elb.svg +0 -0
  76. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-eventbridge.svg +0 -0
  77. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-glacier.svg +0 -0
  78. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-glue.svg +0 -0
  79. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-iam.svg +0 -0
  80. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-keyspaces.svg +0 -0
  81. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-kinesis.svg +0 -0
  82. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-kms.svg +0 -0
  83. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-lake-formation.svg +0 -0
  84. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-lambda.svg +0 -0
  85. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-lightsail.svg +0 -0
  86. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-mq.svg +0 -0
  87. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-msk.svg +0 -0
  88. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-neptune.svg +0 -0
  89. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-open-search.svg +0 -0
  90. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-quicksight.svg +0 -0
  91. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-rds.svg +0 -0
  92. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-redshift.svg +0 -0
  93. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-route53.svg +0 -0
  94. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-s3.svg +0 -0
  95. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-secrets-manager.svg +0 -0
  96. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-ses.svg +0 -0
  97. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-shield.svg +0 -0
  98. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-sns.svg +0 -0
  99. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-sqs.svg +0 -0
  100. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-step-functions.svg +0 -0
  101. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-systems-manager.svg +0 -0
  102. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-timestream.svg +0 -0
  103. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-waf.svg +0 -0
  104. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws-xray.svg +0 -0
  105. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/aws.svg +0 -0
  106. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/azure-icon.svg +0 -0
  107. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/django-icon.svg +0 -0
  108. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/elasticsearch.svg +0 -0
  109. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/fastapi-icon.svg +0 -0
  110. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/firebase-icon.svg +0 -0
  111. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/flask.svg +0 -0
  112. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/google-cloud.svg +0 -0
  113. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/kafka-icon.svg +0 -0
  114. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/mariadb-icon.svg +0 -0
  115. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/mongodb-icon.svg +0 -0
  116. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/mysql-icon.svg +0 -0
  117. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/openai-icon.svg +0 -0
  118. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/postgresql.svg +0 -0
  119. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/python.svg +0 -0
  120. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/rabbitmq-icon.svg +0 -0
  121. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/redis.svg +0 -0
  122. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/serverless.svg +0 -0
  123. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/slack-icon.svg +0 -0
  124. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-api-gateway.svg +0 -0
  125. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-appflow.svg +0 -0
  126. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-appsync.svg +0 -0
  127. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-athena.svg +0 -0
  128. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-backup.svg +0 -0
  129. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-batch.svg +0 -0
  130. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-certificate-manager.svg +0 -0
  131. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-cloudformation.svg +0 -0
  132. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-cloudfront.svg +0 -0
  133. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-cloudtrail.svg +0 -0
  134. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-cloudwatch.svg +0 -0
  135. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-codebuild.svg +0 -0
  136. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-codecommit.svg +0 -0
  137. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-codedeploy.svg +0 -0
  138. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-codepipeline.svg +0 -0
  139. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-cognito.svg +0 -0
  140. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-config.svg +0 -0
  141. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-documentdb.svg +0 -0
  142. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-dynamodb.svg +0 -0
  143. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-ec2.svg +0 -0
  144. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-ecs.svg +0 -0
  145. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-eks.svg +0 -0
  146. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-elasticache.svg +0 -0
  147. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-elb.svg +0 -0
  148. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-eventbridge.svg +0 -0
  149. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-glacier.svg +0 -0
  150. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-glue.svg +0 -0
  151. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-iam.svg +0 -0
  152. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-keyspaces.svg +0 -0
  153. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-kinesis.svg +0 -0
  154. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-kms.svg +0 -0
  155. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-lake-formation.svg +0 -0
  156. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-lambda.svg +0 -0
  157. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-mq.svg +0 -0
  158. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-msk.svg +0 -0
  159. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-neptune.svg +0 -0
  160. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-open-search.svg +0 -0
  161. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-quicksight.svg +0 -0
  162. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-rds.svg +0 -0
  163. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-redshift.svg +0 -0
  164. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-route53.svg +0 -0
  165. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-s3.svg +0 -0
  166. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-secrets-manager.svg +0 -0
  167. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-ses.svg +0 -0
  168. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-shield.svg +0 -0
  169. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-sns.svg +0 -0
  170. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-sqs.svg +0 -0
  171. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-step-functions.svg +0 -0
  172. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-systems-manager.svg +0 -0
  173. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-timestream.svg +0 -0
  174. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-waf.svg +0 -0
  175. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/small/aws-xray.svg +0 -0
  176. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/snowflake-icon.svg +0 -0
  177. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/sqlite.svg +0 -0
  178. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/stripe.svg +0 -0
  179. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/supabase-icon.svg +0 -0
  180. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/logos/twilio-icon.svg +0 -0
  181. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/outline.py +0 -0
  182. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/report/tabs.py +0 -0
  183. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/src/code_node/serve.py +0 -0
  184. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/tests/snapshots/books-api.txt +0 -0
  185. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/tests/snapshots/cart-service.txt +0 -0
  186. {code_node_graph-0.2.0 → code_node_graph-0.3.0}/tests/snapshots/orders-service.txt +0 -0
@@ -4,6 +4,15 @@ Every change a user would notice, newest first ([Keep a Changelog](https://keepa
4
4
  follow [Semantic Versioning](https://semver.org/); before 1.0, a minor version may change what a command does.
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.3.0] - 2026-10-20
8
+
9
+ ### Changed
10
+
11
+ - Step by step's list folds like a tree: the arrow beside a function, loop or branch hides the steps under it and
12
+ shows how many it hid. The tab also moves more: a new step's card comes in a line at a time, the lit row and its
13
+ number ease in, a dot pings when its step is reached, the code fades in when the walk goes into another function,
14
+ and the lit line glows as it lands. None of it moves for readers who ask for less motion.
15
+
7
16
  ## [0.2.0] - 2026-10-20
8
17
 
9
18
  ### Changed
@@ -162,6 +171,7 @@ follow [Semantic Versioning](https://semver.org/); before 1.0, a minor version m
162
171
  - `--platform NAME` runs a platform's checks whatever the entry point is; `--lambda` is short for
163
172
  `--platform lambda`. `EntryPoint.is_lambda` and `PageOptions.is_lambda` are now `platform` (`"lambda"` or `""`).
164
173
 
165
- [Unreleased]: https://github.com/utkarsh5026/code-node/compare/v0.2.0...HEAD
174
+ [Unreleased]: https://github.com/utkarsh5026/code-node/compare/v0.3.0...HEAD
175
+ [0.3.0]: https://github.com/utkarsh5026/code-node/compare/v0.2.0...v0.3.0
166
176
  [0.2.0]: https://github.com/utkarsh5026/code-node/compare/v0.1.0...v0.2.0
167
177
  [0.1.0]: https://github.com/utkarsh5026/code-node/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-node-graph
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: See how Python code works without running it: a graph of who calls whom from an entry point, and what each path reaches.
5
5
  Project-URL: Homepage, https://github.com/utkarsh5026/code-node
6
6
  Project-URL: Documentation, https://utkarsh5026.github.io/code-node/
@@ -13,7 +13,7 @@ from .libraries import Library, register_library
13
13
  from .platforms import Platform, get_platform, register_platform
14
14
  from .project import EntryPoint, Project, entry_points, read_project
15
15
 
16
- __version__ = "0.2.0"
16
+ __version__ = "0.3.0"
17
17
 
18
18
  __all__ = [
19
19
  "CodeGraph",
@@ -298,13 +298,27 @@ _EXTRA_CSS = """\
298
298
  .cnd .walk .ws{border-left:1px solid rgba(127,127,127,.2)}
299
299
  .cnd .walk .wch{position:sticky;top:0;z-index:2;padding:12px 16px 9px;font-size:12.5px;font-weight:650;background:var(--bg);border-bottom:1px solid rgba(127,127,127,.14)}
300
300
  .cnd .walk .wr{display:block;width:0;height:0;margin:0;border:0;padding:0;opacity:0;appearance:none;-webkit-appearance:none;pointer-events:none}
301
- .cnd .walk .wil{display:flex;align-items:center;gap:10px;min-height:30px;padding:0 14px 0 4px;cursor:pointer;white-space:nowrap;user-select:none;-webkit-user-select:none;transition:background-color .15s}
301
+ .cnd .walk .wil{display:flex;align-items:center;gap:10px;min-height:30px;padding:0 14px 0 4px;cursor:pointer;white-space:nowrap;user-select:none;-webkit-user-select:none;transition:background-color .2s,box-shadow .2s;animation:cnd-row .22s ease-out}
302
+ @keyframes cnd-row{from{opacity:0;transform:translateY(-3px)}}
303
+ .cnd .walk .wcx{position:absolute;width:0;height:0;margin:0;opacity:0;pointer-events:none}
304
+ .cnd .walk .wtg{position:relative;z-index:1;display:block;height:0}
305
+ .cnd .walk .wtg i{position:absolute;top:0;left:calc(40px + var(--d)*16px);width:16px;height:30px;border-radius:4px;cursor:pointer;opacity:.45;transition:opacity .15s,background-color .15s}
306
+ .cnd .walk .wtg i::before{content:"";position:absolute;left:5px;top:12px;width:5px;height:5px;border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;transform:rotate(45deg);transition:transform .2s cubic-bezier(.3,.7,.3,1)}
307
+ .cnd .walk .wtg:hover i{opacity:1;background:rgba(127,127,127,.14)}
308
+ .cnd .walk .wcx:checked+.wtg i{opacity:.8}
309
+ .cnd .walk .wcx:checked+.wtg i::before{transform:translate(-1px,1px) rotate(-45deg)}
310
+ .cnd .walk .wcnt{display:none;flex:none;font-size:11px;padding:0 7px;border-radius:9px;line-height:17px;background:rgba(127,127,127,.14);opacity:.75;animation:cnd-in .2s ease}
311
+ .cnd .walk .wcx:checked+.wtg+.wr+.wil .wcnt{display:inline-block}
302
312
  .cnd .walk .wil:hover{background-color:rgba(127,127,127,.08)}
303
313
  .cnd .walk .wr:checked+.wil{background-color:rgba(245,158,11,.16);box-shadow:inset 3px 0 #f59e0b}
304
314
  .cnd .walk .wr:focus-visible+.wil{outline:2px solid var(--blue);outline-offset:-2px}
305
315
  .cnd .walk .wno{flex:0 0 26px;text-align:right;font:11px var(--mono);opacity:.4;font-variant-numeric:tabular-nums}
306
- .cnd .walk .wr:checked+.wil .wno{opacity:.8}
307
- .cnd .walk .wx{display:flex;align-items:center;align-self:stretch;gap:8px;min-width:0;flex:1;padding-left:calc(var(--d)*16px);background:repeating-linear-gradient(90deg,rgba(127,127,127,.18) 0 1px,transparent 1px 16px) 5px 0/calc(var(--d)*16px) 100% no-repeat}
316
+ .cnd .walk .wr:checked+.wil .wno{opacity:.9;color:#d97706;font-weight:600}
317
+ .cnd .walk .wtx{transition:transform .2s ease}
318
+ .cnd .walk .wr:checked+.wil .wtx{transform:translateX(2px)}
319
+ .cnd .walk .wr:checked+.wil .wdot{animation:cnd-ping 1s ease-out 2}
320
+ @keyframes cnd-ping{from{box-shadow:0 0 0 0 var(--c,rgba(127,127,127,.6))}to{box-shadow:0 0 0 6px transparent}}
321
+ .cnd .walk .wx{display:flex;align-items:center;align-self:stretch;gap:8px;min-width:0;flex:1;padding-left:calc(var(--d)*16px + 18px);background:repeating-linear-gradient(90deg,rgba(127,127,127,.18) 0 1px,transparent 1px 16px) 8px 0/calc(var(--d)*16px) 100% no-repeat}
308
322
  .cnd .walk .wtx{min-width:0;overflow:hidden;text-overflow:ellipsis}
309
323
  .cnd .walk .wtx code{font:12px var(--mono);background:none;padding:0}
310
324
  .cnd .walk :is(.k-def,.k-module) .wtx b{font:650 12.5px var(--mono)}
@@ -312,7 +326,10 @@ _EXTRA_CSS = """\
312
326
  .cnd .walk .wdot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--c,rgba(127,127,127,.6))}
313
327
  .cnd .walk :is(.d-aws-reads,.d-lib-reads){--c:#3b82f6}.cnd .walk :is(.d-aws-writes,.d-lib-writes){--c:#ea580c}
314
328
  .cnd .walk :is(.d-aws-sends,.d-lib-sends,.d-http){--c:#db2777}.cnd .walk :is(.d-aws-runs,.d-lib-runs){--c:#9333ea}.cnd .walk .d-aws-signs{--c:#64748b}
315
- .cnd .walk .wc{display:none;position:absolute;left:var(--lw);right:0;top:0;height:var(--ch);box-sizing:border-box;overflow:auto;padding:14px 22px 12px;white-space:normal;cursor:auto;border-left:1px solid rgba(127,127,127,.2);border-bottom:1px solid rgba(127,127,127,.18);background:var(--bg);animation:cnd-in .18s ease}
329
+ .cnd .walk .wc{display:none;position:absolute;left:var(--lw);right:0;top:0;height:var(--ch);box-sizing:border-box;overflow:auto;padding:14px 22px 12px;white-space:normal;cursor:auto;border-left:1px solid rgba(127,127,127,.2);border-bottom:1px solid rgba(127,127,127,.18);background:var(--bg)}
330
+ .cnd .walk .wc>*{animation:cnd-in .24s ease both}
331
+ .cnd .walk .wc>.whead{animation-delay:.03s}.cnd .walk .wc>.wstk{animation-delay:.06s}.cnd .walk .wc>.wsay{animation-delay:.09s}.cnd .walk .wc>.wthen{animation-delay:.12s}
332
+ .cnd .walk .wfacts li{animation:cnd-in .24s ease both;animation-delay:.12s}.cnd .walk .wfacts li:nth-child(2){animation-delay:.15s}.cnd .walk .wfacts li:nth-child(n+3){animation-delay:.18s}
316
333
  .cnd .walk .wr:checked+.wil+.wc{display:block}
317
334
  .cnd .walk .wnav{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
318
335
  .cnd .walk .wbt{display:inline-flex;align-items:center;gap:5px;padding:4px 14px;border:1px solid rgba(127,127,127,.32);border-radius:8px;font-size:13px;font-weight:600;line-height:20px;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background-color .12s,transform .06s}
@@ -348,7 +365,9 @@ _EXTRA_CSS = """\
348
365
  .cnd .walk :is(.wfm,.wfv){opacity:.6}
349
366
  .cnd .walk .wthen{margin-top:10px;font-size:12px;opacity:.6}
350
367
  .cnd .walk .wf{display:none;position:absolute;left:var(--lw);right:0;top:var(--ch);bottom:0;flex-direction:column;border-left:1px solid rgba(127,127,127,.2);background:var(--bg)}
351
- .cnd .walk .wfn>.wr:checked~.wf{display:flex}
368
+ .cnd .walk .wfn>.wr:checked~.wf{display:flex;animation:cnd-fade .25s ease}
369
+ .cnd .walk .wfh{animation:cnd-in .25s ease}
370
+ @keyframes cnd-fade{from{opacity:0}}
352
371
  .cnd .walk .wfh{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:8px 22px;font-size:12px;border-bottom:1px solid rgba(127,127,127,.12)}
353
372
  .cnd .walk .wfh b{font:650 12.5px var(--mono)}
354
373
  .cnd .walk .wfh span{opacity:.62}
@@ -356,15 +375,16 @@ _EXTRA_CSS = """\
356
375
  .cnd .walk .wfw{position:relative;flex:1;min-height:0;overflow-x:auto;overflow-y:hidden;container-type:size;background:rgba(127,127,127,.03)}
357
376
  .cnd .walk .wfp{position:relative;box-sizing:border-box;width:max-content;min-width:100%;padding:var(--pad) 0;font:12.5px/var(--lh) var(--mono);
358
377
  translate:0 min(0px,max(calc(100cqh - var(--n)*var(--lh) - 2*var(--pad)),calc(36cqh - var(--k,0)*var(--lh))));transition:translate .32s cubic-bezier(.25,.8,.25,1)}
359
- .cnd .walk .wbar{position:absolute;left:0;right:0;top:calc(var(--pad) + var(--k,-9)*var(--lh));height:var(--lh);background:rgba(245,158,11,.2);box-shadow:inset 3px 0 #f59e0b;transition:top .32s cubic-bezier(.25,.8,.25,1)}
378
+ .cnd .walk .wbar{position:absolute;left:0;right:0;top:calc(var(--pad) + var(--k,-9)*var(--lh));height:var(--lh);background:rgba(245,158,11,.2);box-shadow:inset 3px 0 #f59e0b;transition:top .32s cubic-bezier(.25,.8,.25,1);animation:cnd-glow 1.2s ease-in-out 2}
379
+ @keyframes cnd-glow{50%{background:rgba(245,158,11,.3)}}
360
380
  .cnd .walk .sl{position:relative;display:block;padding-right:16px;white-space:pre}
361
381
  .cnd .walk span.sl{opacity:.6}
362
- .cnd .walk label.sl{cursor:pointer}
382
+ .cnd .walk label.sl{cursor:pointer;transition:background-color .15s}
363
383
  .cnd .walk label.sl:hover{background:rgba(127,127,127,.1)}
364
384
  .cnd .walk .sn{display:inline-block;width:3.2em;padding-right:14px;text-align:right;opacity:.42;user-select:none;-webkit-user-select:none}
365
385
  .cnd .walk label.sl .sn{opacity:.8}
366
386
  @media (max-width:860px){.cnd .walk{--lt:40vh;grid-template-columns:minmax(0,1fr);grid-template-rows:var(--lt) 1fr;height:calc(var(--lt) + var(--ch) + 380px)}.cnd .walk .wl{max-height:none}.cnd .walk :is(.wc,.wf){left:0;border-left:0}.cnd .walk .wc{top:var(--lt);border-top:1px solid rgba(127,127,127,.2);padding:12px 16px}.cnd .walk .wf{top:calc(var(--lt) + var(--ch))}.cnd .walk .ws{border-left:0}}
367
- @media (prefers-reduced-motion:reduce){.cnd .walk .wfp,.cnd .walk .wbar,.cnd .walk .wc,.cnd .tabs>.tp{transition:none;animation:none}}"""
387
+ @media (prefers-reduced-motion:reduce){.cnd .walk :is(.wfp,.wbar,.wc,.wc>*,.wfacts li,.wil,.wtx,.wdot,.wcnt,.wf,.wfh,.wtg i,.wtg i::before),.cnd .tabs>.tp{transition:none;animation:none}}"""
368
388
 
369
389
  _CSS = _base_css(_ROOT, _EXTRA_CSS)
370
390
 
@@ -7,6 +7,11 @@ No JavaScript: each step is a radio button (one group, so once one has focus the
7
7
  Each function's steps sit in a box of their own, with the function's code drawn once at the end of it; the CSS shows
8
8
  the card after the checked button and the code of its box with sibling selectors, so the light slides from line to
9
9
  line as you step, and a step costs the same however many there are.
10
+
11
+ The list folds like a tree: a step with steps under it has a checkbox before it, and its arrow folds them away. Each
12
+ step under it carries the class `wu<step>`, so one rule per fold hides them, whether they sit beside it or inside the
13
+ box of a function it calls (`#cx5:checked ~ .wu5, #cx5:checked ~ * .wu5`). Only the steps' rows are hidden: the
14
+ current one's card and code still show when it's folded away.
10
15
  """
11
16
 
12
17
  from __future__ import annotations
@@ -523,11 +528,29 @@ def _frame_html(index: int, frame: _Frame, rows: list[tuple[int, str]]) -> str:
523
528
  )
524
529
 
525
530
 
526
- def _item_html(stops: list[_Stop], i: int, card: str) -> str:
531
+ def _folds(stops: list[_Stop]) -> tuple[list[int], list[list[int]]]:
532
+ """
533
+ How many steps sit under each stop in the list, and the stops each one sits under, outermost first.
534
+ """
535
+ under = [0] * len(stops)
536
+ above: list[list[int]] = []
537
+ opened: list[int] = []
538
+ for i, stop in enumerate(stops):
539
+ while opened and (stops[opened[-1]].depth >= stop.depth or stops[opened[-1]].chapter != stop.chapter):
540
+ opened.pop()
541
+ for j in opened:
542
+ under[j] += 1
543
+ above.append(list(opened))
544
+ opened.append(i)
545
+ return under, above
546
+
547
+
548
+ def _item_html(stops: list[_Stop], i: int, card: str, under: int = 0, above: tuple[int, ...] = ()) -> str:
527
549
  """
528
550
  A step in the list: its radio button, then its number and what it does in a few words (or, for a function it goes
529
551
  into, the function's name and file, as a heading over its steps) as the button's label, then its card, which shows
530
- (beside the list) while the button is checked.
552
+ (beside the list) while the button is checked. under: how many steps sit under it, folded away by the checkbox and
553
+ arrow before it; above: the steps it sits under, whose folds hide it.
531
554
  """
532
555
  stop = stops[i]
533
556
  step = stop.step
@@ -543,10 +566,18 @@ def _item_html(stops: list[_Stop], i: int, card: str) -> str:
543
566
  dot = f'<span class="wdot d-{said}" title="{_esc(_NOTE_TIPS.get(said, ""))}"></span>' if said in _DOTS else ""
544
567
  text = f'<span class="wtx">{headline}</span>{dot}'
545
568
  checked = " checked" if i == 0 else ""
569
+ hidden_by = "".join(f" wu{j}" for j in above)
570
+ fold = ""
571
+ if under:
572
+ fold = (
573
+ f'<input type="checkbox" class="wcx" id="cx{i}" tabindex="-1"><label class="wtg{hidden_by}" for="cx{i}" '
574
+ f'style="--d:{stop.depth}" title="Fold or unfold the {_plural(under, "step")} under it"><i></i></label>'
575
+ )
576
+ text += f'<span class="wcnt">{_plural(under, "step")}</span>'
546
577
  return (
547
- f'<input type="radio" class="wr" name="{_GROUP}" id="cw{i}"{checked}><label class="wil k-{_esc(step.kind)}" '
548
- f'for="cw{i}" style="--d:{stop.depth}"><span class="wno">{i + 1}</span><span class="wx">{text}</span>'
549
- f"</label>{card}"
578
+ f'{fold}<input type="radio" class="wr" name="{_GROUP}" id="cw{i}"{checked}><label class="wil '
579
+ f'k-{_esc(step.kind)}{hidden_by}" for="cw{i}" style="--d:{stop.depth}"><span class="wno">{i + 1}</span>'
580
+ f'<span class="wx">{text}</span></label>{card}'
550
581
  )
551
582
 
552
583
 
@@ -576,6 +607,7 @@ def _walk_html(block: _Walk, report: _Report) -> str:
576
607
  rows = _frame_rows(frame, highlighted.get(frame.file, []), stops)
577
608
  rows_of.append({number: n for n, (number, _) in enumerate(rows) if number})
578
609
  drawn.append(_frame_html(k, frame, rows))
610
+ under, above = _folds(stops)
579
611
  out: list[str] = []
580
612
  opened: list[int] = [] # the frames whose boxes are open, innermost last
581
613
  chapter = -1
@@ -593,7 +625,9 @@ def _walk_html(block: _Walk, report: _Report) -> str:
593
625
  if not opened or opened[-1] != stop.frame: # into a call
594
626
  out.append('<div class="wfn">')
595
627
  opened.append(stop.frame)
596
- out.append(_item_html(stops, i, _card_html(stops, i, first, docs, block.editor)))
628
+ out.append(_item_html(stops, i, _card_html(stops, i, first, docs, block.editor), under[i], tuple(above[i])))
629
+ if under[i]: # its fold hides the steps under it, beside it or in the boxes of what it calls
630
+ report.rules.add(f".{root} #cx{i}:checked~.wu{i},.{root} #cx{i}:checked~* .wu{i}{{display:none}}")
597
631
  at = rows_of[stop.frame].get(stop.lit)
598
632
  if at is not None: # the line its code lights
599
633
  report.rules.add(f".{root} #cw{i}:checked~.wf{stop.frame}{{--k:{at}}}")
@@ -601,7 +635,8 @@ def _walk_html(block: _Walk, report: _Report) -> str:
601
635
  out.append(drawn[opened.pop()] + "</div>")
602
636
  sub = (
603
637
  f'<div class="wsub">{_plural(len(stops), "step")}, in the order the code runs. Press Next or click a step to '
604
- "light its line in the code; after a click, <kbd>↑</kbd> <kbd>↓</kbd> move through them.</div>"
638
+ "light its line in the code; after a click, <kbd>↑</kbd> <kbd>↓</kbd> move through them. The arrow beside a "
639
+ "step folds the steps under it away.</div>"
605
640
  )
606
641
  return (
607
642
  f'{title}{sub}<div class="walk"><div class="wl" role="radiogroup" aria-label="The steps">{"".join(out)}'
@@ -148,6 +148,8 @@ def test_the_steps_are_walked_in_the_order_the_code_runs(tmp_path: Path) -> None
148
148
  "Finish <code>load()</code>"
149
149
  ) in html # from inside load()
150
150
  assert '<div class="whead">Makes an S3 client</div>' in html # each step said in plain words
151
+ assert 'id="cx1"' in html and 'id="cx0"' not in html # lambda_handler() folds; the import line has nothing under it
152
+ assert "#cx1:checked~.wu1" in html and 'class="wil k-def wu1 wu2 wu3"' in html # load(), inside its caller's fold
151
153
  assert '<span class="wtx">Goes through each <code>record</code> in <code>event[&#x27;Records&#x27;]</code>' in html
152
154
  assert '<label class="sl" for="cw5"><span class="sn">10</span>' in html # load()'s line 10 jumps to its step
153
155
  assert ".cnd #cw5:checked~.wf2{--k:1}" in html # and lights the second line of load()
File without changes