git-pandas 2.7.0__tar.gz → 2.7.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.
Files changed (134) hide show
  1. {git_pandas-2.7.0 → git_pandas-2.7.1}/CHANGELOG.md +27 -0
  2. {git_pandas-2.7.0 → git_pandas-2.7.1}/PKG-INFO +1 -1
  3. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/conf.py +2 -2
  4. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/index.rst +1 -0
  5. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/project.rst +1 -1
  6. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/repository.rst +1 -1
  7. git_pandas-2.7.1/docs/source/result_schemas.rst +557 -0
  8. git_pandas-2.7.1/docs/source/schema_contracts.py +337 -0
  9. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/project.py +6 -2
  10. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/repository.py +34 -2
  11. {git_pandas-2.7.0 → git_pandas-2.7.1}/mcp_server/server.py +1 -1
  12. {git_pandas-2.7.0 → git_pandas-2.7.1}/pyproject.toml +1 -1
  13. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_edge_cases.py +5 -6
  14. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_commits_in_tags.py +11 -0
  15. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_edge_cases.py +4 -7
  16. git_pandas-2.7.1/tests/test_cache_parity.py +333 -0
  17. git_pandas-2.7.1/tests/test_limit_validation.py +98 -0
  18. git_pandas-2.7.1/tests/test_schema_contracts.py +119 -0
  19. {git_pandas-2.7.0 → git_pandas-2.7.1}/.cursor/rules/project_overview.mdc +0 -0
  20. {git_pandas-2.7.0 → git_pandas-2.7.1}/.cursor/rules/pytest_standards.mdc +0 -0
  21. {git_pandas-2.7.0 → git_pandas-2.7.1}/.cursor/rules/python_standards.mdc +0 -0
  22. {git_pandas-2.7.0 → git_pandas-2.7.1}/.cursor/rules/sphinx_docs_standards.mdc +0 -0
  23. {git_pandas-2.7.0 → git_pandas-2.7.1}/.cursor/rules/testing.mdc +0 -0
  24. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/ISSUE_TEMPLATE.md +0 -0
  25. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  26. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/workflows/docs.yml +0 -0
  27. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/workflows/pypi-publish.yml +0 -0
  28. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/workflows/test-docs-build.yml +0 -0
  29. {git_pandas-2.7.0 → git_pandas-2.7.1}/.github/workflows/test-suite.yml +0 -0
  30. {git_pandas-2.7.0 → git_pandas-2.7.1}/.gitignore +0 -0
  31. {git_pandas-2.7.0 → git_pandas-2.7.1}/.obvious/codebase-map.md +0 -0
  32. {git_pandas-2.7.0 → git_pandas-2.7.1}/.obvious/config.yml +0 -0
  33. {git_pandas-2.7.0 → git_pandas-2.7.1}/.obvious/obvious.md +0 -0
  34. {git_pandas-2.7.0 → git_pandas-2.7.1}/.obvious/skills/local-dev/SKILL.md +0 -0
  35. {git_pandas-2.7.0 → git_pandas-2.7.1}/CONTRIBUTING.md +0 -0
  36. {git_pandas-2.7.0 → git_pandas-2.7.1}/LICENSE.md +0 -0
  37. {git_pandas-2.7.0 → git_pandas-2.7.1}/Makefile +0 -0
  38. {git_pandas-2.7.0 → git_pandas-2.7.1}/README.md +0 -0
  39. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/AUDIT_REPORT.md +0 -0
  40. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/Makefile +0 -0
  41. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/make.bat +0 -0
  42. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/requirements.txt +0 -0
  43. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/CNAME +0 -0
  44. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/_static/custom.css +0 -0
  45. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/cache.rst +0 -0
  46. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/contributors.rst +0 -0
  47. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/performance.rst +0 -0
  48. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/remote_operations.rst +0 -0
  49. {git_pandas-2.7.0 → git_pandas-2.7.1}/docs/source/usecases.rst +0 -0
  50. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/__init__.py +0 -0
  51. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/attributes.py +0 -0
  52. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/bus_analysis.py +0 -0
  53. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/cache_management.py +0 -0
  54. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/cache_timestamps.py +0 -0
  55. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/cloud_repo.py +0 -0
  56. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/commit_history.py +0 -0
  57. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/cumulative_blame.py +0 -0
  58. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/definitions.py +0 -0
  59. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/file_change_rates.py +0 -0
  60. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/hours_estimate.py +0 -0
  61. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/img/cumulative_blame.png +0 -0
  62. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/img/cumulative_project_blame.png +0 -0
  63. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/img/githubblame.png +0 -0
  64. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/img/lifeline.png +0 -0
  65. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/img/stravalib_cumulative_blame.png +0 -0
  66. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/lifeline.py +0 -0
  67. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/parallel_blame.py +0 -0
  68. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/project_blame.py +0 -0
  69. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/punchcard.py +0 -0
  70. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/release_analytics.py +0 -0
  71. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/remote_fetch_and_cache_warming.py +0 -0
  72. {git_pandas-2.7.0 → git_pandas-2.7.1}/examples/repo_file_detail.py +0 -0
  73. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/__init__.py +0 -0
  74. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/cache.py +0 -0
  75. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/logging.py +0 -0
  76. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/utilities/__init__.py +0 -0
  77. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/utilities/check_api.py +0 -0
  78. {git_pandas-2.7.0 → git_pandas-2.7.1}/gitpandas/utilities/plotting.py +0 -0
  79. {git_pandas-2.7.0 → git_pandas-2.7.1}/img/cumulative_blame.png +0 -0
  80. {git_pandas-2.7.0 → git_pandas-2.7.1}/img/lifeline.png +0 -0
  81. {git_pandas-2.7.0 → git_pandas-2.7.1}/img/punchcard.png +0 -0
  82. {git_pandas-2.7.0 → git_pandas-2.7.1}/mcp_server/README.md +0 -0
  83. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/__init__.py +0 -0
  84. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/conftest.py +0 -0
  85. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/__init__.py +0 -0
  86. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_advanced.py +0 -0
  87. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_blame_file_detail_empty.py +0 -0
  88. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_blame_multi_repo.py +0 -0
  89. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_bus_factor.py +0 -0
  90. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_commits_in_tags.py +0 -0
  91. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_cumulative_blame_output_shape.py +0 -0
  92. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_date_source.py +0 -0
  93. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_default_branch_detection.py +0 -0
  94. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_error_handling.py +0 -0
  95. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_file_detail_author.py +0 -0
  96. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_github_profile.py +0 -0
  97. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_project_limit_allocation.py +0 -0
  98. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_properties.py +0 -0
  99. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_punchcard.py +0 -0
  100. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Project/test_revs_num_datapoints.py +0 -0
  101. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/__init__.py +0 -0
  102. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_advanced.py +0 -0
  103. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_bus_factor.py +0 -0
  104. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_cumulative_blame_duplicate_dates.py +0 -0
  105. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_cumulative_blame_output_shape.py +0 -0
  106. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_date_source.py +0 -0
  107. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_error_handling.py +0 -0
  108. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_file_change_history_values.py +0 -0
  109. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_file_detail.py +0 -0
  110. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_file_operations.py +0 -0
  111. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_file_owner_author.py +0 -0
  112. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_hours_estimate.py +0 -0
  113. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_properties.py +0 -0
  114. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_punchcard.py +0 -0
  115. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_rev_to_rev.py +0 -0
  116. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_Repository/test_revs_num_datapoints.py +0 -0
  117. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_bulk_fetch_warm.py +0 -0
  118. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_by_validation.py +0 -0
  119. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache.py +0 -0
  120. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_immutability.py +0 -0
  121. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_integration.py +0 -0
  122. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_key_consistency.py +0 -0
  123. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_management.py +0 -0
  124. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_threading.py +0 -0
  125. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cache_warming.py +0 -0
  126. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_cached_signatures.py +0 -0
  127. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_examples.py +0 -0
  128. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_logging.py +0 -0
  129. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_mcp_serialization.py +0 -0
  130. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_remote_fetch.py +0 -0
  131. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_repository_cache.py +0 -0
  132. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_utilities/test_check_api.py +0 -0
  133. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_utilities/test_init.py +0 -0
  134. {git_pandas-2.7.0 → git_pandas-2.7.1}/tests/test_utilities/test_plotting.py +0 -0
@@ -1,6 +1,33 @@
1
1
  Unreleased
2
2
  ==========
3
3
 
4
+ v2.7.1
5
+ ======
6
+
7
+ ## Documentation
8
+
9
+ * **NEW**: A "Result schemas" docs page lists the exact columns, index levels and dtype kinds of populated results for the core analysis methods on `Repository` and `ProjectDirectory`. It is generated from constants that `tests/test_schema_contracts.py` checks against real output.
10
+
11
+ ## Bug Fixes
12
+
13
+ ### Tag History Compatibility
14
+
15
+ * **FIXED**: `commits_in_tags()` converts time bounds to epoch seconds without deprecated generic-unit Timedelta division, avoiding the NumPy deprecation warning while preserving whole-second flooring.
16
+
17
+ ### MCP Datetime Serialization
18
+
19
+ * **FIXED**: The standalone MCP adapter serializes pandas 3 datetime columns at any resolution as timestamp strings, rather than overlooking columns that are not nanosecond-based.
20
+
21
+ ### Limit Validation
22
+
23
+ **Behavior change: a negative `limit` now raises `ValueError` instead of returning a result.** Git treats `max_count=-1` as unlimited, so a negative `limit` used to mean "everything" on some methods and "nothing" on others (a project-level `limit=-1` over two repositories returned 5, 0, 1 and 5 rows from `commit_history`, `file_change_history`, `hours_estimate` and `revs` on a 2x5-commit fixture).
24
+
25
+ * **FIXED**: `limit` must be `None` or a non-negative integer on `Repository.commit_history`, `file_change_history`, `file_change_rates`, `hours_estimate`, `revs`, `punchcard`, `cumulative_blame`, `parallel_cumulative_blame` and the matching `ProjectDirectory` methods. Negative values, booleans, floats and NaN raise `ValueError` before Git or cache access, so nothing is cached. `limit=0` (zero commits), `None` and positive integers behave as before; floats such as `limit=2.0` are now rejected rather than floored.
26
+
27
+ ## Testing & Quality
28
+
29
+ * **ENHANCED**: Value-level cached-versus-uncached parity coverage now checks every public analysis method and flags public methods missing from the coverage table.
30
+
4
31
  v2.7.0
5
32
  ======
6
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: git-pandas
3
- Version: 2.7.0
3
+ Version: 2.7.1
4
4
  Summary: A utility for interacting with data from git repositories as Pandas dataframes
5
5
  Project-URL: Documentation, https://gitpandas.mcginniscommawill.com
6
6
  Project-URL: Source, https://github.com/wdm0006/git-pandas
@@ -80,9 +80,9 @@ author = "Will McGinnis"
80
80
  # built documents.
81
81
  #
82
82
  # The short X.Y version.
83
- version = "2.5.0"
83
+ version = "2.7.1"
84
84
  # The full version, including alpha/beta/rc tags.
85
- release = "2.5.0"
85
+ release = "2.7.1"
86
86
 
87
87
  # The language for content autogenerated by Sphinx. Refer to documentation
88
88
  # for a list of supported languages.
@@ -117,6 +117,7 @@ For detailed information about the components and their usage, see:
117
117
  remote_operations
118
118
  performance
119
119
  usecases
120
+ result_schemas
120
121
  contributors
121
122
 
122
123
  Additional Resources
@@ -114,7 +114,7 @@ Common Parameters
114
114
  Most analysis methods support these filtering parameters:
115
115
 
116
116
  * **branch**: Branch to analyze (defaults to repository's default branch)
117
- * **limit**: Maximum number of commits to analyze
117
+ * **limit**: Maximum number of commits to analyze; must be ``None`` or a non-negative integer (excluding booleans). Invalid values raise ``ValueError``; zero selects no commits
118
118
  * **days**: Limit analysis to last N days
119
119
  * **ignore_globs**: List of glob patterns for files to ignore
120
120
  * **include_globs**: List of glob patterns for files to include
@@ -135,7 +135,7 @@ Common Parameters
135
135
  Most analysis methods support these filtering parameters:
136
136
 
137
137
  * **branch**: Branch to analyze (defaults to repository's default branch)
138
- * **limit**: Maximum number of commits to analyze
138
+ * **limit**: Maximum number of commits to analyze; must be ``None`` or a non-negative integer (excluding booleans). Invalid values raise ``ValueError``; zero selects no commits
139
139
  * **days**: Limit analysis to last N days
140
140
  * **ignore_globs**: List of glob patterns for files to ignore
141
141
  * **include_globs**: List of glob patterns for files to include
@@ -0,0 +1,557 @@
1
+ .. This page is generated: python docs/source/schema_contracts.py > docs/source/result_schemas.rst
2
+
3
+ Result schemas
4
+ ==============
5
+
6
+ Exact column order, index levels and dtype kinds of populated results, pinned by
7
+ ``tests/test_schema_contracts.py``. Kinds are ``str``, ``int``, ``float``, ``bool`` and ``datetime``
8
+ (UTC); they hold on pandas 2 and 3. Shapes differ between ``Repository`` and ``ProjectDirectory`` and
9
+ between populated and empty results; both are listed as they are today.
10
+
11
+ Repository.commit_history()
12
+ ---------------------------
13
+
14
+ Index: ``date`` (datetime)
15
+
16
+ UTC ``date`` index; includes a ``branch`` column.
17
+
18
+ .. list-table::
19
+ :header-rows: 1
20
+
21
+ * - Column
22
+ - Kind
23
+ * - ``author``
24
+ - str
25
+ * - ``committer``
26
+ - str
27
+ * - ``message``
28
+ - str
29
+ * - ``commit_sha``
30
+ - str
31
+ * - ``lines``
32
+ - int
33
+ * - ``insertions``
34
+ - int
35
+ * - ``deletions``
36
+ - int
37
+ * - ``net``
38
+ - int
39
+ * - ``branch``
40
+ - str
41
+ * - ``repository``
42
+ - str
43
+
44
+ ProjectDirectory.commit_history()
45
+ ---------------------------------
46
+
47
+ Index: ``(unnamed integer index)`` (int)
48
+
49
+ ``date`` is a column; the integer index restarts at 0 for each repository; no ``branch`` column.
50
+
51
+ .. list-table::
52
+ :header-rows: 1
53
+
54
+ * - Column
55
+ - Kind
56
+ * - ``repository``
57
+ - str
58
+ * - ``author``
59
+ - str
60
+ * - ``committer``
61
+ - str
62
+ * - ``date``
63
+ - datetime
64
+ * - ``message``
65
+ - str
66
+ * - ``commit_sha``
67
+ - str
68
+ * - ``lines``
69
+ - int
70
+ * - ``insertions``
71
+ - int
72
+ * - ``deletions``
73
+ - int
74
+ * - ``net``
75
+ - int
76
+
77
+ Repository.file_change_history()
78
+ --------------------------------
79
+
80
+ Index: ``date`` (datetime)
81
+
82
+ ``date`` is both the index and a column.
83
+
84
+ .. list-table::
85
+ :header-rows: 1
86
+
87
+ * - Column
88
+ - Kind
89
+ * - ``filename``
90
+ - str
91
+ * - ``insertions``
92
+ - int
93
+ * - ``deletions``
94
+ - int
95
+ * - ``lines``
96
+ - int
97
+ * - ``message``
98
+ - str
99
+ * - ``committer``
100
+ - str
101
+ * - ``author``
102
+ - str
103
+ * - ``date``
104
+ - datetime
105
+ * - ``repository``
106
+ - str
107
+
108
+ ProjectDirectory.file_change_history()
109
+ --------------------------------------
110
+
111
+ Index: ``(unnamed integer index)`` (int)
112
+
113
+ No ``lines`` column; ``date`` is a column on a default integer index.
114
+
115
+ .. list-table::
116
+ :header-rows: 1
117
+
118
+ * - Column
119
+ - Kind
120
+ * - ``repository``
121
+ - str
122
+ * - ``date``
123
+ - datetime
124
+ * - ``author``
125
+ - str
126
+ * - ``committer``
127
+ - str
128
+ * - ``message``
129
+ - str
130
+ * - ``filename``
131
+ - str
132
+ * - ``insertions``
133
+ - int
134
+ * - ``deletions``
135
+ - int
136
+
137
+ Repository.revs()
138
+ -----------------
139
+
140
+ Index: ``(unnamed integer index)`` (int)
141
+
142
+ ``date`` is epoch seconds stored as an integer column.
143
+
144
+ .. list-table::
145
+ :header-rows: 1
146
+
147
+ * - Column
148
+ - Kind
149
+ * - ``date``
150
+ - int
151
+ * - ``rev``
152
+ - str
153
+ * - ``repository``
154
+ - str
155
+
156
+ ProjectDirectory.revs()
157
+ -----------------------
158
+
159
+ Index: ``(unnamed integer index)`` (int)
160
+
161
+ ``date`` is epoch seconds stored as a float column.
162
+
163
+ .. list-table::
164
+ :header-rows: 1
165
+
166
+ * - Column
167
+ - Kind
168
+ * - ``repository``
169
+ - str
170
+ * - ``rev``
171
+ - str
172
+ * - ``date``
173
+ - float
174
+
175
+ Repository.blame(by='repository')
176
+ ---------------------------------
177
+
178
+ Index: ``committer`` (str)
179
+
180
+ .. list-table::
181
+ :header-rows: 1
182
+
183
+ * - Column
184
+ - Kind
185
+ * - ``loc``
186
+ - int
187
+ * - ``repository``
188
+ - str
189
+
190
+ ProjectDirectory.blame(by='repository')
191
+ ---------------------------------------
192
+
193
+ Index: ``committer`` (str)
194
+
195
+ No ``repository`` column.
196
+
197
+ .. list-table::
198
+ :header-rows: 1
199
+
200
+ * - Column
201
+ - Kind
202
+ * - ``loc``
203
+ - int
204
+
205
+ Repository.blame(by='file')
206
+ ---------------------------
207
+
208
+ Index: ``committer`` (str), ``file`` (str)
209
+
210
+ .. list-table::
211
+ :header-rows: 1
212
+
213
+ * - Column
214
+ - Kind
215
+ * - ``loc``
216
+ - int
217
+ * - ``repository``
218
+ - str
219
+
220
+ ProjectDirectory.blame(by='file')
221
+ ---------------------------------
222
+
223
+ Index: ``committer`` (str), ``file`` (str), ``repository`` (str)
224
+
225
+ ``repository`` is an index level, not a column.
226
+
227
+ .. list-table::
228
+ :header-rows: 1
229
+
230
+ * - Column
231
+ - Kind
232
+ * - ``loc``
233
+ - int
234
+
235
+ Repository.tags()
236
+ -----------------
237
+
238
+ Index: ``tag_date`` (datetime), ``commit_date`` (datetime)
239
+
240
+ .. list-table::
241
+ :header-rows: 1
242
+
243
+ * - Column
244
+ - Kind
245
+ * - ``tag``
246
+ - str
247
+ * - ``annotated``
248
+ - bool
249
+ * - ``annotation``
250
+ - nullable_str
251
+ * - ``tag_sha``
252
+ - nullable_str
253
+ * - ``commit_sha``
254
+ - str
255
+ * - ``repository``
256
+ - str
257
+
258
+ ProjectDirectory.tags()
259
+ -----------------------
260
+
261
+ Index: ``tag_date`` (datetime), ``commit_date`` (datetime)
262
+
263
+ .. list-table::
264
+ :header-rows: 1
265
+
266
+ * - Column
267
+ - Kind
268
+ * - ``tag``
269
+ - str
270
+ * - ``annotated``
271
+ - bool
272
+ * - ``annotation``
273
+ - nullable_str
274
+ * - ``tag_sha``
275
+ - nullable_str
276
+ * - ``commit_sha``
277
+ - str
278
+ * - ``repository``
279
+ - str
280
+
281
+ Repository.commits_in_tags()
282
+ ----------------------------
283
+
284
+ Index: ``tag_date`` (datetime), ``commit_date`` (datetime)
285
+
286
+ .. list-table::
287
+ :header-rows: 1
288
+
289
+ * - Column
290
+ - Kind
291
+ * - ``commit_sha``
292
+ - str
293
+ * - ``tag``
294
+ - str
295
+ * - ``repository``
296
+ - str
297
+
298
+ ProjectDirectory.commits_in_tags()
299
+ ----------------------------------
300
+
301
+ Index: ``tag_date`` (datetime), ``commit_date`` (datetime)
302
+
303
+ .. list-table::
304
+ :header-rows: 1
305
+
306
+ * - Column
307
+ - Kind
308
+ * - ``commit_sha``
309
+ - str
310
+ * - ``tag``
311
+ - str
312
+ * - ``repository``
313
+ - str
314
+
315
+ Repository.punchcard()
316
+ ----------------------
317
+
318
+ Index: ``(unnamed integer index)`` (int)
319
+
320
+ .. list-table::
321
+ :header-rows: 1
322
+
323
+ * - Column
324
+ - Kind
325
+ * - ``hour_of_day``
326
+ - int
327
+ * - ``day_of_week``
328
+ - int
329
+ * - ``lines``
330
+ - int
331
+ * - ``insertions``
332
+ - int
333
+ * - ``deletions``
334
+ - int
335
+ * - ``net``
336
+ - int
337
+
338
+ ProjectDirectory.punchcard()
339
+ ----------------------------
340
+
341
+ Index: ``(unnamed integer index)`` (int)
342
+
343
+ .. list-table::
344
+ :header-rows: 1
345
+
346
+ * - Column
347
+ - Kind
348
+ * - ``hour_of_day``
349
+ - int
350
+ * - ``day_of_week``
351
+ - int
352
+ * - ``lines``
353
+ - int
354
+ * - ``insertions``
355
+ - int
356
+ * - ``deletions``
357
+ - int
358
+ * - ``net``
359
+ - int
360
+
361
+ Repository.hours_estimate()
362
+ ---------------------------
363
+
364
+ Index: ``(unnamed integer index)`` (int)
365
+
366
+ .. list-table::
367
+ :header-rows: 1
368
+
369
+ * - Column
370
+ - Kind
371
+ * - ``committer``
372
+ - str
373
+ * - ``hours``
374
+ - float
375
+ * - ``repository``
376
+ - str
377
+
378
+ ProjectDirectory.hours_estimate()
379
+ ---------------------------------
380
+
381
+ Index: ``(unnamed integer index)`` (int)
382
+
383
+ .. list-table::
384
+ :header-rows: 1
385
+
386
+ * - Column
387
+ - Kind
388
+ * - ``committer``
389
+ - str
390
+ * - ``hours``
391
+ - float
392
+ * - ``repository``
393
+ - str
394
+
395
+ Repository.file_detail()
396
+ ------------------------
397
+
398
+ Index: ``(unnamed integer index)`` (int)
399
+
400
+ ``file`` is a column.
401
+
402
+ .. list-table::
403
+ :header-rows: 1
404
+
405
+ * - Column
406
+ - Kind
407
+ * - ``file``
408
+ - str
409
+ * - ``loc``
410
+ - int
411
+ * - ``file_owner``
412
+ - str
413
+ * - ``ext``
414
+ - str
415
+ * - ``last_edit_date``
416
+ - datetime
417
+ * - ``repository``
418
+ - str
419
+
420
+ ProjectDirectory.file_detail()
421
+ ------------------------------
422
+
423
+ Index: ``file`` (str), ``repository`` (str)
424
+
425
+ ``(file, repository)`` index; a stray ``index`` column of row numbers leaks through.
426
+
427
+ .. list-table::
428
+ :header-rows: 1
429
+
430
+ * - Column
431
+ - Kind
432
+ * - ``index``
433
+ - int
434
+ * - ``loc``
435
+ - int
436
+ * - ``file_owner``
437
+ - str
438
+ * - ``ext``
439
+ - str
440
+ * - ``last_edit_date``
441
+ - datetime
442
+
443
+ Repository.bus_factor(by='repository')
444
+ --------------------------------------
445
+
446
+ Index: ``(unnamed integer index)`` (int)
447
+
448
+ .. list-table::
449
+ :header-rows: 1
450
+
451
+ * - Column
452
+ - Kind
453
+ * - ``repository``
454
+ - str
455
+ * - ``bus factor``
456
+ - int
457
+
458
+ ProjectDirectory.bus_factor(by='projectd')
459
+ ------------------------------------------
460
+
461
+ Index: ``(unnamed integer index)`` (int)
462
+
463
+ Default grouping; the first column is named ``projectd``.
464
+
465
+ .. list-table::
466
+ :header-rows: 1
467
+
468
+ * - Column
469
+ - Kind
470
+ * - ``projectd``
471
+ - str
472
+ * - ``bus factor``
473
+ - int
474
+
475
+ Repository.bus_factor(by='file')
476
+ --------------------------------
477
+
478
+ Index: ``(unnamed integer index)`` (int)
479
+
480
+ .. list-table::
481
+ :header-rows: 1
482
+
483
+ * - Column
484
+ - Kind
485
+ * - ``file``
486
+ - str
487
+ * - ``bus factor``
488
+ - int
489
+ * - ``repository``
490
+ - str
491
+
492
+ ProjectDirectory.bus_factor(by='file')
493
+ --------------------------------------
494
+
495
+ Index: ``(unnamed integer index)`` (int)
496
+
497
+ .. list-table::
498
+ :header-rows: 1
499
+
500
+ * - Column
501
+ - Kind
502
+ * - ``file``
503
+ - str
504
+ * - ``bus factor``
505
+ - int
506
+ * - ``repository``
507
+ - str
508
+
509
+ ProjectDirectory.bus_factor(by='repository')
510
+ --------------------------------------------
511
+
512
+ Index: ``(unnamed integer index)`` (int)
513
+
514
+ ``bus factor`` has object dtype.
515
+
516
+ .. list-table::
517
+ :header-rows: 1
518
+
519
+ * - Column
520
+ - Kind
521
+ * - ``repository``
522
+ - str
523
+ * - ``bus factor``
524
+ - object
525
+
526
+ Empty results
527
+ -------------
528
+
529
+ Where the empty frame differs from the populated one:
530
+
531
+ .. list-table::
532
+ :header-rows: 1
533
+
534
+ * - Method
535
+ - Columns
536
+ - Index
537
+ * - Repository.file_change_history
538
+ - ``filename``, ``insertions``, ``deletions``, ``lines``, ``message``, ``committer``, ``author``
539
+ - (unnamed integer index)
540
+ * - Repository.revs
541
+ - ``date``, ``rev``
542
+ - (unnamed integer index)
543
+ * - Repository.tags
544
+ - ``tag_date``, ``commit_date``, ``tag``, ``annotated``, ``annotation``, ``tag_sha``, ``commit_sha``, ``repository``
545
+ - (unnamed integer index)
546
+ * - Repository.commits_in_tags
547
+ - ``commit_sha``, ``tag``, ``tag_date``, ``commit_date``
548
+ - (unnamed integer index)
549
+ * - ProjectDirectory.revs
550
+ - ``repository``, ``rev``
551
+ - (unnamed integer index)
552
+ * - ProjectDirectory.tags
553
+ - (none)
554
+ - (unnamed integer index)
555
+ * - ProjectDirectory.commits_in_tags
556
+ - ``commit_sha``, ``tag``, ``tag_date``, ``commit_date``
557
+ - (unnamed integer index)