pyflyby 1.9.13__tar.gz → 1.10.1__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.

Potentially problematic release.


This version of pyflyby might be problematic. Click here for more details.

Files changed (180) hide show
  1. pyflyby-1.10.1/.github/dependabot.yml +11 -0
  2. pyflyby-1.10.1/.github/workflows/docs.yml +28 -0
  3. pyflyby-1.10.1/.github/workflows/lint.yml +30 -0
  4. pyflyby-1.10.1/.github/workflows/test.yml +67 -0
  5. pyflyby-1.10.1/.gitignore +11 -0
  6. pyflyby-1.10.1/CONTRIBUTING.md +1 -0
  7. {pyflyby-1.9.13/lib/python/pyflyby.egg-info → pyflyby-1.10.1}/PKG-INFO +47 -22
  8. {pyflyby-1.9.13 → pyflyby-1.10.1}/README.rst +11 -8
  9. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/saveframe +2 -1
  10. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/tidy-imports +11 -39
  11. pyflyby-1.10.1/codecov.yml +16 -0
  12. pyflyby-1.10.1/conftest.py +127 -0
  13. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/idents.rst +0 -1
  14. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/conf.py +22 -2
  15. pyflyby-1.10.1/etc/pyflyby/.gitignore +1 -0
  16. pyflyby-1.10.1/github_deploy_key_deshaw_pyflyby.enc +1 -0
  17. pyflyby-1.10.1/lib/python/.gitignore +1 -0
  18. pyflyby-1.10.1/lib/python/pyflyby/.gitignore +1 -0
  19. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/__init__.py +1 -0
  20. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_autoimp.py +11 -2
  21. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_cmdline.py +21 -7
  22. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_dbg.py +1 -2
  23. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_file.py +19 -3
  24. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_idents.py +2 -8
  25. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_imports2s.py +4 -1
  26. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_importstmt.py +82 -21
  27. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_interactive.py +126 -308
  28. pyflyby-1.10.1/lib/python/pyflyby/_log.py +104 -0
  29. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_modules.py +153 -25
  30. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_parse.py +2 -3
  31. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_saveframe.py +97 -26
  32. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/python/pyflyby/_version.py +1 -1
  33. pyflyby-1.10.1/lib/python/pyflyby/meson.build +34 -0
  34. pyflyby-1.10.1/meson.build +67 -0
  35. pyflyby-1.10.1/pyproject.toml +99 -0
  36. pyflyby-1.10.1/pytest.ini +7 -0
  37. pyflyby-1.10.1/src/_fast_iter_modules.cpp +98 -0
  38. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_cmdline.py +107 -3
  39. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_file.py +45 -0
  40. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_imports2s.py +63 -0
  41. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_importstmt.py +59 -0
  42. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_interactive.py +216 -147
  43. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_livepatch.py +18 -10
  44. pyflyby-1.10.1/tests/test_modules.py +197 -0
  45. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_py.py +38 -13
  46. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_saveframe.py +254 -94
  47. {pyflyby-1.9.13 → pyflyby-1.10.1}/tox.ini +0 -1
  48. pyflyby-1.9.13/PKG-INFO +0 -566
  49. pyflyby-1.9.13/bin/pyflyby/_dbg.py +0 -1368
  50. pyflyby-1.9.13/bin/pyflyby/_file.py +0 -755
  51. pyflyby-1.9.13/bin/pyflyby/_interactive.py +0 -2295
  52. pyflyby-1.9.13/bin/pyflyby/_log.py +0 -199
  53. pyflyby-1.9.13/bin/pyflyby/_parse.py +0 -1382
  54. pyflyby-1.9.13/bin/pyflyby/_saveframe.py +0 -1074
  55. pyflyby-1.9.13/bin/pyflyby/_version.py +0 -7
  56. pyflyby-1.9.13/lib/python/pyflyby/__init__.py +0 -60
  57. pyflyby-1.9.13/lib/python/pyflyby/__main__.py +0 -9
  58. pyflyby-1.9.13/lib/python/pyflyby/_autoimp.py +0 -2220
  59. pyflyby-1.9.13/lib/python/pyflyby/_cmdline.py +0 -534
  60. pyflyby-1.9.13/lib/python/pyflyby/_comms.py +0 -221
  61. pyflyby-1.9.13/lib/python/pyflyby/_docxref.py +0 -379
  62. pyflyby-1.9.13/lib/python/pyflyby/_dynimp.py +0 -154
  63. pyflyby-1.9.13/lib/python/pyflyby/_flags.py +0 -230
  64. pyflyby-1.9.13/lib/python/pyflyby/_format.py +0 -186
  65. pyflyby-1.9.13/lib/python/pyflyby/_idents.py +0 -233
  66. pyflyby-1.9.13/lib/python/pyflyby/_import_sorting.py +0 -165
  67. pyflyby-1.9.13/lib/python/pyflyby/_importclns.py +0 -658
  68. pyflyby-1.9.13/lib/python/pyflyby/_importdb.py +0 -680
  69. pyflyby-1.9.13/lib/python/pyflyby/_imports2s.py +0 -640
  70. pyflyby-1.9.13/lib/python/pyflyby/_importstmt.py +0 -662
  71. pyflyby-1.9.13/lib/python/pyflyby/_livepatch.py +0 -793
  72. pyflyby-1.9.13/lib/python/pyflyby/_log.py +0 -199
  73. pyflyby-1.9.13/lib/python/pyflyby/_modules.py +0 -513
  74. pyflyby-1.9.13/lib/python/pyflyby/_py.py +0 -2166
  75. pyflyby-1.9.13/lib/python/pyflyby/_saveframe_reader.py +0 -471
  76. pyflyby-1.9.13/lib/python/pyflyby/_util.py +0 -458
  77. pyflyby-1.9.13/lib/python/pyflyby/autoimport.py +0 -20
  78. pyflyby-1.9.13/lib/python/pyflyby/importdb.py +0 -19
  79. pyflyby-1.9.13/lib/python/pyflyby.egg-info/SOURCES.txt +0 -159
  80. pyflyby-1.9.13/lib/python/pyflyby.egg-info/dependency_links.txt +0 -1
  81. pyflyby-1.9.13/lib/python/pyflyby.egg-info/entry_points.txt +0 -3
  82. pyflyby-1.9.13/lib/python/pyflyby.egg-info/requires.txt +0 -6
  83. pyflyby-1.9.13/lib/python/pyflyby.egg-info/top_level.txt +0 -1
  84. pyflyby-1.9.13/pyproject.toml +0 -26
  85. pyflyby-1.9.13/setup.cfg +0 -4
  86. pyflyby-1.9.13/setup.py +0 -239
  87. pyflyby-1.9.13/tests/test_modules.py +0 -112
  88. {pyflyby-1.9.13 → pyflyby-1.10.1}/.pyflyby +0 -0
  89. {pyflyby-1.9.13 → pyflyby-1.10.1}/LICENSE.txt +0 -0
  90. {pyflyby-1.9.13 → pyflyby-1.10.1}/MANIFEST.in +0 -0
  91. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/autoipython +0 -0
  92. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/autopython +0 -0
  93. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/collect-exports +0 -0
  94. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/collect-imports +0 -0
  95. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/create-imports +0 -0
  96. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/find-import +0 -0
  97. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/list-bad-xrefs +0 -0
  98. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/prune-broken-imports +0 -0
  99. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/py +0 -0
  100. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/pyflyby-diff +0 -0
  101. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/reformat-imports +0 -0
  102. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/replace-star-imports +0 -0
  103. {pyflyby-1.9.13 → pyflyby-1.10.1}/bin/transform-imports +0 -0
  104. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/LICENSE.txt +0 -0
  105. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/Makefile +0 -0
  106. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/TODO.txt +0 -0
  107. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/__init__.py +0 -0
  108. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/api.rst +0 -0
  109. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/autoimp.rst +0 -0
  110. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/cmdline.rst +0 -0
  111. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/comms.rst +0 -0
  112. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/dbg.rst +0 -0
  113. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/file.rst +0 -0
  114. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/flags.rst +0 -0
  115. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/format.rst +0 -0
  116. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/importclns.rst +0 -0
  117. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/importdb.rst +0 -0
  118. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/imports2s.rst +0 -0
  119. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/importstmt.rst +0 -0
  120. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/interactive.rst +0 -0
  121. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/livepatch.rst +0 -0
  122. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/log.rst +0 -0
  123. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/modules.rst +0 -0
  124. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/parse.rst +0 -0
  125. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/py.rst +0 -0
  126. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/api/util.rst +0 -0
  127. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/autoipython.rst +0 -0
  128. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/cli.rst +0 -0
  129. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/collect_exports.rst +0 -0
  130. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/collect_imports.rst +0 -0
  131. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/find_import.rst +0 -0
  132. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/prune_broken_imports.rst +0 -0
  133. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/py.rst +0 -0
  134. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/pyflyby_diff.rst +0 -0
  135. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/reformat_imports.rst +0 -0
  136. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/replace_star_imports.rst +0 -0
  137. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/tidy_imports.rst +0 -0
  138. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/cli/transform_imports.rst +0 -0
  139. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/index.rst +0 -0
  140. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/make.bat +0 -0
  141. {pyflyby-1.9.13 → pyflyby-1.10.1}/doc/testing.txt +0 -0
  142. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/canonical.py +0 -0
  143. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/common.py +0 -0
  144. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/forget.py +0 -0
  145. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/mandatory.py +0 -0
  146. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/numpy.py +0 -0
  147. {pyflyby-1.9.13 → pyflyby-1.10.1}/etc/pyflyby/std.py +0 -0
  148. {pyflyby-1.9.13 → pyflyby-1.10.1}/lib/emacs/pyflyby.el +0 -0
  149. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/__main__.py +0 -0
  150. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_comms.py +0 -0
  151. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_docxref.py +0 -0
  152. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_dynimp.py +0 -0
  153. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_flags.py +0 -0
  154. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_format.py +0 -0
  155. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_import_sorting.py +0 -0
  156. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_importclns.py +0 -0
  157. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_importdb.py +0 -0
  158. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_livepatch.py +0 -0
  159. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_py.py +0 -0
  160. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_saveframe_reader.py +0 -0
  161. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/_util.py +0 -0
  162. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/autoimport.py +0 -0
  163. {pyflyby-1.9.13/bin → pyflyby-1.10.1/lib/python}/pyflyby/importdb.py +0 -0
  164. {pyflyby-1.9.13 → pyflyby-1.10.1}/libexec/pyflyby/colordiff +0 -0
  165. {pyflyby-1.9.13 → pyflyby-1.10.1}/libexec/pyflyby/diff-colorize +0 -0
  166. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/__init__.py +0 -0
  167. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_0testconfig.py +0 -0
  168. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_autoimp.py +0 -0
  169. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_docxref.py +0 -0
  170. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_flags.py +0 -0
  171. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_format.py +0 -0
  172. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_idents.py +0 -0
  173. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_importclns.py +0 -0
  174. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_importdb.py +0 -0
  175. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_jupyterlab_pyflyby.py +0 -0
  176. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_parse.py +0 -0
  177. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_saveframe_reader.py +0 -0
  178. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/test_util.py +0 -0
  179. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/tests_sorts.py +0 -0
  180. {pyflyby-1.9.13 → pyflyby-1.10.1}/tests/xrefs.py +0 -0
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -0,0 +1,28 @@
1
+ name: Docs
2
+ on: [push, pull_request, workflow_dispatch]
3
+
4
+ permissions:
5
+ contents: write
6
+
7
+ jobs:
8
+ docs:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v5
12
+ - uses: actions/setup-python@v5
13
+ - name: Install dependencies
14
+ run: |
15
+ pip install -U pip
16
+ pip install -v --group docs
17
+ - name: Build docs
18
+ run: |
19
+ make html
20
+ working-directory: doc
21
+ - name: Deploy
22
+ uses: peaceiris/actions-gh-pages@v4
23
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
24
+ with:
25
+ publish_branch: gh-pages
26
+ github_token: ${{ secrets.GITHUB_TOKEN }}
27
+ publish_dir: doc/_build/html
28
+ force_orphan: true
@@ -0,0 +1,30 @@
1
+ name: Lint
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ lint:
7
+ runs-on: "ubuntu-latest"
8
+ steps:
9
+ - uses: actions/checkout@v5
10
+ - name: Set up Python
11
+ uses: actions/setup-python@v5
12
+ with:
13
+ python-version: 3.13
14
+ - name: Install pyflyby
15
+ run: |
16
+ # Include build dependencies for run time; see
17
+ # https://mesonbuild.com/meson-python/how-to-guides/editable-installs.html#build-dependencies
18
+ # for details.
19
+ pip install meson-python meson ninja pybind11>=2.10.4
20
+ pip install --no-build-isolation -ve . --group lint
21
+ - name: Mypy
22
+ run: |
23
+ mypy lib/python --ignore-missing-imports
24
+ - name: lint
25
+ run: |
26
+ flake8 --exclude known_imports,etc,__init__.py --select=F;
27
+ flake8 --exclude known_imports,etc,__init__.py --select=F bin/*;
28
+ - name: Self-tidy-import
29
+ run: |
30
+ ./bin/tidy-imports -d lib/python/ tests/
@@ -0,0 +1,67 @@
1
+ name: Run tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ${{ matrix.os }}
8
+ timeout-minutes: 40
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ os: [ubuntu-latest]
13
+ python-version:
14
+ - "3.9"
15
+ - "3.10"
16
+ - "3.11"
17
+ - "3.12"
18
+ - "3.13"
19
+ include:
20
+ - os: macos-latest
21
+ python-version: "3.12"
22
+
23
+ env:
24
+ DEBUG_TEST_PYFLYBY: 1
25
+ ENVNAME: ${{matrix.os}}-${{matrix.python-version}}
26
+
27
+ steps:
28
+ - uses: actions/checkout@v5
29
+ - name: Set up Python ${{ matrix.python-version }}
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+ - name: Install pyflyby
34
+ run: |
35
+ # Include build dependencies for run time; see
36
+ # https://mesonbuild.com/meson-python/how-to-guides/editable-installs.html#build-dependencies
37
+ # for details.
38
+ pip install meson-python meson ninja pybind11>=2.10.4
39
+ pip install setuptools wheel # needed for epydoc
40
+ pip install --no-build-isolation -ve .[test]
41
+ - name: test release build
42
+ run: |
43
+ python -m build
44
+ - name: compileall
45
+ run: |
46
+ python -We:invalid -m compileall -f -q lib/ etc/;
47
+
48
+ - name: pytest Mac OS
49
+ if: ${{ matrix.os == 'macos-latest'}}
50
+ # json report can't be installed on Py2, and make macos super slow.
51
+ run: |
52
+ python -m pytest -v --cov=pyflyby --cov-report=xml --doctest-modules --maxfail=3 lib tests
53
+ - name: pytest (not MacOS)
54
+ if: ${{ matrix.os != 'macos-latest' }}
55
+ run: |
56
+ python -m pytest -v --cov=pyflyby --cov-report=xml\
57
+ --doctest-modules\
58
+ --maxfail=3\
59
+ --json-report\
60
+ --json-report-file=report-${ENVNAME}.json\
61
+ lib tests
62
+ - uses: actions/upload-artifact@v4
63
+ name: upload pytest timing reports as json
64
+ with:
65
+ name: pytest-timing-${{ matrix.os }}-${{ matrix.python-version }}
66
+ path: ./report-*.json
67
+ - uses: codecov/codecov-action@v5
@@ -0,0 +1,11 @@
1
+ **/.idea
2
+ *.pyc
3
+ .cache
4
+ .eggs
5
+ .hypothesis
6
+ .tox
7
+ __pycache__
8
+ _build
9
+ build
10
+ dist
11
+ pytestdebug.log
@@ -0,0 +1 @@
1
+ See https://github.com/deshaw/.github/blob/main/.github/CONTRIBUTING.md
@@ -1,23 +1,45 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyflyby
3
- Version: 1.9.13
3
+ Version: 1.10.1
4
4
  Summary: pyflyby - Python development productivity tools, in particular automatic import management
5
- Home-page: https://pypi.org/project/pyflyby/
6
- Author: Karl Chen
7
- Author-email: quarl@8166.clguba.z.quarl.org
8
- License: MIT
9
- Project-URL: Documentation, https://deshaw.github.io/pyflyby/
10
- Project-URL: Source, https://github.com/deshaw/pyflyby
11
- Keywords: pyflyby py autopython autoipython productivity automatic imports autoimporter tidy-imports
12
- Classifier: Development Status :: 5 - Production/Stable
5
+ Author-Email: Karl Chen <quarl@8166.clguba.z.quarl.org>
6
+ License-Expression: MIT
7
+ License-File: LICENSE.txt
8
+ Classifier: Programming Language :: Python
13
9
  Classifier: Topic :: Software Development
14
10
  Classifier: Topic :: Software Development :: Code Generators
15
11
  Classifier: Topic :: Software Development :: Interpreters
16
12
  Classifier: Intended Audience :: Developers
17
- Classifier: License :: OSI Approved :: MIT License
18
- Classifier: Programming Language :: Python
19
- Requires-Python: >3.9, <4
20
- License-File: LICENSE.txt
13
+ Classifier: Operating System :: OS Independent
14
+ Project-URL: Homepage, https://pypi.org/project/pyflyby/
15
+ Project-URL: Documentation, https://deshaw.github.io/pyflyby/
16
+ Project-URL: Source, https://github.com/deshaw/pyflyby
17
+ Requires-Python: >=3.9
18
+ Requires-Dist: black
19
+ Requires-Dist: six
20
+ Requires-Dist: tomli; python_version < "3.11"
21
+ Requires-Dist: typing_extensions>=4.6; python_version < "3.12"
22
+ Requires-Dist: prompt_toolkit
23
+ Requires-Dist: platformdirs
24
+ Provides-Extra: test
25
+ Requires-Dist: build; extra == "test"
26
+ Requires-Dist: coverage; extra == "test"
27
+ Requires-Dist: flaky; extra == "test"
28
+ Requires-Dist: hypothesis; extra == "test"
29
+ Requires-Dist: ipykernel>=5.4.3; extra == "test"
30
+ Requires-Dist: ipython; extra == "test"
31
+ Requires-Dist: jupyter; extra == "test"
32
+ Requires-Dist: jupyter_console>=6.2; extra == "test"
33
+ Requires-Dist: notebook<6.1; extra == "test"
34
+ Requires-Dist: pexpect>=3.3; extra == "test"
35
+ Requires-Dist: pytest-cov; extra == "test"
36
+ Requires-Dist: pytest-json-report; extra == "test"
37
+ Requires-Dist: pytest<=8; extra == "test"
38
+ Requires-Dist: requests; extra == "test"
39
+ Requires-Dist: epydoc; extra == "test"
40
+ Requires-Dist: wheel; extra == "test"
41
+ Requires-Dist: setuptools; extra == "test"
42
+ Description-Content-Type: text/x-rst
21
43
 
22
44
  #########
23
45
  Pyflyby
@@ -29,7 +51,7 @@ License-File: LICENSE.txt
29
51
  .. image:: https://travis-ci.org/deshaw/pyflyby.png?branch=master
30
52
  :target: https://travis-ci.org/deshaw/pyflyby
31
53
 
32
- Pyflyby is a set of Python programming productivity tools for Python 3.8+.
54
+ Pyflyby is a set of Python programming productivity tools for Python 3.9+.
33
55
 
34
56
  For command-line interaction:
35
57
  * ``py``: command-line multitool
@@ -47,6 +69,8 @@ For editing python source code:
47
69
  in the form of import statements.
48
70
  * ``transform-imports``: renames imported modules/functions.
49
71
 
72
+ `Learn more about Pyflyby <https://www.deshaw.com/library/desco-quansight-improving-jupyter-efficiency>`_ in this blog post.
73
+
50
74
  Installation
51
75
  ============
52
76
 
@@ -269,6 +293,10 @@ Other IPython magic commands work as well::
269
293
  [PYFLYBY] from numpy import arange
270
294
  [0 1 2 3]
271
295
 
296
+ .. warning::
297
+
298
+ Auto-import on ``Tab`` completion requires IPython 9.3 or newer.
299
+
272
300
 
273
301
  Implementation details
274
302
  ----------------------
@@ -279,7 +307,7 @@ namespace never contains entries for names that are not yet imported.
279
307
  This method of importing at parse time contrasts with previous implementations
280
308
  of automatic importing that use proxy objects. Those implementations using
281
309
  proxy objects don't work as well, because it is impossible to make proxy
282
- objects behave perfectly. For example, instance(x, T) will return the wrong
310
+ objects behave perfectly. For example, ``instance(x, T)`` will return the wrong
283
311
  answer if either x or T is a proxy object.
284
312
 
285
313
 
@@ -287,9 +315,8 @@ Compatibility
287
315
  -------------
288
316
 
289
317
  Tested with:
290
- - Python 3.8, 3.9, 3.10
291
- - IPython 0.10, 0.11, 0.12, 0.13, 1.0, 1.2, 2.0, 2.1, 2.2, 2.3, 2.4, 3.0,
292
- 3.1, 3.2, 4.0., 7.11 (latest)
318
+ - Python 3.9, 3.10, 3.11, 3.12, 3.13
319
+ - IPython 8.18, 8.37.0, 9.4.0 (latest)
293
320
  - IPython (text console), IPython Notebook, Spyder
294
321
 
295
322
 
@@ -475,7 +502,7 @@ Emacs support
475
502
 
476
503
  * To get a ``M-x tidy-imports`` command in GNU Emacs, add to your ``~/.emacs``::
477
504
 
478
- (load "/path/to/pyflyby/lib/emacs/pyflyby.el")
505
+ (load "/<site-packages>/pyflyby/share/emacs/site-lisp/pyflyby.el")
479
506
 
480
507
 
481
508
  - Pyflyby.el doesn't yet work with XEmacs; patches welcome.
@@ -562,5 +589,3 @@ Release
562
589
 
563
590
  8. Check/update https://github.com/conda-forge/pyflyby-feedstock for new pyflyby
564
591
  release on conda-forge
565
-
566
-
@@ -8,7 +8,7 @@
8
8
  .. image:: https://travis-ci.org/deshaw/pyflyby.png?branch=master
9
9
  :target: https://travis-ci.org/deshaw/pyflyby
10
10
 
11
- Pyflyby is a set of Python programming productivity tools for Python 3.8+.
11
+ Pyflyby is a set of Python programming productivity tools for Python 3.9+.
12
12
 
13
13
  For command-line interaction:
14
14
  * ``py``: command-line multitool
@@ -26,6 +26,8 @@ For editing python source code:
26
26
  in the form of import statements.
27
27
  * ``transform-imports``: renames imported modules/functions.
28
28
 
29
+ `Learn more about Pyflyby <https://www.deshaw.com/library/desco-quansight-improving-jupyter-efficiency>`_ in this blog post.
30
+
29
31
  Installation
30
32
  ============
31
33
 
@@ -248,6 +250,10 @@ Other IPython magic commands work as well::
248
250
  [PYFLYBY] from numpy import arange
249
251
  [0 1 2 3]
250
252
 
253
+ .. warning::
254
+
255
+ Auto-import on ``Tab`` completion requires IPython 9.3 or newer.
256
+
251
257
 
252
258
  Implementation details
253
259
  ----------------------
@@ -258,7 +264,7 @@ namespace never contains entries for names that are not yet imported.
258
264
  This method of importing at parse time contrasts with previous implementations
259
265
  of automatic importing that use proxy objects. Those implementations using
260
266
  proxy objects don't work as well, because it is impossible to make proxy
261
- objects behave perfectly. For example, instance(x, T) will return the wrong
267
+ objects behave perfectly. For example, ``instance(x, T)`` will return the wrong
262
268
  answer if either x or T is a proxy object.
263
269
 
264
270
 
@@ -266,9 +272,8 @@ Compatibility
266
272
  -------------
267
273
 
268
274
  Tested with:
269
- - Python 3.8, 3.9, 3.10
270
- - IPython 0.10, 0.11, 0.12, 0.13, 1.0, 1.2, 2.0, 2.1, 2.2, 2.3, 2.4, 3.0,
271
- 3.1, 3.2, 4.0., 7.11 (latest)
275
+ - Python 3.9, 3.10, 3.11, 3.12, 3.13
276
+ - IPython 8.18, 8.37.0, 9.4.0 (latest)
272
277
  - IPython (text console), IPython Notebook, Spyder
273
278
 
274
279
 
@@ -454,7 +459,7 @@ Emacs support
454
459
 
455
460
  * To get a ``M-x tidy-imports`` command in GNU Emacs, add to your ``~/.emacs``::
456
461
 
457
- (load "/path/to/pyflyby/lib/emacs/pyflyby.el")
462
+ (load "/<site-packages>/pyflyby/share/emacs/site-lisp/pyflyby.el")
458
463
 
459
464
 
460
465
  - Pyflyby.el doesn't yet work with XEmacs; patches welcome.
@@ -541,5 +546,3 @@ Release
541
546
 
542
547
  8. Check/update https://github.com/conda-forge/pyflyby-feedstock for new pyflyby
543
548
  release on conda-forge
544
-
545
-
@@ -288,7 +288,8 @@ def main():
288
288
  # Save the frames and metadata info to the file.
289
289
  _save_frames_and_exception_info_to_file(
290
290
  filename=filename, frames=frames, variables=variables,
291
- exclude_variables=exclude_variables, exception_obj=err)
291
+ exclude_variables=exclude_variables,
292
+ exception_obj=err)
292
293
  else:
293
294
  raise SystemExit(
294
295
  f"Error: No exception is raised by the program: {command_string!a}")
@@ -21,11 +21,8 @@ Only top-level import statements are touched.
21
21
  # License: MIT http://opensource.org/licenses/MIT
22
22
 
23
23
 
24
- from __future__ import print_function
25
-
26
- import os
27
-
28
- from pyflyby._cmdline import hfmt, parse_args, process_actions
24
+ from pyflyby._cmdline import (_get_pyproj_toml_config, hfmt,
25
+ parse_args, process_actions)
29
26
  from pyflyby._import_sorting import sort_imports
30
27
  from pyflyby._imports2s import (canonicalize_imports,
31
28
  fix_unused_and_missing_imports,
@@ -33,34 +30,6 @@ from pyflyby._imports2s import (canonicalize_imports,
33
30
  transform_imports)
34
31
  from pyflyby._parse import PythonBlock
35
32
 
36
- import toml
37
- TOML_AVAIL = True
38
-
39
-
40
- def _get_pyproj_toml_config():
41
- """
42
- Try to find current project pyproject.toml
43
- in cwd or parents directories.
44
- """
45
- if not TOML_AVAIL:
46
- return None
47
-
48
- from pathlib import Path
49
-
50
-
51
- cwd = Path(os.getcwd())
52
-
53
-
54
- for pth in [cwd] + list(cwd.parents):
55
- pyproj_toml = pth /'pyproject.toml'
56
- if pyproj_toml.exists() and pyproj_toml.is_file():
57
- return pyproj_toml.read_text()
58
-
59
- return None
60
-
61
-
62
-
63
-
64
33
 
65
34
  def _addopts(parser):
66
35
  """
@@ -138,9 +107,9 @@ def _addopts(parser):
138
107
  --no-add-mandatory.'''))
139
108
  def main() -> None:
140
109
 
141
- config_text = _get_pyproj_toml_config()
142
- if config_text:
143
- default_config = toml.loads(config_text).get('tool', {}).get('pyflyby',{})
110
+ config = _get_pyproj_toml_config()
111
+ if config:
112
+ default_config = config.get('tool', {}).get('pyflyby',{})
144
113
  else:
145
114
  default_config = {}
146
115
 
@@ -149,7 +118,10 @@ def main() -> None:
149
118
  parser.set_defaults(**default_config)
150
119
 
151
120
  options, args = parse_args(
152
- _add_opts_and_defaults, import_format_params=True, modify_action_params=True, defaults=default_config)
121
+ _add_opts_and_defaults,
122
+ import_format_params=True,
123
+ modify_action_params=True,
124
+ )
153
125
 
154
126
  def modify(block:PythonBlock) -> PythonBlock:
155
127
  if options.transformations:
@@ -166,13 +138,13 @@ def main() -> None:
166
138
  # TODO: disable sorting until we figure out #287
167
139
  # https://github.com/deshaw/pyflyby/issues/287
168
140
 
169
- # here we get a (single?) PythonBlock, we can access each statement with
141
+ # here we get a (single?) PythonBlock, we can access each statement with
170
142
  # >>> block.statements
171
143
  # and each statement can have a:
172
144
  # is_import
173
145
  # or
174
146
  # is_comment or blank
175
-
147
+
176
148
  # TODO: we do Python(str(...)) in order to unparse-reparse and get proper ast node numbers.
177
149
  if options.experimental_sort_imports:
178
150
  sorted_imports = PythonBlock(str(sort_imports(block)))
@@ -0,0 +1,16 @@
1
+ coverage:
2
+ status:
3
+ project:
4
+ default:
5
+ threshold: 1%
6
+ target: 70%
7
+ patch:
8
+ default:
9
+ threshold: 1%
10
+ target: 0%
11
+ codecov:
12
+ notify:
13
+ after_n_builds: 6
14
+ comment:
15
+ require_changes: true # if true: only post the PR comment if coverage changes
16
+ after_n_builds: 6
@@ -0,0 +1,127 @@
1
+
2
+
3
+
4
+ import os
5
+ import re
6
+ import sys
7
+ import pytest
8
+
9
+
10
+ _already_ran_setup = False
11
+
12
+ def pytest_runtest_setup(item):
13
+ """
14
+ Run the logger setup once.
15
+ """
16
+ # Although we only bother doing this once (and never tearDown), we still
17
+ # do this in a pytest_runtest_setup, rather than e.g. pytest_configure()
18
+ # because otherwise tox+py.test can get confused by having already loaded
19
+ # pyflyby from a different location.
20
+ global _already_ran_setup
21
+ if _already_ran_setup:
22
+ return
23
+ _already_ran_setup = True
24
+ _setup_logger()
25
+
26
+
27
+ def pytest_ignore_collect(path, config):
28
+ """ return True to prevent considering this path for collection.
29
+ This hook is consulted for all files and directories prior to calling
30
+ more specific hooks.
31
+ """
32
+ if str(path).endswith('_docxref.py'):
33
+ return True
34
+
35
+ def pytest_report_header(config):
36
+ import IPython
37
+ print("IPython %s" % (IPython.__version__))
38
+ import pyflyby
39
+ dir = os.path.dirname(pyflyby.__file__)
40
+ print("pyflyby %s from %s" % (pyflyby.__version__, dir))
41
+
42
+ if getattr(pytest, 'version_tuple', (0,0))[:2] >= (7, 0):
43
+ def pytest_load_initial_conftests(early_config, parser, args):
44
+ args[:] = ["--no-success-flaky-report", "--no-flaky-report"] + args
45
+ else:
46
+ def pytest_cmdline_preparse(config, args):
47
+ args[:] = ["--no-success-flaky-report", "--no-flaky-report"] + args
48
+
49
+ def _setup_logger():
50
+ """
51
+ Set up the pyflyby logger to be doctest-friendly.
52
+ """
53
+ import logging
54
+ import pyflyby
55
+ import sys
56
+ class TestStream(object):
57
+ def write(self, x):
58
+ sys.stdout.write(x)
59
+ sys.stdout.flush()
60
+ def flush(self):
61
+ pass
62
+ test_handler = logging.StreamHandler(TestStream())
63
+ test_handler.formatter = logging.Formatter("[PYFLYBY] %(message)s")
64
+ handler = pyflyby.logger.handlers[0]
65
+ handler.emit = test_handler.emit
66
+
67
+
68
+ # Set $PYFLYBY_PATH to a predictable value. For other env vars, set to defaults.
69
+ PYFLYBY_HOME = os.path.dirname(os.path.realpath(__file__))
70
+
71
+ os.environ["PYFLYBY_PATH"] = os.path.join(PYFLYBY_HOME, "etc/pyflyby")
72
+ os.environ["PYFLYBY_KNOWN_IMPORTS_PATH"] = ""
73
+ os.environ["PYFLYBY_MANDATORY_IMPORTS_PATH"] = ""
74
+ os.environ["PYFLYBY_LOG_LEVEL"] = ""
75
+ os.environ["PYTHONSTARTUP"] = ""
76
+
77
+ # Make sure that the virtualenv path is first.
78
+ os.environ["PATH"] = "%s:%s" % (os.path.dirname(sys.executable),
79
+ os.environ["PATH"])
80
+
81
+ # Detect whether we're inside tox. (Any better way to do this?)
82
+ in_tox = '/.tox/' in sys.prefix
83
+
84
+
85
+ if in_tox:
86
+ # When in tox, we shouldn't have any usercustomize messing this up.
87
+ for k in list(sys.modules.keys()):
88
+ assert not k == "pyflyby" or k.startswith("pyflyby.")
89
+
90
+ import pyflyby
91
+ fn = pyflyby.__file__
92
+ assert fn.startswith(sys.prefix)
93
+
94
+ else:
95
+ # Unload any already-imported pyflyby. This could happen if the user's
96
+ # usercustomize imported pyflyby. That would probably be the "production"
97
+ # pyflyby rather than the one being developed & tested.
98
+ for k in list(sys.modules.keys()):
99
+ if k == "pyflyby" or k.startswith("pyflyby."):
100
+ del sys.modules[k]
101
+
102
+ # Make sure we import pyflyby from this repository, as opposed to any other
103
+ # copy of pyflyby. This does prevent us from testing using the test cases of
104
+ # one repository against the modules from another repository. But that's not
105
+ # a common case; better to avoid confusion in the more common case between
106
+ # production vs development pyflyby.
107
+ pylib = os.path.join(PYFLYBY_HOME, "lib/python")
108
+ sys.path.insert(0, pylib)
109
+ os.environ["PYTHONPATH"] = ":".join(
110
+ [pylib] + list(filter(None, os.environ.get("PYTHONPATH", "").split(":"))))
111
+ import pyflyby
112
+
113
+ fn = re.sub("[.]py[co]$", ".py", pyflyby.__file__)
114
+ expected_fn = os.path.join(PYFLYBY_HOME, "lib/python/pyflyby/__init__.py")
115
+ assert fn == expected_fn, "pyflyby got loaded from %s; expected %s" % (fn, expected_fn)
116
+
117
+
118
+ # The following block is a workaround for IPython 0.11 and earlier versions.
119
+ # These versions of IPython get confused by sys.stdin not being a regular
120
+ # file at import time.
121
+ saved_sys_stdin = sys.stdin
122
+ try:
123
+ sys.stdin = sys.__stdin__
124
+ import IPython
125
+ IPython # pyflakes
126
+ finally:
127
+ sys.stdin = saved_sys_stdin
@@ -2,4 +2,3 @@ _idents module
2
2
  ==============
3
3
  .. automodule:: pyflyby._idents
4
4
  :members:
5
- :exclude-members: _my_iskeyword
@@ -2,6 +2,8 @@
2
2
 
3
3
  # -- Path setup --------------------------------------------------------------
4
4
  import os
5
+ import pathlib
6
+ import re
5
7
  import sys
6
8
  sys.path.insert(0, os.path.abspath('../lib/python'))
7
9
  sys.path.insert(0, os.path.abspath('..'))
@@ -11,9 +13,21 @@ project = 'pyflyby'
11
13
  copyright = '2019, Karl Chen'
12
14
  author = 'Karl Chen'
13
15
  # The full version, including alpha/beta/rc tags
14
- import pyflyby
15
16
 
16
- release = pyflyby.__version__
17
+ def find_version():
18
+ # Extract version information via regex to avoid importing
19
+ project_root = pathlib.Path(__file__).parent.parent
20
+ with open(project_root / "lib" / "python" / "pyflyby" / "_version.py") as f:
21
+ version_match = re.search(
22
+ r"^__version__ = ['\"](?P<version>.*)['\"]$",
23
+ f.read(),
24
+ re.M,
25
+ )
26
+ if version_match:
27
+ return version_match.group("version")
28
+ raise RuntimeError("Unable to find version string.")
29
+
30
+ release = find_version()
17
31
 
18
32
 
19
33
  # -- General configuration ---------------------------------------------------
@@ -29,6 +43,12 @@ autodoc_default_options = {
29
43
  'private-members': True
30
44
  }
31
45
 
46
+ autodoc_mock_imports = [
47
+ "pyflyby._fast_iter_modules",
48
+ "platformdirs",
49
+ "prompt_toolkit",
50
+ ]
51
+
32
52
  html_theme_options = {
33
53
  'collapse_navigation': False,
34
54
  'navigation_depth': -1,
@@ -0,0 +1 @@
1
+ local
@@ -0,0 +1 @@
1
+ gAAAAABfVnd-u7OJl_rosjRZ5eaALbVJwYnJMh6hu_2AVHxy5zUmNj__R464ih6BgThHhKkKFydiSfY59LzMN46vMteQ_8yJeKqxt6faHCgGKP4sBKwG783cd97jh7a4FvzGdQTHEKylDID5JsD44S3krH0zogsyfnTlxhSwhFKKejIbR4_Q6voxsxOx_EI8_hXLhJZvZJPh6GuY4lflFXV39te6LlPZjYDocGyHGVDXn50v-H6-elsmJFM-P5oqF1taOKS8I0ZASUcd0krCNrXBudRzr7zLE5Rk1p8JuqbU-HTZ0YfcLUXlUIQH8BnMWgVSoUxBsFXVvcxFVJozrQmeIT5zoMDCeWV4Gwj4VWLVLwDYgtSsp0Z2D6vpUX1N__NVXkg4E3baocNXTq85XaMe99HLo-1751sqsgZQbmgFPb8U0wyQBW8p_bNMO2wCp-H3zFGT1wZeWtVj46riO0aQuXAWvkcCB3LLpdFzk7wZaCLDW8irZ2Dt-nmRf80ODfncY3aqIUbg1h7_viaAY1G5Qre1mUYz0PtRjvtc6UN_kOG_zj-p-wtSnJdV9uBrA1G88N5nHRX9KXBaf8BLGQmL3hFhRmjs4do6jMbBTVH6wAuwuA_Fm3327BseUG9Ua_30pMW0FZrHK7ls3f4IGgVEpJ4GTSWOHK_UQvwoGnQn51NTnAIqDraUhy29eimki_2Sei8_xFT87uwfCjqwjRnB8bz4zLboKyfjdrqsCWPg8voYhuS8d-TfyfHv8HE5c7vTSLUu6OO_m8ODAT3s8m1_CdKoU5xF-wa9ysddg395FyEYLge1mBd8qI7ROKdusnpqMEC6ONxlzSFfs24gH-mFKJuqCayvuqF0rH5X7WHViPdhGaBnsavsg-yRGJ1DKeOgF821XMoXZVSeZJ6hHLHUuYZFCP-hWSfH-lGvfYvsauEyJLNAgEwmux3cHLaDKye0aeTG8bwbchCWYLqjs2ruKjIvfuIuQ0moynmw-O0_FlW1EchhEOkk17-7XMH-vLhmxSS_7bJ2a39Rwo9BgPX13blI14zwbFgQUQxpSnjaWCjpExRxPTFTx3yzwAngjEfV3NkHYJbgKPE10FcS4wTo2vC4Dm25lUkl-3t_XfPArmFxDMXFVCwcd6QNZemk0b2S8JHzWT_CIGAxTEO2ubJhycoMwkavP5lkgbM7yoOoKLHrxREfkuoNpCYltm4l1XVKy3lisdODLCjjqhui9TMikvoxlT9SShnPd1OjQhYNq7Iz9EIWi5Sfby3Lx6UYhivhGVhTx9QBpWRVSK0CnyA06wCx2JouqATdZg5awu6ZiRorO5QbgD2avaA0J8o55OCVEfzFdxajjt0RCYy69NY9PjL7CPtm1x2hkHCg7mBWz3AeuEggkyg1TLDIGlEcokgwl6mxonrj1zUL0Nau55A2_FXUcRhloiOsWv5LDakZ7T_af6nyg5m0rgWE8nn-0Wq5260tBHbCVTNTbi9BanhSN3-emcGOCoLzXeqNyKTNTHldXngBdsp_NCmU_hGtIUn-_AYu0jNvFlgUeD3JcfAx9_hcwd751D4_lkHDSMEXtRzj7jzEb-9saYdQmlEEG2vqiFEIk9y6lUwJ6DfeUF67R-fc8ccHmIy9xksRIFRkbH-vw7DosoZZy2g1qm5UzQMGTjgDjCQ1Bpg3XvgyLeUdek_I-fFtn5wNsmU8VbTbnreQ4eWLzbyfGX7jC0oBk8voVhgZvvRcJZ8qabKjs8mOmO9eRbVTiOA4YwMxLjGPGzX0oJbAAPWGmKDKIGoFdJurMaNihwxoAdVmTlyDS_fnPRTp7OCmiNDmij024-feD6NLoTDgrKxviFW0zf70lwhdsS2IC65ZUvPL1pUL8o9oI9DLVMiJKWWqf1z9aU_VPAhNsSxxmaB2AN0vSr-yWtvzzfM6kOJwbxu_nxxgJx02ZVn5iDdmfX111KO9rIHnmJtOVSwVvijn3Eu0u-7csuynQZtqFI07ql-xoUlRnYtZQUILzuBYHuQaw8y9gcTbuyRrgox9ySA5YpRFMej5j0AMSMb04dwOcO1PgIuziD16_o2AQt1czH-Bn2Xq7JUwliHE2fQDoi0yu_bBqT1Y_9etR8Z2aDtGFYCJ6k9083m_emvnJjOI9ZZYf4RJ14lQ7Xy2h0G7FcyTrIgH38_xqmH5PlzoYGmiejpbxAZ5eSBStGn40eFBK8a48Ei3TqSjCqyCUecqD8SW3KRgMo8mL87i4rTpuwWOjOyoYF3_qBFIhExEavo2CZj6fln7fS0fFkJtyteQqfiwHk9qx_WlvRX0cXWqbWnFZLLKPtcHerc-jBlurme7l6CC3QLOqNW78n9BYDrojqqbC-X5rW54F_dm_5Xm6BzV8wLOG77nMxJnUmhmH5_nu34ZDuW46vCmQJdKSlI4TSZL74rzfWP9CFhUyt8RF2kSesP4KieDH_4NPa4GXJfEC76r-7W9LwOOL5E5mPSSXHHJ5Zgfqiokck3-GypGXfdZ4fZKD6HPemLKSfAV1l3XvrfxPHYBQ0kvQtlp8dkyPJ4u5bQlUm3kwXw7tUsri64HoXUaWbryVGkPEo6WqRzVsBrKt-eLLmSbXle5qtwnez3JZU8U50S31TQZCyAUPudugKH0A2BBYMJSZUvxQX0sUbpozLCcu4aQvD27cbvrIzSgr-rcyM3oEOdLfGh-j8owkyg3H76c3UgmpMUwiplwh-kMor2Xo8S4HDbSSsPEoYNuybQAsXWEdNF44cu5EUM8Z7M41OBusEOi4712SXpJciA91ONNmnwrX8UYEw9j1Te90pC0EH2VViHJRtHEjh21WEwogAtBvUYCSKAZxcfrvDLL6Akz4a2DzsPtp--AxHVwSyGq2lZ_c10jSImvZ09HFiPRZl48nkph210J6TeWkoDnClEwNDyHiB_9o5zLbVOmIUebXESPC8xKjQLkZZV7D4NA3TvdQrcmqPl1jHC5EaCtV1B_D5pbKZMoHDTTOLRpikyPh-NCytadABpxtfqnXuATT9CKB1B2dkrV9cKLeLo3-tlzFsBg30Y0n3rGa3Qsk6N4fdAH4EEkrB-3cvH3d-TyiWfxZPHXFTfhxLK_fKZQ5539KLE7MgWi44CPTGGxH6ggoVrU0i5nZzvFZefmwvaWUv8UkeHiq3UhFUCcGrC3ZH5bdGLQZm11JotWqkLnhl_BR1n-sx0SnQk6ac3F9fFPZneYMaO8h5T7bYTUN812uFTYGLIHmBAxjyCkEWwFKpnwIAOmR8LR4wbuEScChao07UL43WgE_9x6xlDPDlt2GzE3cfAotISz9CwVq6CgKf607NgayvionEFj5aHsuo47jfa6jkJVnB15vKLWTtcplPh5IgJsPptR3rHcoLDSmi0Tq4gEBw9ur6MzY-EN-6vFKDelvTUpwr0DKtO0NtkASYE1pIW-SaXRb8uFmBphqjG73l0ZBQFe-B3RQECddPhr0fpODRV0hVrACFma78wBy3tzLUMb3AWMZz0RlXUN5RsAx05BkSqsFqWkcz4DsoJumpnz21XY3BTzNmyEdQ5pOEjPmoq0Dy1V2T1E8r65iFLi4G6eZ1udx50FxmOfpy6Mww3PAThJ2xn23ql_i8BkylEtagmi0clgF1279Ua0dOXxxIixcN4tFi1KqCyqXN86FubVTRdYOIx90NGwjVg4lPtoFUMNBAdqyXPHAPKJoxbLFmLjXvNt5_JardMRZzhX3rEUqIyLjGaOppHv9i7lhjf_yFxlwF9C_GPKCQ9hsmsqoUIufHoDOMUz7tMnW_5FO92FVCpmipDzzmz_rL6qRTRECSgrbOwTxpvV8JVhkuFtvTXuxTgBm8JShKvTU5HW6AIQT_UB_2jVKYj8AFoNRdUYEDL9opfPluqJftYcqVTcZFQyC24FhWq8gVaovDIqb32lWBwzYsiFzDNc61NvhIMA3PVvcti0yl0z1jzmV0kXzCKeM2sG6smtfUW3JuVzgHbJges9lNM4gD2xGYmg5Fnu0l6vHPcbEqYEnUwrhiKHFy5p5Xh45__l6U1RRs1lj5gIhq99kZcPRWD2R14CgnOZ3AhbeK05Bm7y4h17ASTuutz_i3CkBi4rVmGYu2QJ4GtahRT8UEBgVKLaOl89aUaL9_t3CD_C8qEc7OvvnivNI6mcbb3hKh-PoYxktexsBg0-LbaiOh1rDXMRJsm3Cyjr2OjuuExB-m-ywjMEq_PhgUiUzq9E0FzYve_3GBzO5GdwSAUfrnfz3AAuPFfrVtD823epql-SBXVw3nXKxrHbJvdmtUV6j8NZPi-LoIxh9_7lOa5C6ROE2ZY_6aRtYNDUlhlnkS1t62UteAg7kIKgxSjMEtaJabClQAoopLYxYkVm1Mm1dGwavYDZRXh0H2LuNkL_xURD0GzbOXAMIKj1KRNIeOFTcRghja5SRtVfNJ-hV_byRMTbHgSJYA==
@@ -0,0 +1 @@
1
+ pyflyby.egg-info
@@ -0,0 +1 @@
1
+ *.pyc
@@ -31,6 +31,7 @@ from pyflyby._interactive import (disable_auto_importer,
31
31
  unload_ipython_extension)
32
32
  from pyflyby._livepatch import livepatch, xreload
33
33
  from pyflyby._log import logger
34
+ from pyflyby._modules import rebuild_import_cache
34
35
  from pyflyby._parse import PythonBlock, PythonStatement
35
36
  from pyflyby._saveframe import saveframe
36
37
  from pyflyby._saveframe_reader \