swagger-coverage 3.3.0__tar.gz → 3.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/PKG-INFO +26 -4
  2. swagger-coverage-3.3.0/swagger_coverage.egg-info/PKG-INFO → swagger_coverage-3.5.0/README.md +19 -18
  3. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/setup.py +3 -4
  4. swagger-coverage-3.3.0/README.md → swagger_coverage-3.5.0/swagger_coverage.egg-info/PKG-INFO +40 -4
  5. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage.egg-info/requires.txt +2 -2
  6. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/configs.py +6 -2
  7. swagger_coverage-3.5.0/swagger_coverage_py/docs_writers/api_doc_writer.py +56 -0
  8. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/listener.py +10 -2
  9. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/reporter.py +29 -4
  10. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/results_writers/base_schemas_manager.py +36 -18
  11. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/results_writers/openapi_schemas_manager.py +6 -1
  12. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/results_writers/swagger_schemas_manager.py +4 -1
  13. swagger-coverage-3.3.0/swagger_coverage_py/docs_writers/api_doc_writer.py +0 -32
  14. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/LICENSE +0 -0
  15. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/MANIFEST.in +0 -0
  16. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/setup.cfg +0 -0
  17. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage.egg-info/SOURCES.txt +0 -0
  18. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage.egg-info/dependency_links.txt +0 -0
  19. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage.egg-info/top_level.txt +0 -0
  20. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/__init__.py +0 -0
  21. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/docs_writers/__init__.py +0 -0
  22. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/request_schema_handler.py +0 -0
  23. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/results_writers/__init__.py +0 -0
  24. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/bin/swagger-coverage-commandline +0 -0
  25. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/bin/swagger-coverage-commandline.bat +0 -0
  26. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/btf-1.3.jar +0 -0
  27. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/checker-compat-qual-2.5.5.jar +0 -0
  28. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/checker-qual-3.12.0.jar +0 -0
  29. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-codec-1.11.jar +0 -0
  30. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-codec-1.9.jar +0 -0
  31. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-io-2.11.0.jar +0 -0
  32. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-io-2.6.jar +0 -0
  33. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-lang3-3.12.0.jar +0 -0
  34. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-lang3-3.7.jar +0 -0
  35. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/commons-logging-1.2.jar +0 -0
  36. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/error_prone_annotations-2.3.4.jar +0 -0
  37. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/error_prone_annotations-2.7.1.jar +0 -0
  38. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/failureaccess-1.0.1.jar +0 -0
  39. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/freemarker-2.3.31.jar +0 -0
  40. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/guava-28.2-android.jar +0 -0
  41. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/guava-31.0.1-android.jar +0 -0
  42. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/httpclient-4.5.13.jar +0 -0
  43. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/httpclient-4.5.2.jar +0 -0
  44. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/httpcore-4.4.13.jar +0 -0
  45. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/httpcore-4.4.4.jar +0 -0
  46. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/j2objc-annotations-1.3.jar +0 -0
  47. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-annotations-2.12.3.jar +0 -0
  48. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-core-2.12.3.jar +0 -0
  49. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-coreutils-2.0.jar +0 -0
  50. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-coreutils-equivalence-1.0.jar +0 -0
  51. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-databind-2.12.3.jar +0 -0
  52. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-dataformat-yaml-2.12.3.jar +0 -0
  53. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jackson-datatype-jsr310-2.9.8.jar +0 -0
  54. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jakarta.activation-api-1.2.1.jar +0 -0
  55. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jakarta.validation-api-2.0.2.jar +0 -0
  56. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jakarta.xml.bind-api-2.3.2.jar +0 -0
  57. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jcommander-1.81.jar +0 -0
  58. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/joda-time-2.10.5.jar +0 -0
  59. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jopt-simple-5.0.4.jar +0 -0
  60. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/json-patch-1.13.jar +0 -0
  61. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/json-schema-core-1.2.14.jar +0 -0
  62. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/json-schema-validator-2.2.14.jar +0 -0
  63. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/jsr305-3.0.2.jar +0 -0
  64. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/libphonenumber-8.11.1.jar +0 -0
  65. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar +0 -0
  66. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/logback-classic-1.2.10.jar +0 -0
  67. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/logback-core-1.2.10.jar +0 -0
  68. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/mailapi-1.6.2.jar +0 -0
  69. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/msg-simple-1.2.jar +0 -0
  70. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/rhino-1.7.7.2.jar +0 -0
  71. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/slf4j-api-1.7.32.jar +0 -0
  72. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/slf4j-ext-1.7.28.jar +0 -0
  73. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/snakeyaml-1.27.jar +0 -0
  74. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/spring-beans-5.3.7.jar +0 -0
  75. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/spring-core-5.3.7.jar +0 -0
  76. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/spring-jcl-5.3.7.jar +0 -0
  77. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/spring-web-5.3.7.jar +0 -0
  78. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-annotations-1.6.2.jar +0 -0
  79. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-annotations-1.6.6.jar +0 -0
  80. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-annotations-2.1.10.jar +0 -0
  81. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-annotations-2.2.0.jar +0 -0
  82. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-compat-spec-parser-1.0.54.jar +0 -0
  83. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-compat-spec-parser-1.0.59.jar +0 -0
  84. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-core-1.6.2.jar +0 -0
  85. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-core-1.6.6.jar +0 -0
  86. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-core-2.1.10.jar +0 -0
  87. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-core-2.2.0.jar +0 -0
  88. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-coverage-commandline-1.0-SNAPSHOT.jar +0 -0
  89. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-coverage-commons-1.0-SNAPSHOT.jar +0 -0
  90. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-models-1.6.2.jar +0 -0
  91. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-models-1.6.6.jar +0 -0
  92. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-models-2.1.10.jar +0 -0
  93. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-models-2.2.0.jar +0 -0
  94. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-1.0.54.jar +0 -0
  95. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-1.0.59.jar +0 -0
  96. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-2.0.25.jar +0 -0
  97. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-2.0.32.jar +0 -0
  98. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-core-2.0.25.jar +0 -0
  99. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-core-2.0.32.jar +0 -0
  100. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-v2-converter-2.0.25.jar +0 -0
  101. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-v2-converter-2.0.32.jar +0 -0
  102. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-v3-2.0.25.jar +0 -0
  103. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/swagger-parser-v3-2.0.32.jar +0 -0
  104. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/uri-template-0.10.jar +0 -0
  105. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/swagger-coverage-commandline/lib/validation-api-1.1.0.Final.jar +0 -0
  106. {swagger-coverage-3.3.0 → swagger_coverage-3.5.0}/swagger_coverage_py/uri.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: swagger-coverage
3
- Version: 3.3.0
3
+ Version: 3.5.0
4
4
  Summary: Python adapter for "swagger-coverage" tool
5
5
  Home-page: https://github.com/JamalZeynalov/swagger-coverage-py
6
6
  Author: Jamal Zeinalov
@@ -11,6 +11,13 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.6
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
+ Requires-Dist: requests>=2.31.0
15
+ Requires-Dist: Faker>=15.2.0
16
+ Requires-Dist: setuptools>=69.0.3
17
+ Requires-Dist: PyYAML>=6.0
18
+ Requires-Dist: python-dotenv>=0.21.0
19
+ Requires-Dist: rootpath==0.1.0
20
+ Requires-Dist: environs>=9.5.0
14
21
 
15
22
  ![Supported Python Versions](https://img.shields.io/badge/python-3.6-blue)
16
23
  ![Version](https://img.shields.io/badge/Version-2.0.1-blue)
@@ -21,7 +28,9 @@ License-File: LICENSE
21
28
 
22
29
  ## Original description summary:
23
30
 
24
- > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters, return codes or other conditions which corresponds specification of API.
31
+ > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying
32
+ > coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters,
33
+ > return codes or other conditions which corresponds specification of API.
25
34
 
26
35
  Some more info about the project you can also
27
36
  find [HERE](https://viclovsky.github.io/%D0%B0%D0%B2%D1%82%D0%BE%D1%82%D0%B5%D1%81%D1%82%D1%8B%20%D0%BD%D0%B0%20api/2020/01/16/swagger-coverage)
@@ -47,6 +56,7 @@ pip install swagger-coverage
47
56
  ```
48
57
 
49
58
  ### 2. Add environment variables (Optionally):
59
+
50
60
  ```dotenv
51
61
  API_DOCS_TYPE="swagger" # Note: "openapi" is default type of API docs
52
62
  API_DOCS_VERSION="2.0" # Note: "3.0.0" is default version of API docs
@@ -122,7 +132,8 @@ def setup_swagger_coverage():
122
132
  > `host` - The host of the API.
123
133
  > It will be used to download a swagger.json file and to identify the CoverageListener output directory for each API.
124
134
  >
125
- > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the target host)
135
+ > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the
136
+ > target host)
126
137
  >
127
138
  > `path_to_swagger_json` - A second part of the HTTP link to your OpenApi/Swagger documentation in JSON format<br>
128
139
  > &nbsp;&nbsp;&nbsp;&nbsp; Adapted `swagger-<api_name>.json` file will be created in your project root.<br>
@@ -144,6 +155,12 @@ def setup_swagger_coverage():
144
155
  ],
145
156
  "filter": []
146
157
  },
158
+ "paths": {
159
+ "enable": true,
160
+ "ignore": [
161
+ "/user/{username}"
162
+ ]
163
+ },
147
164
  "only-declared-status": {
148
165
  "enable": false
149
166
  },
@@ -159,10 +176,15 @@ def setup_swagger_coverage():
159
176
  }
160
177
  }
161
178
  ```
179
+ The `path` section is designed to exclude specific endpoints (all methods) from the final HTML report.
180
+ To do this, you need to set `enable` parameter to `true` and specify a list of endpoints (as you see them in the swagger doc) in the `ignore` section.
181
+ Then these endpoints will be removed from the API doc before it is saved locally.<br>
182
+ Note: Remove already downloaded API docs before running a new version of this lib.
162
183
 
163
184
  > ### If you have more than 1 API then this config MUST:
164
185
  > #### 1. Be created for each microservice which you track using `CoverageListener`.
165
- > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which may cause override in case you have multiple APIs
186
+ > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which
187
+ > may cause override in case you have multiple APIs
166
188
  > #### 2. Contain `writers` section with filename in the format: `swagger-coverage-report-<api_name>.html`
167
189
  > #### 3. Be placed in the root of your project
168
190
 
@@ -1,17 +1,3 @@
1
- Metadata-Version: 2.1
2
- Name: swagger-coverage
3
- Version: 3.3.0
4
- Summary: Python adapter for "swagger-coverage" tool
5
- Home-page: https://github.com/JamalZeynalov/swagger-coverage-py
6
- Author: Jamal Zeinalov
7
- Author-email: jamal.zeynalov@gmail.com
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: License :: OSI Approved :: MIT License
10
- Classifier: Operating System :: OS Independent
11
- Requires-Python: >=3.6
12
- Description-Content-Type: text/markdown
13
- License-File: LICENSE
14
-
15
1
  ![Supported Python Versions](https://img.shields.io/badge/python-3.6-blue)
16
2
  ![Version](https://img.shields.io/badge/Version-2.0.1-blue)
17
3
 
@@ -21,7 +7,9 @@ License-File: LICENSE
21
7
 
22
8
  ## Original description summary:
23
9
 
24
- > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters, return codes or other conditions which corresponds specification of API.
10
+ > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying
11
+ > coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters,
12
+ > return codes or other conditions which corresponds specification of API.
25
13
 
26
14
  Some more info about the project you can also
27
15
  find [HERE](https://viclovsky.github.io/%D0%B0%D0%B2%D1%82%D0%BE%D1%82%D0%B5%D1%81%D1%82%D1%8B%20%D0%BD%D0%B0%20api/2020/01/16/swagger-coverage)
@@ -47,6 +35,7 @@ pip install swagger-coverage
47
35
  ```
48
36
 
49
37
  ### 2. Add environment variables (Optionally):
38
+
50
39
  ```dotenv
51
40
  API_DOCS_TYPE="swagger" # Note: "openapi" is default type of API docs
52
41
  API_DOCS_VERSION="2.0" # Note: "3.0.0" is default version of API docs
@@ -122,7 +111,8 @@ def setup_swagger_coverage():
122
111
  > `host` - The host of the API.
123
112
  > It will be used to download a swagger.json file and to identify the CoverageListener output directory for each API.
124
113
  >
125
- > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the target host)
114
+ > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the
115
+ > target host)
126
116
  >
127
117
  > `path_to_swagger_json` - A second part of the HTTP link to your OpenApi/Swagger documentation in JSON format<br>
128
118
  > &nbsp;&nbsp;&nbsp;&nbsp; Adapted `swagger-<api_name>.json` file will be created in your project root.<br>
@@ -144,6 +134,12 @@ def setup_swagger_coverage():
144
134
  ],
145
135
  "filter": []
146
136
  },
137
+ "paths": {
138
+ "enable": true,
139
+ "ignore": [
140
+ "/user/{username}"
141
+ ]
142
+ },
147
143
  "only-declared-status": {
148
144
  "enable": false
149
145
  },
@@ -159,10 +155,15 @@ def setup_swagger_coverage():
159
155
  }
160
156
  }
161
157
  ```
158
+ The `path` section is designed to exclude specific endpoints (all methods) from the final HTML report.
159
+ To do this, you need to set `enable` parameter to `true` and specify a list of endpoints (as you see them in the swagger doc) in the `ignore` section.
160
+ Then these endpoints will be removed from the API doc before it is saved locally.<br>
161
+ Note: Remove already downloaded API docs before running a new version of this lib.
162
162
 
163
163
  > ### If you have more than 1 API then this config MUST:
164
164
  > #### 1. Be created for each microservice which you track using `CoverageListener`.
165
- > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which may cause override in case you have multiple APIs
165
+ > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which
166
+ > may cause override in case you have multiple APIs
166
167
  > #### 2. Contain `writers` section with filename in the format: `swagger-coverage-report-<api_name>.html`
167
168
  > #### 3. Be placed in the root of your project
168
169
 
@@ -211,4 +212,4 @@ Important remarks:
211
212
 
212
213
  ## License
213
214
 
214
- Swagger coverage is released under version 2.0 of the [Apache License](http://www.apache.org/licenses/LICENSE-2.0)
215
+ Swagger coverage is released under version 2.0 of the [Apache License](http://www.apache.org/licenses/LICENSE-2.0)
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setup(
7
7
  name="swagger-coverage",
8
- version="3.3.0",
8
+ version="3.5.0",
9
9
  author="Jamal Zeinalov",
10
10
  author_email="jamal.zeynalov@gmail.com",
11
11
  description='Python adapter for "swagger-coverage" tool',
@@ -19,14 +19,13 @@ setup(
19
19
  "Operating System :: OS Independent",
20
20
  ],
21
21
  install_requires=[
22
- "requests>=2.28.1",
22
+ "requests>=2.31.0",
23
23
  "Faker>=15.2.0",
24
- "setuptools>=65.5.1",
24
+ "setuptools>=69.0.3",
25
25
  "PyYAML>=6.0",
26
26
  "python-dotenv>=0.21.0",
27
27
  "rootpath==0.1.0",
28
28
  "environs>=9.5.0",
29
-
30
29
  ],
31
30
  python_requires=">=3.6",
32
31
  include_package_data=True,
@@ -1,3 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: swagger-coverage
3
+ Version: 3.5.0
4
+ Summary: Python adapter for "swagger-coverage" tool
5
+ Home-page: https://github.com/JamalZeynalov/swagger-coverage-py
6
+ Author: Jamal Zeinalov
7
+ Author-email: jamal.zeynalov@gmail.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Operating System :: OS Independent
11
+ Requires-Python: >=3.6
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: requests>=2.31.0
15
+ Requires-Dist: Faker>=15.2.0
16
+ Requires-Dist: setuptools>=69.0.3
17
+ Requires-Dist: PyYAML>=6.0
18
+ Requires-Dist: python-dotenv>=0.21.0
19
+ Requires-Dist: rootpath==0.1.0
20
+ Requires-Dist: environs>=9.5.0
21
+
1
22
  ![Supported Python Versions](https://img.shields.io/badge/python-3.6-blue)
2
23
  ![Version](https://img.shields.io/badge/Version-2.0.1-blue)
3
24
 
@@ -7,7 +28,9 @@
7
28
 
8
29
  ## Original description summary:
9
30
 
10
- > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters, return codes or other conditions which corresponds specification of API.
31
+ > Swagger-coverage gives a full picture about coverage of API tests (regression) based on OAS 2 (Swagger). By saying
32
+ > coverage we mean not a broad theme functionality, but presence (or absence) of calls defined by API methods, parameters,
33
+ > return codes or other conditions which corresponds specification of API.
11
34
 
12
35
  Some more info about the project you can also
13
36
  find [HERE](https://viclovsky.github.io/%D0%B0%D0%B2%D1%82%D0%BE%D1%82%D0%B5%D1%81%D1%82%D1%8B%20%D0%BD%D0%B0%20api/2020/01/16/swagger-coverage)
@@ -33,6 +56,7 @@ pip install swagger-coverage
33
56
  ```
34
57
 
35
58
  ### 2. Add environment variables (Optionally):
59
+
36
60
  ```dotenv
37
61
  API_DOCS_TYPE="swagger" # Note: "openapi" is default type of API docs
38
62
  API_DOCS_VERSION="2.0" # Note: "3.0.0" is default version of API docs
@@ -108,7 +132,8 @@ def setup_swagger_coverage():
108
132
  > `host` - The host of the API.
109
133
  > It will be used to download a swagger.json file and to identify the CoverageListener output directory for each API.
110
134
  >
111
- > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the target host)
135
+ > `cleanup_input_files()` - THis step deletes all files in the CoverageListener output directory (according to the
136
+ > target host)
112
137
  >
113
138
  > `path_to_swagger_json` - A second part of the HTTP link to your OpenApi/Swagger documentation in JSON format<br>
114
139
  > &nbsp;&nbsp;&nbsp;&nbsp; Adapted `swagger-<api_name>.json` file will be created in your project root.<br>
@@ -130,6 +155,12 @@ def setup_swagger_coverage():
130
155
  ],
131
156
  "filter": []
132
157
  },
158
+ "paths": {
159
+ "enable": true,
160
+ "ignore": [
161
+ "/user/{username}"
162
+ ]
163
+ },
133
164
  "only-declared-status": {
134
165
  "enable": false
135
166
  },
@@ -145,10 +176,15 @@ def setup_swagger_coverage():
145
176
  }
146
177
  }
147
178
  ```
179
+ The `path` section is designed to exclude specific endpoints (all methods) from the final HTML report.
180
+ To do this, you need to set `enable` parameter to `true` and specify a list of endpoints (as you see them in the swagger doc) in the `ignore` section.
181
+ Then these endpoints will be removed from the API doc before it is saved locally.<br>
182
+ Note: Remove already downloaded API docs before running a new version of this lib.
148
183
 
149
184
  > ### If you have more than 1 API then this config MUST:
150
185
  > #### 1. Be created for each microservice which you track using `CoverageListener`.
151
- > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which may cause override in case you have multiple APIs
186
+ > Otherwise, the default behavior will be applied, and your report will be saved as `swagger-coverage-report.html` which
187
+ > may cause override in case you have multiple APIs
152
188
  > #### 2. Contain `writers` section with filename in the format: `swagger-coverage-report-<api_name>.html`
153
189
  > #### 3. Be placed in the root of your project
154
190
 
@@ -197,4 +233,4 @@ Important remarks:
197
233
 
198
234
  ## License
199
235
 
200
- Swagger coverage is released under version 2.0 of the [Apache License](http://www.apache.org/licenses/LICENSE-2.0)
236
+ Swagger coverage is released under version 2.0 of the [Apache License](http://www.apache.org/licenses/LICENSE-2.0)
@@ -1,6 +1,6 @@
1
- requests>=2.28.1
1
+ requests>=2.31.0
2
2
  Faker>=15.2.0
3
- setuptools>=65.5.1
3
+ setuptools>=69.0.3
4
4
  PyYAML>=6.0
5
5
  python-dotenv>=0.21.0
6
6
  rootpath==0.1.0
@@ -9,6 +9,10 @@ env = Env()
9
9
  API_DOCS_TYPE = env.str("API_DOCS_TYPE", default="openapi") # "swagger"
10
10
  API_DOCS_VERSION = env.str("API_DOCS_VERSION", default="3.0.0") # "2.0"
11
11
  API_DOCS_FORMAT = env.str("API_DOCS_FORMAT", default="json") # "yaml"
12
- IS_DISABLED = env.bool("API_COVERAGE_REPORTS_DISABLED", default=False) # If True then requests won't be recorded
12
+ IS_DISABLED = env.bool(
13
+ "API_COVERAGE_REPORTS_DISABLED", default=False
14
+ ) # If True then requests won't be recorded
13
15
 
14
- DEBUG_MODE = env.bool("DEBUG_MODE", default=False) # Set to True to see commandline output
16
+ DEBUG_MODE = env.bool(
17
+ "DEBUG_MODE", default=False
18
+ ) # Set to True to see commandline output
@@ -0,0 +1,56 @@
1
+ import json
2
+
3
+ import requests
4
+ import yaml
5
+
6
+ from swagger_coverage_py.configs import API_DOCS_FORMAT, API_DOCS_TYPE
7
+
8
+
9
+ def __delete_ignored_paths_from_json(
10
+ api_doc_data: requests.Response, paths_to_delete: list
11
+ ) -> dict:
12
+ data: dict = api_doc_data.json()
13
+ for path in paths_to_delete:
14
+ if path in data["paths"]:
15
+ del data["paths"][path]
16
+ return data
17
+
18
+
19
+ def __delete_ignored_paths_from_yaml(
20
+ api_doc_data: requests.Response, paths_to_delete: list
21
+ ) -> dict:
22
+ data: dict = yaml.safe_load(str(api_doc_data.text))
23
+ for path in paths_to_delete:
24
+ if path in data["paths"]:
25
+ del data["paths"][path]
26
+ return data
27
+
28
+
29
+ def __write_api_doc_to_json(
30
+ file_path: str, api_doc_data: requests.Response, paths_to_delete: list
31
+ ):
32
+ api_doc_data = __delete_ignored_paths_from_json(api_doc_data, paths_to_delete)
33
+ if API_DOCS_TYPE == "swagger" and not api_doc_data.get("swagger", None):
34
+ api_doc_data["swagger"] = "2.0"
35
+
36
+ with open(file_path, "w+") as file:
37
+ file.write(json.dumps(api_doc_data))
38
+
39
+
40
+ def __write_api_doc_to_yaml(
41
+ file_path: str, api_doc_data: requests.Response, paths_to_delete: list
42
+ ):
43
+ data = __delete_ignored_paths_from_yaml(api_doc_data, paths_to_delete)
44
+
45
+ if API_DOCS_TYPE == "swagger" and not data.get("swagger", None):
46
+ data["swagger"] = "2.0"
47
+
48
+ with open(file_path, "w+") as file:
49
+ file.write(yaml.safe_dump(data, indent=4, sort_keys=False))
50
+
51
+
52
+ def write_api_doc_to_file(file_path: str, api_doc_data: dict, paths_to_delete: list):
53
+ if API_DOCS_FORMAT == "json":
54
+ __write_api_doc_to_json(file_path, api_doc_data, paths_to_delete)
55
+ else:
56
+ __write_api_doc_to_yaml(file_path, api_doc_data, paths_to_delete)
@@ -7,7 +7,13 @@ from swagger_coverage_py.uri import URI
7
7
 
8
8
  class CoverageListener:
9
9
  def __init__(
10
- self, method: str, base_url: str, raw_path: str, uri_params: dict, base_path: str = "", **kwargs
10
+ self,
11
+ method: str,
12
+ base_url: str,
13
+ raw_path: str,
14
+ uri_params: dict,
15
+ base_path: str = "",
16
+ **kwargs
11
17
  ):
12
18
  """Records an HTTP request as a file in swagger format
13
19
 
@@ -23,4 +29,6 @@ class CoverageListener:
23
29
  self.response = requests.request(method, self.__uri.full, **kwargs)
24
30
 
25
31
  if not IS_DISABLED:
26
- RequestSchemaHandler(self.__uri, method, self.response, kwargs).write_schema()
32
+ RequestSchemaHandler(
33
+ self.__uri, method, self.response, kwargs
34
+ ).write_schema()
@@ -1,9 +1,11 @@
1
+ import json
1
2
  import os
2
3
  import platform
3
4
  import re
4
5
  import shutil
5
6
  import subprocess
6
7
  from pathlib import Path
8
+ from typing import List
7
9
 
8
10
  import requests
9
11
 
@@ -17,14 +19,31 @@ class CoverageReporter:
17
19
  self.verify = verify
18
20
  self.swagger_doc_file = f"swagger-doc-{api_name}.{API_DOCS_FORMAT}"
19
21
  self.output_dir = self.__get_output_dir()
20
- self.ignore_requests = []
21
22
  self.swagger_coverage_config = f"swagger-coverage-config-{api_name}.json"
23
+ self.ignored_paths = self.__get_ignored_paths_from_config()
22
24
 
23
25
  def __get_output_dir(self):
24
26
  output_dir = "swagger-coverage-output"
25
27
  subdir = re.match(r"(^\w*)://(.*)", self.host).group(2)
26
28
  return f"{output_dir}/{subdir}"
27
29
 
30
+ def __get_ignored_paths_from_config(self) -> List[str]:
31
+ """Reads the swagger-coverage-config-<api_name>.json file and returns
32
+ a list of endpoints/paths to exclude from the report
33
+
34
+ """
35
+ paths_to_ignore = []
36
+ if not self.swagger_coverage_config:
37
+ return paths_to_ignore
38
+
39
+ with open(self.swagger_coverage_config, "r") as file:
40
+ data = json.load(file)
41
+ paths = data.get("rules").get("paths", {})
42
+ if paths.get("enable", False):
43
+ paths_to_ignore = paths.get("ignore")
44
+
45
+ return paths_to_ignore
46
+
28
47
  def setup(
29
48
  self, path_to_swagger_json: str, auth: object = None, cookies: dict = None
30
49
  ):
@@ -37,14 +56,20 @@ class CoverageReporter:
37
56
  """
38
57
  link_to_swagger_json = f"{self.host}{path_to_swagger_json}"
39
58
 
40
- response = requests.get(link_to_swagger_json, auth=auth, cookies=cookies, verify=self.verify)
59
+ response = requests.get(
60
+ link_to_swagger_json, auth=auth, cookies=cookies, verify=self.verify
61
+ )
41
62
  assert response.ok, (
42
63
  f"Swagger doc is not pulled. See details: "
43
64
  f"{response.status_code} {response.request.url}"
44
65
  f"{response.content}\n{response.content}"
45
66
  )
46
-
47
- write_api_doc_to_file(self.swagger_doc_file, response)
67
+ if self.swagger_coverage_config:
68
+ write_api_doc_to_file(
69
+ self.swagger_doc_file,
70
+ api_doc_data=response,
71
+ paths_to_delete=self.ignored_paths,
72
+ )
48
73
 
49
74
  def generate_report(self):
50
75
  inner_location = "swagger-coverage-commandline/bin/swagger-coverage-commandline"
@@ -17,13 +17,18 @@ class ApiDocsManagerBase:
17
17
  self._uri = uri
18
18
  self._method = method
19
19
  self._response: Response = response
20
- self.__other_request_params = kwargs
20
+ self._other_request_params = kwargs
21
21
 
22
22
  def _get_path_params(self) -> list:
23
23
  params_ = []
24
24
  for key, value in self._uri.uri_params.items():
25
25
  params_.append(
26
- {"name": key, "in": "path", "required": False, "x-example": urllib.parse.unquote(str(value))}
26
+ {
27
+ "name": key,
28
+ "in": "path",
29
+ "required": False,
30
+ "x-example": urllib.parse.unquote(str(value)),
31
+ }
27
32
  )
28
33
  return params_
29
34
 
@@ -55,11 +60,8 @@ class ApiDocsManagerBase:
55
60
  request_body: dict = {
56
61
  "content": {
57
62
  "application/json": {
58
- "schema": {
59
- "type": "object",
60
- "properties": properties
61
- },
62
- "example": json.loads(self._response.request.body)
63
+ "schema": {"type": "object", "properties": properties},
64
+ "example": json.loads(self._response.request.body),
63
65
  }
64
66
  }
65
67
  }
@@ -70,11 +72,9 @@ class ApiDocsManagerBase:
70
72
  "application/json": {
71
73
  "schema": {
72
74
  "type": "array",
73
- "items": {
74
- "type": items_type
75
- },
75
+ "items": {"type": items_type},
76
76
  },
77
- "example": json.loads(self._response.request.body)
77
+ "example": json.loads(self._response.request.body),
78
78
  }
79
79
  }
80
80
  }
@@ -85,7 +85,9 @@ class ApiDocsManagerBase:
85
85
  "schema": {
86
86
  "type": "string",
87
87
  },
88
- "example": urllib.parse.unquote(str(self._response.request.body))
88
+ "example": urllib.parse.unquote(
89
+ str(self._response.request.body)
90
+ ),
89
91
  }
90
92
  }
91
93
  }
@@ -94,21 +96,37 @@ class ApiDocsManagerBase:
94
96
 
95
97
  return request_body
96
98
 
97
- def _get_query_params(self) -> list:
98
- q_params = list(self.__other_request_params.get("params", {}).items())
99
+ def _get_other_request_params(self, params_key: str, params_in: str) -> list:
100
+ prams_raw = self._other_request_params.get(params_key, {})
101
+ if prams_raw:
102
+ params = list(prams_raw.items())
103
+ else:
104
+ params = []
105
+
99
106
  raw = self._uri.raw.split("?")
100
107
  if len(raw) > 1:
101
- q_params += [tuple(x.split("=")) for x in str(raw[1]).split("&")]
102
- if not q_params:
108
+ params += [tuple(x.split("=")) for x in str(raw[1]).split("&")]
109
+ if not params:
103
110
  return []
104
111
 
105
112
  params_ = []
106
- for key, value in q_params:
113
+ for key, value in params:
107
114
  params_.append(
108
- {"name": key, "in": "query", "required": False, "x-example": urllib.parse.unquote(str(value))}
115
+ {
116
+ "name": key,
117
+ "in": params_in,
118
+ "required": False,
119
+ "x-example": urllib.parse.unquote(str(value)),
120
+ }
109
121
  )
110
122
  return params_
111
123
 
124
+ def _get_query_params(self) -> list:
125
+ return self._get_other_request_params(params_key="params", params_in="query")
126
+
127
+ def _get_header_params(self) -> list:
128
+ return self._get_other_request_params(params_key="headers", params_in="header")
129
+
112
130
  def __get_output_subdir(self):
113
131
  return re.match(r"(^\w*)://(.*)", self._uri.host).group(2)
114
132
 
@@ -11,10 +11,15 @@ class OpenApiSchemasManager(ApiDocsManagerBase):
11
11
 
12
12
  def _paths(self):
13
13
  path_ = self._uri.raw.split("?")[0]
14
+ params = (
15
+ self._get_path_params()
16
+ + self._get_query_params()
17
+ + self._get_header_params()
18
+ )
14
19
  dict_ = {
15
20
  path_: {
16
21
  self._method: {
17
- "parameters": self._get_path_params() + self._get_query_params(),
22
+ "parameters": params,
18
23
  "responses": {self._response.status_code: {}},
19
24
  }
20
25
  }
@@ -29,7 +29,10 @@ class SwaggerSchemasManager(ApiDocsManagerBase):
29
29
  def _paths(self):
30
30
  path_ = self._uri.raw.split("?")[0]
31
31
  params = (
32
- self._get_path_params() + self._get_query_params() + self._get_body_params()
32
+ self._get_path_params()
33
+ + self._get_query_params()
34
+ + self._get_body_params()
35
+ + self._get_header_params()
33
36
  )
34
37
  dict_ = {
35
38
  path_: {
@@ -1,32 +0,0 @@
1
- import json
2
-
3
- import requests
4
- import yaml
5
-
6
- from swagger_coverage_py.configs import API_DOCS_FORMAT, API_DOCS_TYPE
7
-
8
-
9
- def __write_api_doc_to_json(file_path: str, api_doc_data: requests.Response):
10
- api_doc_data = api_doc_data.json()
11
- if API_DOCS_TYPE == "swagger" and not api_doc_data.get("swagger", None):
12
- api_doc_data["swagger"] = "2.0"
13
-
14
- with open(file_path, "w+") as file:
15
- file.write(json.dumps(api_doc_data))
16
-
17
-
18
- def __write_api_doc_to_yaml(file_path: str, api_doc_data: requests.Response):
19
- data = yaml.safe_load(str(api_doc_data.text))
20
-
21
- if API_DOCS_TYPE == "swagger" and not data.get("swagger", None):
22
- data["swagger"] = "2.0"
23
-
24
- with open(file_path, "w+") as file:
25
- file.write(yaml.safe_dump(data, indent=4, sort_keys=False))
26
-
27
-
28
- def write_api_doc_to_file(file_path: str, api_doc_data: requests.Response):
29
- if API_DOCS_FORMAT == "json":
30
- __write_api_doc_to_json(file_path, api_doc_data)
31
- else:
32
- __write_api_doc_to_yaml(file_path, api_doc_data)