docstring-generator-ext 2.0.5__tar.gz → 2.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/PKG-INFO +1 -1
  2. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/docstring_generator_ext.egg-info/PKG-INFO +1 -1
  3. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/pyproject.toml +1 -1
  4. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/FunctionFormat.cpp +43 -6
  5. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/FunctionFormat.hpp +6 -0
  6. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/GoogleDocstring.cpp +2 -0
  7. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/NumpyDocstring.cpp +3 -0
  8. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/docstringFormat.cpp +19 -9
  9. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/docstringFormat.hpp +3 -3
  10. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/parser.cpp +7 -2
  11. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/parser.hpp +3 -2
  12. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/MANIFEST.in +0 -0
  13. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/README.md +0 -0
  14. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/docstring_generator_ext.egg-info/SOURCES.txt +0 -0
  15. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/docstring_generator_ext.egg-info/dependency_links.txt +0 -0
  16. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/docstring_generator_ext.egg-info/requires.txt +0 -0
  17. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/docstring_generator_ext.egg-info/top_level.txt +0 -0
  18. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/setup.cfg +0 -0
  19. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/setup.py +0 -0
  20. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/GoogleDocstring.hpp +0 -0
  21. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/IDocstringFormat.cpp +0 -0
  22. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/IDocstringFormat.hpp +0 -0
  23. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/NumpyDocstring.hpp +0 -0
  24. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/ReStructuredDocstring.cpp +0 -0
  25. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/ReStructuredDocstring.hpp +0 -0
  26. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/docComparator.cpp +0 -0
  27. {docstring_generator_ext-2.0.5 → docstring_generator_ext-2.0.7}/src/docComparator.hpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docstring_generator_ext
3
- Version: 2.0.5
3
+ Version: 2.0.7
4
4
  Summary: Generate Docstrings with type-hint information.
5
5
  Author-email: FelixTheC <fberndt87@gmail.com>
6
6
  Classifier: Environment :: Console
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docstring_generator_ext
3
- Version: 2.0.5
3
+ Version: 2.0.7
4
4
  Summary: Generate Docstrings with type-hint information.
5
5
  Author-email: FelixTheC <fberndt87@gmail.com>
6
6
  Classifier: Environment :: Console
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "docstring_generator_ext"
3
- version = "2.0.5"
3
+ version = "2.0.7"
4
4
  description = "Generate Docstrings with type-hint information."
5
5
  authors = [
6
6
  { name = "FelixTheC", email = "fberndt87@gmail.com" },
@@ -1,6 +1,8 @@
1
1
  #include "FunctionFormat.hpp"
2
2
 
3
3
  #include <map>
4
+ #include <ranges>
5
+
4
6
  #include "parser.hpp"
5
7
 
6
8
  const std::map<std::string, ParameterKind> ParameterKinds = {
@@ -221,27 +223,62 @@ void FunctionDocstring::detect_format_style() noexcept {
221
223
  if (!detected_format_style.has_value())
222
224
  return -1;
223
225
 
224
- const auto get_end_pos = [](std::string &_docstring, StyleSections sections) {
225
- std::vector<size_t> res;
226
+ std::vector<std::string> lines;
227
+ lines.reserve(256);
228
+
229
+ for (const auto&line : std::views::split(docstring, '\n') | std::views::transform([](const auto &obj){ return std::string(obj.begin(), obj.end()); })) {
230
+ lines.emplace_back(remove_whitespace(line));
231
+ }
232
+
233
+ const auto get_end_pos = [](std::vector<std::string> &_lines, StyleSections sections) {
234
+ std::vector<int> res;
226
235
  std::ranges::for_each(
227
236
  sections,
228
237
  [&](const auto &line) {
229
- res.emplace_back(_docstring.find(line));
238
+ int idx = 0;
239
+ for (const auto &obj: _lines) {
240
+ if (obj.find(line) != std::string::npos) {
241
+ res.emplace_back(idx);
242
+ }
243
+ idx++;
244
+ }
230
245
  }
231
246
  );
232
247
  std::ranges::sort(res, std::less<>());
248
+ if (res.empty())
249
+ return -1;
233
250
  return res[0];
234
251
  };
235
252
 
253
+ int end_pos{};
236
254
  switch (*detected_format_style) {
237
255
  case DocstringFormatStyle::NUMPY:
238
- return get_end_pos(docstring, TypicalFormatStyle[0].second);
256
+ end_pos = get_end_pos(lines, TypicalSectionStyle[0].second);
257
+ break;
239
258
  case DocstringFormatStyle::GOOGLE:
240
- return get_end_pos(docstring, TypicalFormatStyle[1].second);
259
+ end_pos = get_end_pos(lines, TypicalSectionStyle[1].second);
260
+ break;
241
261
  case DocstringFormatStyle::reST:
242
- return get_end_pos(docstring, TypicalFormatStyle[2].second);
262
+ end_pos = get_end_pos(lines, TypicalSectionStyle[2].second);
263
+ break;
243
264
  }
244
265
 
266
+ if (end_pos == -1 || static_cast<size_t>(end_pos) > lines.size())
267
+ return -1;
268
+
269
+ std::string tmp = "";
270
+ lines.clear();
271
+ for (const auto&line : std::views::split(docstring, '\n') | std::views::transform([](const auto &obj){ return std::string(obj.begin(), obj.end()); })) {
272
+ lines.emplace_back(line);
273
+ }
274
+ for (int idx = 0; idx < end_pos; idx++) {
275
+ tmp += lines[idx];
276
+ if (idx + 1 < end_pos)
277
+ tmp += "\n";
278
+ }
279
+
280
+ docstring = tmp;
281
+
245
282
  return -1;
246
283
  }
247
284
 
@@ -31,6 +31,12 @@ constexpr std::array<std::pair<std::string_view, StyleSections>, 3> TypicalForma
31
31
  {"rest", {":param", ":returns:", ":raises"}}
32
32
  }};
33
33
 
34
+ constexpr std::array<std::pair<std::string_view, StyleSections>, 3> TypicalSectionStyle = {{
35
+ {"numpy", {"Parameters", "Returns", "Raises"}},
36
+ {"google", {"Args:", "Returns:", "Raises:"}},
37
+ {"rest", {":param", ":returns:", ":raises"}}
38
+ }};
39
+
34
40
  ParameterKind from_str(const std::string &kind);
35
41
  std::ostream &operator<<(std::ostream &out, ParameterKind const &obj) noexcept;
36
42
 
@@ -26,6 +26,8 @@ std::string GoogleDocstring::cleanArgsDescription(const std::string &arg, const
26
26
 
27
27
  if (const auto startPos = res.find(arg); startPos < std::string::npos) {
28
28
  const auto pos = startPos + arg.size() + 1;
29
+ if (pos > res.size())
30
+ return res;
29
31
  res = res.substr(pos, res.size() - pos);
30
32
  }
31
33
 
@@ -24,6 +24,9 @@ std::string NumpyDocstring::docstringArgs() noexcept {
24
24
  docstream << "\n";
25
25
  }
26
26
 
27
+ if (functionInfo.args.empty())
28
+ return "";
29
+
27
30
  docstream << current_py_tab << "Parameters\n";
28
31
  docstream << current_py_tab << "----------\n";
29
32
  std::ranges::for_each(
@@ -38,7 +38,7 @@ std::optional<std::string> read_file(const std::string &file_path) {
38
38
  return file_content;
39
39
  }
40
40
 
41
- std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const DocstringFormatStyle &formatStyle) {
41
+ std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const DocstringFormatStyle &formatStyle, const bool ignore_magic) {
42
42
  std::vector<FunctionInfo> infos{};
43
43
  py::module ast_module = py::module_::import("ast");
44
44
  const py::object generator_result = ast_module.attr("walk")(ast_module.attr("parse")(text));
@@ -49,7 +49,11 @@ std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const Doc
49
49
  obj,
50
50
  ast_module.attr("AsyncFunctionDef")
51
51
  )) {
52
- FunctionInfo function_info = analyze_function(obj, ast_module);
52
+ const auto res = analyze_function(obj, ast_module, ignore_magic);
53
+ if (!res.has_value()) {
54
+ continue;
55
+ }
56
+ FunctionInfo function_info = *res;
53
57
  function_info.update_descriptions(formatStyle);
54
58
  infos.emplace_back(function_info);
55
59
  }
@@ -58,13 +62,13 @@ std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const Doc
58
62
  return infos;
59
63
  }
60
64
 
61
- void parse_file(const std::string &file_path, const DocstringFormatStyle &formatStyle, const bool &allow_overwrite) {
65
+ void parse_file(const std::string &file_path, const DocstringFormatStyle &formatStyle, const bool &allow_overwrite, const bool &ignore_magic) {
62
66
  const auto result = read_file(file_path);
63
67
  if (!result.has_value()) {
64
68
  throw py::value_error(file_path + " is not a valid path.");
65
69
  }
66
70
 
67
- std::vector<FunctionInfo> infos = createFunctionInfos(*result, formatStyle);
71
+ std::vector<FunctionInfo> infos = createFunctionInfos(*result, formatStyle, ignore_magic);
68
72
 
69
73
  std::ranges::sort(
70
74
  infos,
@@ -92,7 +96,7 @@ void parse_file(const std::string &file_path, const DocstringFormatStyle &format
92
96
  #endif
93
97
  }
94
98
 
95
- std::map<std::string, int> check_docstrings(std::string &file_path) {
99
+ std::map<std::string, int> check_docstrings(std::string &file_path, const bool &ignore_magic) {
96
100
  int function_checked = 0;
97
101
  int complete_docstring = 0;
98
102
  int partial_docstring = 0;
@@ -109,7 +113,12 @@ std::map<std::string, int> check_docstrings(std::string &file_path) {
109
113
  )) {
110
114
  ++function_checked;
111
115
 
112
- const FunctionInfo function_info = analyze_function(obj, ast_module);
116
+ const auto res = analyze_function(obj, ast_module, ignore_magic);
117
+ if (!res.has_value()) {
118
+ continue;
119
+ }
120
+
121
+ const FunctionInfo function_info = *res;
113
122
 
114
123
  switch (compare_docstrings(function_info.docstring, function_info)) {
115
124
  case IS_EMPTY:
@@ -170,8 +179,7 @@ std::map<std::string, int> check_docstrings(std::string &file_path) {
170
179
  }
171
180
  if (allow_overwrite && *val.docstring.detected_format_style != formatStyle) {
172
181
  const auto pos = val.docstring.remove_old_format_style();
173
- if (pos >= 0)
174
- start_pos = pos;
182
+ if (pos >= 0) {}
175
183
  }
176
184
  }
177
185
 
@@ -232,13 +240,15 @@ PYBIND11_MODULE(docstring_generator_ext, m) {
232
240
  py::arg("file_path"),
233
241
  py::arg("formatStyle"),
234
242
  py::arg("allow_overwrite") = false,
243
+ py::arg("ignore_magic") = false,
235
244
  "The file_path where automatically docstrings should be added.",
236
245
  "In which style should the Docstring be written."
237
246
  );
238
247
  m.def(
239
248
  "check_docstring",
240
249
  &check_docstrings,
241
- py::arg("file_path")
250
+ py::arg("file_path"),
251
+ py::arg("ignore_magic") = false
242
252
  );
243
253
 
244
254
  py::enum_<DocstringFormatStyle>(m, "DocstringFormatStyle")
@@ -16,9 +16,9 @@ enum WriteResult {
16
16
 
17
17
  void get_docstring_arg_descr(FunctionInfo &functionInfo) noexcept;
18
18
 
19
- [[nodiscard]] std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const DocstringFormatStyle &formatStyle);
19
+ [[nodiscard]] std::vector<FunctionInfo> createFunctionInfos(const std::string &text, const DocstringFormatStyle &formatStyle, bool ignore_magic = false);
20
20
 
21
- void parse_file(const std::string &file_path, const DocstringFormatStyle &formatStyle, const bool &allow_overwrite = false);
21
+ void parse_file(const std::string &file_path, const DocstringFormatStyle &formatStyle, const bool &allow_overwrite = false, const bool &ignore_magic = false);
22
22
 
23
23
  /*
24
24
  * {
@@ -28,6 +28,6 @@ void parse_file(const std::string &file_path, const DocstringFormatStyle &format
28
28
  * 'no_docstrings': 0,
29
29
  * }
30
30
  */
31
- std::map<std::string, int> check_docstrings(std::string &file_path);
31
+ std::map<std::string, int> check_docstrings(std::string &file_path, const bool &ignore_magic = false);
32
32
 
33
33
  #endif //DOCSTRING_GENERATOR_EXT_DOCSTRINGFORMAT_HPP
@@ -454,9 +454,10 @@ void get_exception(
454
454
  }
455
455
  }
456
456
 
457
- FunctionInfo analyze_function(
457
+ std::optional<FunctionInfo> analyze_function(
458
458
  const pybind11::handle &obj,
459
- py::module &ast_module
459
+ py::module &ast_module,
460
+ bool ignore_magic
460
461
  ) noexcept {
461
462
  std::vector<FunctionException> function_exceptions{};
462
463
 
@@ -468,6 +469,10 @@ FunctionInfo analyze_function(
468
469
  auto name = py::cast<std::string>(py::getattr(obj, "name"));
469
470
  auto offset = py::cast<uint32_t>(py::getattr(obj, "col_offset"));
470
471
 
472
+ if (ignore_magic && name.starts_with("__")) {
473
+ return std::nullopt;
474
+ }
475
+
471
476
  FunctionDocstring doc_str = get_docstring(py::reinterpret_borrow<py::object>(obj), ast_module);
472
477
  doc_str.detect_format_style();
473
478
 
@@ -47,9 +47,10 @@ void get_exception(
47
47
  const py::object &parent = py::none()
48
48
  ) noexcept;
49
49
 
50
- FunctionInfo analyze_function(
50
+ [[nodiscard]] std::optional<FunctionInfo> analyze_function(
51
51
  const pybind11::handle &obj,
52
- py::module &ast_module
52
+ py::module &ast_module,
53
+ bool ignore_magic
53
54
  ) noexcept;
54
55
 
55
56
  #endif //DOCSTRING_GENERATOR_EXT_PARSER_HPP