omdev 0.0.0.dev140__tar.gz → 0.0.0.dev141__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 omdev might be problematic. Click here for more details.

Files changed (166) hide show
  1. {omdev-0.0.0.dev140/omdev.egg-info → omdev-0.0.0.dev141}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/.manifests.json +12 -0
  3. omdev-0.0.0.dev141/omdev/tools/cloc.py +149 -0
  4. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141/omdev.egg-info}/PKG-INFO +2 -2
  5. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev.egg-info/SOURCES.txt +1 -0
  6. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev.egg-info/requires.txt +1 -1
  7. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/pyproject.toml +2 -2
  8. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/LICENSE +0 -0
  9. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/MANIFEST.in +0 -0
  10. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/README.rst +0 -0
  11. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/__about__.py +0 -0
  12. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/__init__.py +0 -0
  13. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/amalg/__init__.py +0 -0
  14. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/amalg/__main__.py +0 -0
  15. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/amalg/amalg.py +0 -0
  16. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/antlr/__init__.py +0 -0
  17. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/antlr/consts.py +0 -0
  18. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/antlr/gen.py +0 -0
  19. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/bracepy.py +0 -0
  20. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/__init__.py +0 -0
  21. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/__init__.py +0 -0
  22. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/cache.py +0 -0
  23. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/contexts.py +0 -0
  24. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/currents.py +0 -0
  25. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/fns.py +0 -0
  26. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/resolvers.py +0 -0
  27. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/storage.py +0 -0
  28. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/compute/types.py +0 -0
  29. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/__init__.py +0 -0
  30. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/actions.py +0 -0
  31. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/cache.py +0 -0
  32. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/consts.py +0 -0
  33. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/defaults.py +0 -0
  34. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/manifests.py +0 -0
  35. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cache/data/specs.py +0 -0
  36. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/__init__.py +0 -0
  37. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_boilerplate.cc +0 -0
  38. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/LICENSE +0 -0
  39. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/__init__.py +0 -0
  40. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/build_ext.py +0 -0
  41. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  42. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  43. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/compilers/options.py +0 -0
  44. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  45. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/dir_util.py +0 -0
  46. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/errors.py +0 -0
  47. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/extension.py +0 -0
  48. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/file_util.py +0 -0
  49. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/modified.py +0 -0
  50. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/spawn.py +0 -0
  51. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/sysconfig.py +0 -0
  52. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/util.py +0 -0
  53. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/_distutils/version.py +0 -0
  54. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/build.py +0 -0
  55. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/cmake.py +0 -0
  56. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/importhook.py +0 -0
  57. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/magic.py +0 -0
  58. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cexts/scan.py +0 -0
  59. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/classdot.py +0 -0
  60. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/__init__.py +0 -0
  61. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/__main__.py +0 -0
  62. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/_pathhack.py +0 -0
  63. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/clicli.py +0 -0
  64. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/install.py +0 -0
  65. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/main.py +0 -0
  66. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/managers.py +0 -0
  67. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cli/types.py +0 -0
  68. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/clipboard/__init__.py +0 -0
  69. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/clipboard/clipboard.py +0 -0
  70. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/clipboard/darwin_cf.py +0 -0
  71. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/clipboard/linux_x11.py +0 -0
  72. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/cmake.py +0 -0
  73. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/findimports.py +0 -0
  74. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/git.py +0 -0
  75. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/imgur.py +0 -0
  76. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/__init__.py +0 -0
  77. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/__main__.py +0 -0
  78. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/cli.py +0 -0
  79. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/inspect.py +0 -0
  80. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/providers.py +0 -0
  81. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/pyenv.py +0 -0
  82. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/resolvers.py +0 -0
  83. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/standalone.py +0 -0
  84. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/system.py +0 -0
  85. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/interp/types.py +0 -0
  86. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/__init__.py +0 -0
  87. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/__main__.py +0 -0
  88. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/cli.py +0 -0
  89. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/formats.py +0 -0
  90. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/io.py +0 -0
  91. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/parsing.py +0 -0
  92. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/processing.py +0 -0
  93. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/json/rendering.py +0 -0
  94. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/magic/__init__.py +0 -0
  95. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/magic/find.py +0 -0
  96. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/magic/magic.py +0 -0
  97. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/magic/prepare.py +0 -0
  98. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/magic/styles.py +0 -0
  99. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/manifests/__init__.py +0 -0
  100. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/manifests/build.py +0 -0
  101. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/manifests/load.py +0 -0
  102. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/manifests/types.py +0 -0
  103. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/mypy/__init__.py +0 -0
  104. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/mypy/debug.py +0 -0
  105. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/__init__.py +0 -0
  106. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/marshal.py +0 -0
  107. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/names.py +0 -0
  108. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/requires.py +0 -0
  109. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/specifiers.py +0 -0
  110. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/packaging/versions.py +0 -0
  111. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pip.py +0 -0
  112. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/__init__.py +0 -0
  113. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/__main__.py +0 -0
  114. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/base.py +0 -0
  115. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/git.py +0 -0
  116. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/lite.py +0 -0
  117. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/main.py +0 -0
  118. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/manifests.py +0 -0
  119. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/precheck/scripts.py +0 -0
  120. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/ptk/__init__.py +0 -0
  121. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/ptk/apps/__init__.py +0 -0
  122. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/ptk/apps/ncdu.py +0 -0
  123. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pycharm/__init__.py +0 -0
  124. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pycharm/__main__.py +0 -0
  125. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pycharm/cli.py +0 -0
  126. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/__init__.py +0 -0
  127. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/__main__.py +0 -0
  128. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/cexts.py +0 -0
  129. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/cli.py +0 -0
  130. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/configs.py +0 -0
  131. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/pkg.py +0 -0
  132. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/pyproject/reqs.py +0 -0
  133. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/revisions.py +0 -0
  134. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/__init__.py +0 -0
  135. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/bumpversion.py +0 -0
  136. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/execrss.py +0 -0
  137. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/exectime.py +0 -0
  138. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/importtrace.py +0 -0
  139. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/interp.py +0 -0
  140. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/pyproject.py +0 -0
  141. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/slowcat.py +0 -0
  142. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/scripts/tmpexec.py +0 -0
  143. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/secrets.py +0 -0
  144. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tokens.py +0 -0
  145. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/toml/__init__.py +0 -0
  146. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/toml/parser.py +0 -0
  147. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/toml/writer.py +0 -0
  148. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/__init__.py +0 -0
  149. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/doc.py +0 -0
  150. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/docker.py +0 -0
  151. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/git.py +0 -0
  152. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/importscan.py +0 -0
  153. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/mkrelimp.py +0 -0
  154. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/notebook.py +0 -0
  155. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/pawk/__init__.py +0 -0
  156. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/pawk/__main__.py +0 -0
  157. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/pawk/pawk.py +0 -0
  158. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/pip.py +0 -0
  159. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/prof.py +0 -0
  160. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/qr.py +0 -0
  161. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/tools/sqlrepl.py +0 -0
  162. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev/wheelfile.py +0 -0
  163. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev.egg-info/dependency_links.txt +0 -0
  164. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev.egg-info/entry_points.txt +0 -0
  165. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/omdev.egg-info/top_level.txt +0 -0
  166. {omdev-0.0.0.dev140 → omdev-0.0.0.dev141}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev140
3
+ Version: 0.0.0.dev141
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev140
15
+ Requires-Dist: omlish==0.0.0.dev141
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -230,6 +230,18 @@
230
230
  }
231
231
  }
232
232
  },
233
+ {
234
+ "module": ".tools.cloc",
235
+ "attr": "_CLI_MODULE",
236
+ "file": "omdev/tools/cloc.py",
237
+ "line": 144,
238
+ "value": {
239
+ "$.cli.types.CliModule": {
240
+ "cmd_name": "cloc",
241
+ "mod_name": "omdev.tools.cloc"
242
+ }
243
+ }
244
+ },
233
245
  {
234
246
  "module": ".tools.doc",
235
247
  "attr": "_CLI_MODULE",
@@ -0,0 +1,149 @@
1
+ import dataclasses as dc
2
+ import os
3
+ import re
4
+ import typing as ta
5
+
6
+ from ..cli import CliModule
7
+
8
+
9
+ SUPPORTED_EXTENSIONS: ta.Mapping[str, str] = {
10
+ '.c': 'c',
11
+ '.cpp': 'c',
12
+ '.h': 'c',
13
+ '.hpp': 'c',
14
+ '.py': 'python',
15
+ '.js': 'javascript',
16
+ }
17
+
18
+
19
+ COMMENT_PATTERNS: ta.Mapping[str, tuple[str, str | None, str | None]] = {
20
+ 'c': (r'//', r'/\*', r'\*/'),
21
+ 'python': (r'#', None, None),
22
+ 'javascript': (r'//', r'/\*', r'\*/'),
23
+ }
24
+
25
+
26
+ @dc.dataclass(frozen=True)
27
+ class FileLineCount:
28
+ loc: int
29
+ blanks: int
30
+ comments: int
31
+
32
+
33
+ def count_lines(file_path: str, language: str) -> FileLineCount:
34
+ single_line_comment, block_comment_start, block_comment_end = COMMENT_PATTERNS[language]
35
+
36
+ in_block_comment = False
37
+
38
+ loc = 0
39
+ blank_lines = 0
40
+ comment_lines = 0
41
+
42
+ with open(file_path, encoding='utf-8') as file:
43
+ for line in file:
44
+ stripped = line.strip()
45
+ if not stripped:
46
+ blank_lines += 1
47
+ continue
48
+
49
+ if in_block_comment:
50
+ comment_lines += 1
51
+ if block_comment_end and re.search(block_comment_end, stripped):
52
+ in_block_comment = False
53
+ continue
54
+
55
+ if block_comment_start and re.search(block_comment_start, stripped):
56
+ comment_lines += 1
57
+ if block_comment_end and not re.search(block_comment_end, stripped):
58
+ in_block_comment = True
59
+ continue
60
+
61
+ if single_line_comment and stripped.startswith(single_line_comment):
62
+ comment_lines += 1
63
+ continue
64
+
65
+ loc += 1
66
+
67
+ return FileLineCount(
68
+ loc=loc,
69
+ blanks=blank_lines,
70
+ comments=comment_lines,
71
+ )
72
+
73
+
74
+ def count_lines_in_directory(directory: str) -> ta.Mapping[str, FileLineCount]:
75
+ results: dict[str, FileLineCount] = {}
76
+ for root, _, files in os.walk(directory):
77
+ for file in files:
78
+ ext = os.path.splitext(file)[1]
79
+ if ext in SUPPORTED_EXTENSIONS:
80
+ language = SUPPORTED_EXTENSIONS[ext]
81
+ file_path = os.path.join(root, file)
82
+ results[file_path] = count_lines(file_path, language)
83
+ return results
84
+
85
+
86
+ def display_results(results: ta.Mapping[str, FileLineCount]) -> None:
87
+ total_loc = total_blanks = total_comments = 0
88
+ file_width = max(map(len, results))
89
+ dash_width = 41 + file_width
90
+
91
+ print(
92
+ f"{'File'.ljust(file_width)} "
93
+ f"{'LOC':<10} "
94
+ f"{'Blank Lines':<15} "
95
+ f"{'Comment Lines':<15}",
96
+ )
97
+
98
+ print('-' * dash_width)
99
+
100
+ for file, counts in sorted(results.items()):
101
+ loc, blanks, comments = counts.loc, counts.blanks, counts.comments
102
+ total_loc += loc
103
+ total_blanks += blanks
104
+ total_comments += comments
105
+ print(
106
+ f'{file.ljust(file_width)} '
107
+ f'{loc:<10} '
108
+ f'{blanks:<15} '
109
+ f'{comments:<15}',
110
+ )
111
+
112
+ print('-' * dash_width)
113
+
114
+ print(
115
+ f"{' ' * file_width} "
116
+ f"{'LOC':<10} "
117
+ f"{'Blank Lines':<15} "
118
+ f"{'Comment Lines':<15}",
119
+ )
120
+
121
+ print('-' * dash_width)
122
+
123
+ print(
124
+ f"{'Total'.ljust(file_width)} "
125
+ f"{total_loc:<10} "
126
+ f"{total_blanks:<15} "
127
+ f"{total_comments:<15}",
128
+ )
129
+
130
+
131
+ def _main() -> None:
132
+ import argparse
133
+
134
+ parser = argparse.ArgumentParser(description='Count lines of code in source files.')
135
+ parser.add_argument('directory', help='The directory to analyze.', nargs='+')
136
+ args = parser.parse_args()
137
+
138
+ for directory in args.directory:
139
+ results = count_lines_in_directory(directory)
140
+ display_results(results)
141
+ print()
142
+
143
+
144
+ # @omlish-manifest
145
+ _CLI_MODULE = CliModule('cloc', __name__)
146
+
147
+
148
+ if __name__ == '__main__':
149
+ _main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev140
3
+ Version: 0.0.0.dev141
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev140
15
+ Requires-Dist: omlish==0.0.0.dev141
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -148,6 +148,7 @@ omdev/toml/__init__.py
148
148
  omdev/toml/parser.py
149
149
  omdev/toml/writer.py
150
150
  omdev/tools/__init__.py
151
+ omdev/tools/cloc.py
151
152
  omdev/tools/doc.py
152
153
  omdev/tools/docker.py
153
154
  omdev/tools/git.py
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev140
1
+ omlish==0.0.0.dev141
2
2
 
3
3
  [all]
4
4
  black~=24.10
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '>=3.12'
15
- version = '0.0.0.dev140'
15
+ version = '0.0.0.dev141'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev140',
25
+ 'omlish == 0.0.0.dev141',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes