├── .github └── workflows │ ├── deutschland_generator.yaml │ └── openapi_check.yaml ├── CNAME ├── README.md ├── generator_config.yaml ├── index.html ├── openapi.yaml └── python-client ├── .openapi-generator-ignore ├── .openapi-generator ├── FILES └── VERSION ├── README.md ├── deutschland └── destatis │ ├── __init__.py │ ├── api │ ├── __init__.py │ └── default_api.py │ ├── api_client.py │ ├── apis │ └── __init__.py │ ├── configuration.py │ ├── exceptions.py │ ├── model │ └── __init__.py │ ├── model_utils.py │ ├── models │ └── __init__.py │ └── rest.py ├── docs └── DefaultApi.md ├── pyproject.toml ├── requirements.txt ├── sphinx-docs ├── Makefile ├── conf.py ├── index.rst ├── make.bat └── source │ ├── destatis.api.rst │ ├── destatis.apis.rst │ ├── destatis.model.rst │ ├── destatis.models.rst │ ├── destatis.rst │ └── modules.rst ├── test-requirements.txt ├── test ├── __init__.py └── test_default_api.py └── tox.ini /.github/workflows/deutschland_generator.yaml: -------------------------------------------------------------------------------- 1 | on: [push] 2 | jobs: 3 | deutschland_generation: 4 | name: "Deutschland Generation" 5 | runs-on: ubuntu-latest 6 | strategy: 7 | fail-fast: false 8 | matrix: 9 | python-version: ['3.11.1' ] 10 | steps: 11 | - uses: actions/checkout@v3 12 | 13 | # Create default .spectral.yaml file used for linting if its not existing already 14 | - name: "Create spectral file if it not exists" 15 | continue-on-error: true 16 | run: | 17 | set -C; echo "extends: spectral:oas" > .spectral.yaml 18 | 19 | # Runs a single command using the runners shell 20 | - name: "Lint file" 21 | uses: stoplightio/spectral-action@latest 22 | with: 23 | file_glob: "openapi.yaml" 24 | 25 | - name: "Generate deutschland code" 26 | uses: wirthual/deutschland-generator-action@latest 27 | with: 28 | openapi-file: ${{ github.workspace }}/openapi.yaml 29 | commit-to-git: true 30 | upload-to-pypi: true 31 | upload-to-testpypi: false 32 | pypi-token: ${{ secrets.PYPI_PRODUCTION }} 33 | testpypi-token: ${{ secrets.PYPI_TEST }} 34 | python-version: ${{ matrix.python-version }} 35 | -------------------------------------------------------------------------------- /.github/workflows/openapi_check.yaml: -------------------------------------------------------------------------------- 1 | on: [push, pull_request] 2 | jobs: 3 | openapi_check: 4 | name: "OpenAPI check" 5 | runs-on: ubuntu-latest 6 | steps: 7 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 8 | - uses: actions/checkout@v3 9 | 10 | # Create default .spectral.yaml file used for linting if its not existing already 11 | - name: "Create spectral file if it not exists" 12 | continue-on-error: true 13 | run: | 14 | set -C; echo "extends: spectral:oas" > .spectral.yaml 15 | 16 | # Run Spectral 17 | - uses: stoplightio/spectral-action@latest 18 | with: 19 | file_glob: openapi.yaml 20 | spectral_ruleset: .spectral.yaml 21 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | destatis.api.bund.dev -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # destatis-api 2 | 3 | 4 | Note: Obwohl die Website des DESTATIS behauptet die Nutzung sei kostenfrei und ohne Registrierung möglich, scheint es dennoch nötig ein login für die API anzugeben. Das default login, was die Spezifikation vorgibt funktioniert leider nicht. -------------------------------------------------------------------------------- /generator_config.yaml: -------------------------------------------------------------------------------- 1 | templateDir: deutschland_templates # For local use: ./local/deutschland_templates 2 | additionalProperties: 3 | packageName: "destatis" 4 | infoName: "BundesAPI" 5 | infoEmail: "kontakt@bund.dev" 6 | packageVersion: 0.1.0 7 | packageUrl: "https://github.com/bundesAPI/destatis-api" 8 | namespace: "deutschland" 9 | docLanguage: "de" 10 | gitHost: "github.com" 11 | gitUserId: "bundesAPI" 12 | gitRepoId: "destatis-api" 13 | files: 14 | pyproject.mustache: 15 | destinationFilename: pyproject.toml 16 | templateType: SupportingFiles 17 | requirements.txt: {} 18 | create_doc.mustache: 19 | destinationFilename: create_doc.py 20 | templateType: SupportingFiles 21 | rename_generated_code.mustache: 22 | destinationFilename: rename_generated_code.py 23 | templateType: SupportingFiles 24 | README.mustache: 25 | destinationFilename: README.md 26 | templateType: SupportingFiles 27 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Destatis API - Statistisches Bundesamt - OpenAPI Documentation 8 | 9 | 10 |
11 | 12 | 13 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /openapi.yaml: -------------------------------------------------------------------------------- 1 | swagger: '2.0' 2 | info: 3 | version: '1.0' 4 | title: Destatis-API 5 | host: www-genesis.destatis.de 6 | basePath: /genesisWS/rest/2020/ 7 | schemes: 8 | - https 9 | paths: 10 | /catalogue/cubes: 11 | parameters: [] 12 | get: 13 | parameters: 14 | - default: GAST 15 | in: query 16 | name: username 17 | required: false 18 | type: string 19 | - default: GAST 20 | in: query 21 | name: password 22 | required: false 23 | type: string 24 | - default: '' 25 | in: query 26 | name: selection 27 | required: false 28 | type: string 29 | - default: free 30 | in: query 31 | name: area 32 | required: false 33 | type: string 34 | - default: '100' 35 | in: query 36 | name: pagelength 37 | required: false 38 | type: string 39 | - default: de 40 | in: query 41 | name: language 42 | required: false 43 | type: string 44 | responses: 45 | '200': 46 | description: Successful Response 47 | operationId: cubes 48 | /catalogue/cubes2statistic: 49 | parameters: [] 50 | get: 51 | parameters: 52 | - default: GAST 53 | in: query 54 | name: username 55 | required: false 56 | type: string 57 | - default: GAST 58 | in: query 59 | name: password 60 | required: false 61 | type: string 62 | - default: '' 63 | in: query 64 | name: name 65 | required: false 66 | type: string 67 | - default: '' 68 | in: query 69 | name: selection 70 | required: false 71 | type: string 72 | - default: free 73 | in: query 74 | name: area 75 | required: false 76 | type: string 77 | - default: '100' 78 | in: query 79 | name: pagelength 80 | required: false 81 | type: string 82 | - default: de 83 | in: query 84 | name: language 85 | required: false 86 | type: string 87 | responses: 88 | '200': 89 | description: Successful Response 90 | operationId: cubes2statistic 91 | /catalogue/cubes2variable: 92 | parameters: [] 93 | get: 94 | parameters: 95 | - default: GAST 96 | in: query 97 | name: username 98 | required: false 99 | type: string 100 | - default: GAST 101 | in: query 102 | name: password 103 | required: false 104 | type: string 105 | - default: '' 106 | in: query 107 | name: name 108 | required: false 109 | type: string 110 | - default: '' 111 | in: query 112 | name: selection 113 | required: false 114 | type: string 115 | - default: free 116 | in: query 117 | name: area 118 | required: false 119 | type: string 120 | - default: '100' 121 | in: query 122 | name: pagelength 123 | required: false 124 | type: string 125 | - default: de 126 | in: query 127 | name: language 128 | required: false 129 | type: string 130 | responses: 131 | '200': 132 | description: Successful Response 133 | operationId: cubes2variable 134 | /catalogue/jobs: 135 | parameters: [] 136 | get: 137 | parameters: 138 | - default: GAST 139 | in: query 140 | name: username 141 | required: false 142 | type: string 143 | - default: GAST 144 | in: query 145 | name: password 146 | required: false 147 | type: string 148 | - default: '' 149 | in: query 150 | name: selection 151 | required: false 152 | type: string 153 | - default: Code 154 | in: query 155 | name: searchcriterion 156 | required: false 157 | type: string 158 | - default: Name 159 | in: query 160 | name: sortcriterion 161 | required: false 162 | type: string 163 | - default: Alle 164 | in: query 165 | name: type 166 | required: false 167 | type: string 168 | - default: '100' 169 | in: query 170 | name: pagelength 171 | required: false 172 | type: string 173 | - default: de 174 | in: query 175 | name: language 176 | required: false 177 | type: string 178 | responses: 179 | '200': 180 | description: Successful Response 181 | operationId: jobs 182 | /catalogue/modifieddata: 183 | parameters: [] 184 | get: 185 | parameters: 186 | - default: GAST 187 | in: query 188 | name: username 189 | required: false 190 | type: string 191 | - default: GAST 192 | in: query 193 | name: password 194 | required: false 195 | type: string 196 | - default: '' 197 | in: query 198 | name: selection 199 | required: false 200 | type: string 201 | - default: Alle 202 | in: query 203 | name: type 204 | required: false 205 | type: string 206 | - default: 01.01.1970 01:00 207 | in: query 208 | name: date 209 | required: false 210 | type: string 211 | - default: '100' 212 | in: query 213 | name: pagelength 214 | required: false 215 | type: string 216 | - default: de 217 | in: query 218 | name: language 219 | required: false 220 | type: string 221 | responses: 222 | '200': 223 | description: Successful Response 224 | operationId: modifieddata 225 | /catalogue/qualitysigns: 226 | parameters: [] 227 | get: 228 | parameters: 229 | - default: de 230 | in: query 231 | name: language 232 | required: false 233 | type: string 234 | responses: 235 | '200': 236 | description: Successful Response 237 | operationId: qualitysigns 238 | /catalogue/results: 239 | parameters: [] 240 | get: 241 | parameters: 242 | - default: GAST 243 | in: query 244 | name: username 245 | required: false 246 | type: string 247 | - default: GAST 248 | in: query 249 | name: password 250 | required: false 251 | type: string 252 | - default: '' 253 | in: query 254 | name: selection 255 | required: false 256 | type: string 257 | - default: free 258 | in: query 259 | name: area 260 | required: false 261 | type: string 262 | - default: '100' 263 | in: query 264 | name: pagelength 265 | required: false 266 | type: string 267 | - default: de 268 | in: query 269 | name: language 270 | required: false 271 | type: string 272 | responses: 273 | '200': 274 | description: Successful Response 275 | operationId: results 276 | /catalogue/statistics: 277 | parameters: [] 278 | get: 279 | parameters: 280 | - default: GAST 281 | in: query 282 | name: username 283 | required: false 284 | type: string 285 | - default: GAST 286 | in: query 287 | name: password 288 | required: false 289 | type: string 290 | - default: '' 291 | in: query 292 | name: selection 293 | required: false 294 | type: string 295 | - default: Code 296 | in: query 297 | name: searchcriterion 298 | required: false 299 | type: string 300 | - default: Name 301 | in: query 302 | name: sortcriterion 303 | required: false 304 | type: string 305 | - default: '100' 306 | in: query 307 | name: pagelength 308 | required: false 309 | type: string 310 | - default: de 311 | in: query 312 | name: language 313 | required: false 314 | type: string 315 | responses: 316 | '200': 317 | description: Successful Response 318 | operationId: statistics 319 | /catalogue/statistics2variable: 320 | parameters: [] 321 | get: 322 | parameters: 323 | - default: GAST 324 | in: query 325 | name: username 326 | required: false 327 | type: string 328 | - default: GAST 329 | in: query 330 | name: password 331 | required: false 332 | type: string 333 | - default: '' 334 | in: query 335 | name: name 336 | required: false 337 | type: string 338 | - default: '' 339 | in: query 340 | name: selection 341 | required: false 342 | type: string 343 | - default: free 344 | in: query 345 | name: area 346 | required: false 347 | type: string 348 | - default: Code 349 | in: query 350 | name: searchcriterion 351 | required: false 352 | type: string 353 | - default: Name 354 | in: query 355 | name: sortcriterion 356 | required: false 357 | type: string 358 | - default: '100' 359 | in: query 360 | name: pagelength 361 | required: false 362 | type: string 363 | - default: de 364 | in: query 365 | name: language 366 | required: false 367 | type: string 368 | responses: 369 | '200': 370 | description: Successful Response 371 | operationId: statistics2variable 372 | /catalogue/tables: 373 | parameters: [] 374 | get: 375 | parameters: 376 | - default: GAST 377 | in: query 378 | name: username 379 | required: false 380 | type: string 381 | - default: GAST 382 | in: query 383 | name: password 384 | required: false 385 | type: string 386 | - default: '' 387 | in: query 388 | name: selection 389 | required: false 390 | type: string 391 | - default: free 392 | in: query 393 | name: area 394 | required: false 395 | type: string 396 | - default: Code 397 | in: query 398 | name: searchcriterion 399 | required: false 400 | type: string 401 | - default: Code 402 | in: query 403 | name: sortcriterion 404 | required: false 405 | type: string 406 | - default: '100' 407 | in: query 408 | name: pagelength 409 | required: false 410 | type: string 411 | - default: de 412 | in: query 413 | name: language 414 | required: false 415 | type: string 416 | responses: 417 | '200': 418 | description: Successful Response 419 | operationId: tables 420 | /catalogue/tables2statistic: 421 | parameters: [] 422 | get: 423 | parameters: 424 | - default: GAST 425 | in: query 426 | name: username 427 | required: false 428 | type: string 429 | - default: GAST 430 | in: query 431 | name: password 432 | required: false 433 | type: string 434 | - default: '' 435 | in: query 436 | name: name 437 | required: false 438 | type: string 439 | - default: '' 440 | in: query 441 | name: selection 442 | required: false 443 | type: string 444 | - default: free 445 | in: query 446 | name: area 447 | required: false 448 | type: string 449 | - default: '100' 450 | in: query 451 | name: pagelength 452 | required: false 453 | type: string 454 | - default: de 455 | in: query 456 | name: language 457 | required: false 458 | type: string 459 | responses: 460 | '200': 461 | description: Successful Response 462 | operationId: tables2statistic 463 | /catalogue/tables2variable: 464 | parameters: [] 465 | get: 466 | parameters: 467 | - default: GAST 468 | in: query 469 | name: username 470 | required: false 471 | type: string 472 | - default: GAST 473 | in: query 474 | name: password 475 | required: false 476 | type: string 477 | - default: '' 478 | in: query 479 | name: name 480 | required: false 481 | type: string 482 | - default: '' 483 | in: query 484 | name: selection 485 | required: false 486 | type: string 487 | - default: free 488 | in: query 489 | name: area 490 | required: false 491 | type: string 492 | - default: '100' 493 | in: query 494 | name: pagelength 495 | required: false 496 | type: string 497 | - default: de 498 | in: query 499 | name: language 500 | required: false 501 | type: string 502 | responses: 503 | '200': 504 | description: Successful Response 505 | operationId: tables2variable 506 | /catalogue/terms: 507 | parameters: [] 508 | get: 509 | parameters: 510 | - default: GAST 511 | in: query 512 | name: username 513 | required: false 514 | type: string 515 | - default: GAST 516 | in: query 517 | name: password 518 | required: false 519 | type: string 520 | - default: '' 521 | in: query 522 | name: selection 523 | required: false 524 | type: string 525 | - default: '100' 526 | in: query 527 | name: pagelength 528 | required: false 529 | type: string 530 | - default: de 531 | in: query 532 | name: language 533 | required: false 534 | type: string 535 | responses: 536 | '200': 537 | description: Successful Response 538 | operationId: terms 539 | /catalogue/timeseries: 540 | parameters: [] 541 | get: 542 | parameters: 543 | - default: GAST 544 | in: query 545 | name: username 546 | required: false 547 | type: string 548 | - default: GAST 549 | in: query 550 | name: password 551 | required: false 552 | type: string 553 | - default: '' 554 | in: query 555 | name: selection 556 | required: false 557 | type: string 558 | - default: free 559 | in: query 560 | name: area 561 | required: false 562 | type: string 563 | - default: '100' 564 | in: query 565 | name: pagelength 566 | required: false 567 | type: string 568 | - default: de 569 | in: query 570 | name: language 571 | required: false 572 | type: string 573 | responses: 574 | '200': 575 | description: Successful Response 576 | operationId: timeseries 577 | /catalogue/timeseries2statistic: 578 | parameters: [] 579 | get: 580 | parameters: 581 | - default: GAST 582 | in: query 583 | name: username 584 | required: false 585 | type: string 586 | - default: GAST 587 | in: query 588 | name: password 589 | required: false 590 | type: string 591 | - default: '' 592 | in: query 593 | name: name 594 | required: false 595 | type: string 596 | - default: '' 597 | in: query 598 | name: selection 599 | required: false 600 | type: string 601 | - default: free 602 | in: query 603 | name: area 604 | required: false 605 | type: string 606 | - default: '100' 607 | in: query 608 | name: pagelength 609 | required: false 610 | type: string 611 | - default: de 612 | in: query 613 | name: language 614 | required: false 615 | type: string 616 | responses: 617 | '200': 618 | description: Successful Response 619 | operationId: timeseries2statistic 620 | /catalogue/timeseries2variable: 621 | parameters: [] 622 | get: 623 | parameters: 624 | - default: GAST 625 | in: query 626 | name: username 627 | required: false 628 | type: string 629 | - default: GAST 630 | in: query 631 | name: password 632 | required: false 633 | type: string 634 | - default: '' 635 | in: query 636 | name: name 637 | required: false 638 | type: string 639 | - default: '' 640 | in: query 641 | name: selection 642 | required: false 643 | type: string 644 | - default: free 645 | in: query 646 | name: area 647 | required: false 648 | type: string 649 | - default: '100' 650 | in: query 651 | name: pagelength 652 | required: false 653 | type: string 654 | - default: de 655 | in: query 656 | name: language 657 | required: false 658 | type: string 659 | responses: 660 | '200': 661 | description: Successful Response 662 | operationId: timeseries2variable 663 | /catalogue/values: 664 | parameters: [] 665 | get: 666 | parameters: 667 | - default: GAST 668 | in: query 669 | name: username 670 | required: false 671 | type: string 672 | - default: GAST 673 | in: query 674 | name: password 675 | required: false 676 | type: string 677 | - default: '' 678 | in: query 679 | name: selection 680 | required: false 681 | type: string 682 | - default: free 683 | in: query 684 | name: area 685 | required: false 686 | type: string 687 | - default: Code 688 | in: query 689 | name: searchcriterion 690 | required: false 691 | type: string 692 | - default: Name 693 | in: query 694 | name: sortcriterion 695 | required: false 696 | type: string 697 | - default: '100' 698 | in: query 699 | name: pagelength 700 | required: false 701 | type: string 702 | - default: de 703 | in: query 704 | name: language 705 | required: false 706 | type: string 707 | responses: 708 | '200': 709 | description: Successful Response 710 | operationId: values 711 | /catalogue/values2variable: 712 | parameters: [] 713 | get: 714 | parameters: 715 | - default: GAST 716 | in: query 717 | name: username 718 | required: false 719 | type: string 720 | - default: GAST 721 | in: query 722 | name: password 723 | required: false 724 | type: string 725 | - default: '' 726 | in: query 727 | name: name 728 | required: false 729 | type: string 730 | - default: '' 731 | in: query 732 | name: selection 733 | required: false 734 | type: string 735 | - default: free 736 | in: query 737 | name: area 738 | required: false 739 | type: string 740 | - default: Code 741 | in: query 742 | name: searchcriterion 743 | required: false 744 | type: string 745 | - default: Name 746 | in: query 747 | name: sortcriterion 748 | required: false 749 | type: string 750 | - default: '100' 751 | in: query 752 | name: pagelength 753 | required: false 754 | type: string 755 | - default: de 756 | in: query 757 | name: language 758 | required: false 759 | type: string 760 | responses: 761 | '200': 762 | description: Successful Response 763 | operationId: values2variable 764 | /catalogue/variables: 765 | parameters: [] 766 | get: 767 | parameters: 768 | - default: GAST 769 | in: query 770 | name: username 771 | required: false 772 | type: string 773 | - default: GAST 774 | in: query 775 | name: password 776 | required: false 777 | type: string 778 | - default: '' 779 | in: query 780 | name: selection 781 | required: false 782 | type: string 783 | - default: free 784 | in: query 785 | name: area 786 | required: false 787 | type: string 788 | - default: Code 789 | in: query 790 | name: searchcriterion 791 | required: false 792 | type: string 793 | - default: Name 794 | in: query 795 | name: sortcriterion 796 | required: false 797 | type: string 798 | - default: Alle 799 | in: query 800 | name: type 801 | required: false 802 | type: string 803 | - default: '100' 804 | in: query 805 | name: pagelength 806 | required: false 807 | type: string 808 | - default: de 809 | in: query 810 | name: language 811 | required: false 812 | type: string 813 | responses: 814 | '200': 815 | description: Successful Response 816 | operationId: variables 817 | /catalogue/variables2statistic: 818 | parameters: [] 819 | get: 820 | parameters: 821 | - default: GAST 822 | in: query 823 | name: username 824 | required: false 825 | type: string 826 | - default: GAST 827 | in: query 828 | name: password 829 | required: false 830 | type: string 831 | - default: '' 832 | in: query 833 | name: name 834 | required: false 835 | type: string 836 | - default: '' 837 | in: query 838 | name: selection 839 | required: false 840 | type: string 841 | - default: free 842 | in: query 843 | name: area 844 | required: false 845 | type: string 846 | - default: Code 847 | in: query 848 | name: searchcriterion 849 | required: false 850 | type: string 851 | - default: Name 852 | in: query 853 | name: sortcriterion 854 | required: false 855 | type: string 856 | - default: Alle 857 | in: query 858 | name: type 859 | required: false 860 | type: string 861 | - default: '100' 862 | in: query 863 | name: pagelength 864 | required: false 865 | type: string 866 | - default: de 867 | in: query 868 | name: language 869 | required: false 870 | type: string 871 | responses: 872 | '200': 873 | description: Successful Response 874 | operationId: variables2statistic 875 | /data/chart2result: 876 | parameters: [] 877 | get: 878 | parameters: 879 | - default: GAST 880 | in: query 881 | name: username 882 | required: false 883 | type: string 884 | - default: GAST 885 | in: query 886 | name: password 887 | required: false 888 | type: string 889 | - default: '' 890 | in: query 891 | name: name 892 | required: false 893 | type: string 894 | - default: free 895 | in: query 896 | name: area 897 | required: false 898 | type: string 899 | - default: '0' 900 | in: query 901 | name: charttype 902 | required: false 903 | type: string 904 | - default: 'false' 905 | in: query 906 | name: drawpoints 907 | required: false 908 | type: string 909 | - default: '2' 910 | in: query 911 | name: zoom 912 | required: false 913 | type: string 914 | - default: 'false' 915 | in: query 916 | name: focus 917 | required: false 918 | type: string 919 | - default: 'false' 920 | in: query 921 | name: tops 922 | required: false 923 | type: string 924 | - default: png 925 | in: query 926 | name: format 927 | required: false 928 | type: string 929 | - default: de 930 | in: query 931 | name: language 932 | required: false 933 | type: string 934 | responses: 935 | '200': 936 | description: Successful Response 937 | operationId: chart2result 938 | /data/chart2table: 939 | parameters: [] 940 | get: 941 | parameters: 942 | - default: GAST 943 | in: query 944 | name: username 945 | required: false 946 | type: string 947 | - default: GAST 948 | in: query 949 | name: password 950 | required: false 951 | type: string 952 | - default: '' 953 | in: query 954 | name: name 955 | required: false 956 | type: string 957 | - default: free 958 | in: query 959 | name: area 960 | required: false 961 | type: string 962 | - default: '0' 963 | in: query 964 | name: charttype 965 | required: false 966 | type: string 967 | - default: 'false' 968 | in: query 969 | name: drawpoints 970 | required: false 971 | type: string 972 | - default: '2' 973 | in: query 974 | name: zoom 975 | required: false 976 | type: string 977 | - default: 'false' 978 | in: query 979 | name: focus 980 | required: false 981 | type: string 982 | - default: 'false' 983 | in: query 984 | name: tops 985 | required: false 986 | type: string 987 | - default: '' 988 | in: query 989 | name: startyear 990 | required: false 991 | type: string 992 | - default: '' 993 | in: query 994 | name: endyear 995 | required: false 996 | type: string 997 | - default: '' 998 | in: query 999 | name: timeslices 1000 | required: false 1001 | type: string 1002 | - default: '' 1003 | in: query 1004 | name: regionalvariable 1005 | required: false 1006 | type: string 1007 | - default: '' 1008 | in: query 1009 | name: regionalkey 1010 | required: false 1011 | type: string 1012 | - default: '' 1013 | in: query 1014 | name: classifyingvariable1 1015 | required: false 1016 | type: string 1017 | - default: '' 1018 | in: query 1019 | name: classifyingkey1 1020 | required: false 1021 | type: string 1022 | - default: '' 1023 | in: query 1024 | name: classifyingvariable2 1025 | required: false 1026 | type: string 1027 | - default: '' 1028 | in: query 1029 | name: classifyingkey2 1030 | required: false 1031 | type: string 1032 | - default: '' 1033 | in: query 1034 | name: classifyingvariable3 1035 | required: false 1036 | type: string 1037 | - default: '' 1038 | in: query 1039 | name: classifyingkey3 1040 | required: false 1041 | type: string 1042 | - default: png 1043 | in: query 1044 | name: format 1045 | required: false 1046 | type: string 1047 | - default: 01.01.1970 01:00 1048 | in: query 1049 | name: stand 1050 | required: false 1051 | type: string 1052 | - default: de 1053 | in: query 1054 | name: language 1055 | required: false 1056 | type: string 1057 | responses: 1058 | '200': 1059 | description: Successful Response 1060 | operationId: chart2table 1061 | /data/chart2timeseries: 1062 | parameters: [] 1063 | get: 1064 | parameters: 1065 | - default: GAST 1066 | in: query 1067 | name: username 1068 | required: false 1069 | type: string 1070 | - default: GAST 1071 | in: query 1072 | name: password 1073 | required: false 1074 | type: string 1075 | - default: '' 1076 | in: query 1077 | name: name 1078 | required: false 1079 | type: string 1080 | - default: free 1081 | in: query 1082 | name: area 1083 | required: false 1084 | type: string 1085 | - default: '0' 1086 | in: query 1087 | name: charttype 1088 | required: false 1089 | type: string 1090 | - default: 'false' 1091 | in: query 1092 | name: drawpoints 1093 | required: false 1094 | type: string 1095 | - default: '2' 1096 | in: query 1097 | name: zoom 1098 | required: false 1099 | type: string 1100 | - default: 'false' 1101 | in: query 1102 | name: focus 1103 | required: false 1104 | type: string 1105 | - default: 'false' 1106 | in: query 1107 | name: tops 1108 | required: false 1109 | type: string 1110 | - default: '' 1111 | in: query 1112 | name: contents 1113 | required: false 1114 | type: string 1115 | - default: '' 1116 | in: query 1117 | name: startyear 1118 | required: false 1119 | type: string 1120 | - default: '' 1121 | in: query 1122 | name: endyear 1123 | required: false 1124 | type: string 1125 | - default: '' 1126 | in: query 1127 | name: timeslices 1128 | required: false 1129 | type: string 1130 | - default: '' 1131 | in: query 1132 | name: regionalvariable 1133 | required: false 1134 | type: string 1135 | - default: '' 1136 | in: query 1137 | name: regionalkey 1138 | required: false 1139 | type: string 1140 | - default: '' 1141 | in: query 1142 | name: classifyingvariable1 1143 | required: false 1144 | type: string 1145 | - default: '' 1146 | in: query 1147 | name: classifyingkey1 1148 | required: false 1149 | type: string 1150 | - default: '' 1151 | in: query 1152 | name: classifyingvariable2 1153 | required: false 1154 | type: string 1155 | - default: '' 1156 | in: query 1157 | name: classifyingkey2 1158 | required: false 1159 | type: string 1160 | - default: '' 1161 | in: query 1162 | name: classifyingvariable3 1163 | required: false 1164 | type: string 1165 | - default: '' 1166 | in: query 1167 | name: classifyingkey3 1168 | required: false 1169 | type: string 1170 | - default: png 1171 | in: query 1172 | name: format 1173 | required: false 1174 | type: string 1175 | - default: 01.01.1970 01:00 1176 | in: query 1177 | name: stand 1178 | required: false 1179 | type: string 1180 | - default: de 1181 | in: query 1182 | name: language 1183 | required: false 1184 | type: string 1185 | responses: 1186 | '200': 1187 | description: Successful Response 1188 | operationId: chart2timeseries 1189 | /data/cube: 1190 | parameters: [] 1191 | get: 1192 | parameters: 1193 | - default: GAST 1194 | in: query 1195 | name: username 1196 | required: false 1197 | type: string 1198 | - default: GAST 1199 | in: query 1200 | name: password 1201 | required: false 1202 | type: string 1203 | - default: '' 1204 | in: query 1205 | name: name 1206 | required: false 1207 | type: string 1208 | - default: free 1209 | in: query 1210 | name: area 1211 | required: false 1212 | type: string 1213 | - default: 'true' 1214 | in: query 1215 | name: values 1216 | required: false 1217 | type: string 1218 | - default: 'false' 1219 | in: query 1220 | name: metadata 1221 | required: false 1222 | type: string 1223 | - default: 'false' 1224 | in: query 1225 | name: additionals 1226 | required: false 1227 | type: string 1228 | - default: '' 1229 | in: query 1230 | name: contents 1231 | required: false 1232 | type: string 1233 | - default: '' 1234 | in: query 1235 | name: startyear 1236 | required: false 1237 | type: string 1238 | - default: '' 1239 | in: query 1240 | name: endyear 1241 | required: false 1242 | type: string 1243 | - default: '' 1244 | in: query 1245 | name: timeslices 1246 | required: false 1247 | type: string 1248 | - default: '' 1249 | in: query 1250 | name: regionalvariable 1251 | required: false 1252 | type: string 1253 | - default: '' 1254 | in: query 1255 | name: regionalkey 1256 | required: false 1257 | type: string 1258 | - default: '' 1259 | in: query 1260 | name: classifyingvariable1 1261 | required: false 1262 | type: string 1263 | - default: '' 1264 | in: query 1265 | name: classifyingkey1 1266 | required: false 1267 | type: string 1268 | - default: '' 1269 | in: query 1270 | name: classifyingvariable2 1271 | required: false 1272 | type: string 1273 | - default: '' 1274 | in: query 1275 | name: classifyingkey2 1276 | required: false 1277 | type: string 1278 | - default: '' 1279 | in: query 1280 | name: classifyingvariable3 1281 | required: false 1282 | type: string 1283 | - default: '' 1284 | in: query 1285 | name: classifyingkey3 1286 | required: false 1287 | type: string 1288 | - default: csv 1289 | in: query 1290 | name: format 1291 | required: false 1292 | type: string 1293 | - default: 01.01.1970 01:00 1294 | in: query 1295 | name: stand 1296 | required: false 1297 | type: string 1298 | - default: de 1299 | in: query 1300 | name: language 1301 | required: false 1302 | type: string 1303 | responses: 1304 | '200': 1305 | description: Successful Response 1306 | operationId: cube 1307 | /data/cubefile: 1308 | parameters: [] 1309 | get: 1310 | parameters: 1311 | - default: GAST 1312 | in: query 1313 | name: username 1314 | required: false 1315 | type: string 1316 | - default: GAST 1317 | in: query 1318 | name: password 1319 | required: false 1320 | type: string 1321 | - default: '' 1322 | in: query 1323 | name: name 1324 | required: false 1325 | type: string 1326 | - default: free 1327 | in: query 1328 | name: area 1329 | required: false 1330 | type: string 1331 | - default: 'true' 1332 | in: query 1333 | name: values 1334 | required: false 1335 | type: string 1336 | - default: 'false' 1337 | in: query 1338 | name: metadata 1339 | required: false 1340 | type: string 1341 | - default: 'false' 1342 | in: query 1343 | name: additionals 1344 | required: false 1345 | type: string 1346 | - default: '' 1347 | in: query 1348 | name: contents 1349 | required: false 1350 | type: string 1351 | - default: '' 1352 | in: query 1353 | name: startyear 1354 | required: false 1355 | type: string 1356 | - default: '' 1357 | in: query 1358 | name: endyear 1359 | required: false 1360 | type: string 1361 | - default: '' 1362 | in: query 1363 | name: timeslices 1364 | required: false 1365 | type: string 1366 | - default: '' 1367 | in: query 1368 | name: regionalvariable 1369 | required: false 1370 | type: string 1371 | - default: '' 1372 | in: query 1373 | name: regionalkey 1374 | required: false 1375 | type: string 1376 | - default: '' 1377 | in: query 1378 | name: classifyingvariable1 1379 | required: false 1380 | type: string 1381 | - default: '' 1382 | in: query 1383 | name: classifyingkey1 1384 | required: false 1385 | type: string 1386 | - default: '' 1387 | in: query 1388 | name: classifyingvariable2 1389 | required: false 1390 | type: string 1391 | - default: '' 1392 | in: query 1393 | name: classifyingkey2 1394 | required: false 1395 | type: string 1396 | - default: '' 1397 | in: query 1398 | name: classifyingvariable3 1399 | required: false 1400 | type: string 1401 | - default: '' 1402 | in: query 1403 | name: classifyingkey3 1404 | required: false 1405 | type: string 1406 | - default: csv 1407 | in: query 1408 | name: format 1409 | required: false 1410 | type: string 1411 | - default: 01.01.1970 01:00 1412 | in: query 1413 | name: stand 1414 | required: false 1415 | type: string 1416 | - default: de 1417 | in: query 1418 | name: language 1419 | required: false 1420 | type: string 1421 | responses: 1422 | '200': 1423 | description: Successful Response 1424 | operationId: cubefile 1425 | /data/map2result: 1426 | parameters: [] 1427 | get: 1428 | parameters: 1429 | - default: GAST 1430 | in: query 1431 | name: username 1432 | required: false 1433 | type: string 1434 | - default: GAST 1435 | in: query 1436 | name: password 1437 | required: false 1438 | type: string 1439 | - default: '' 1440 | in: query 1441 | name: name 1442 | required: false 1443 | type: string 1444 | - default: free 1445 | in: query 1446 | name: area 1447 | required: false 1448 | type: string 1449 | - default: '0' 1450 | in: query 1451 | name: maptype 1452 | required: false 1453 | type: string 1454 | - default: '5' 1455 | in: query 1456 | name: classes 1457 | required: false 1458 | type: string 1459 | - default: '0' 1460 | in: query 1461 | name: classification 1462 | required: false 1463 | type: string 1464 | - default: '2' 1465 | in: query 1466 | name: zoom 1467 | required: false 1468 | type: string 1469 | - default: png 1470 | in: query 1471 | name: format 1472 | required: false 1473 | type: string 1474 | - default: de 1475 | in: query 1476 | name: language 1477 | required: false 1478 | type: string 1479 | responses: 1480 | '200': 1481 | description: Successful Response 1482 | operationId: map2result 1483 | /data/map2table: 1484 | parameters: [] 1485 | get: 1486 | parameters: 1487 | - default: GAST 1488 | in: query 1489 | name: username 1490 | required: false 1491 | type: string 1492 | - default: GAST 1493 | in: query 1494 | name: password 1495 | required: false 1496 | type: string 1497 | - default: '' 1498 | in: query 1499 | name: name 1500 | required: false 1501 | type: string 1502 | - default: free 1503 | in: query 1504 | name: area 1505 | required: false 1506 | type: string 1507 | - default: '0' 1508 | in: query 1509 | name: maptype 1510 | required: false 1511 | type: string 1512 | - default: '5' 1513 | in: query 1514 | name: classes 1515 | required: false 1516 | type: string 1517 | - default: '0' 1518 | in: query 1519 | name: classification 1520 | required: false 1521 | type: string 1522 | - default: '2' 1523 | in: query 1524 | name: zoom 1525 | required: false 1526 | type: string 1527 | - default: '' 1528 | in: query 1529 | name: startyear 1530 | required: false 1531 | type: string 1532 | - default: '' 1533 | in: query 1534 | name: endyear 1535 | required: false 1536 | type: string 1537 | - default: '' 1538 | in: query 1539 | name: timeslices 1540 | required: false 1541 | type: string 1542 | - default: '' 1543 | in: query 1544 | name: regionalvariable 1545 | required: false 1546 | type: string 1547 | - default: '' 1548 | in: query 1549 | name: regionalkey 1550 | required: false 1551 | type: string 1552 | - default: '' 1553 | in: query 1554 | name: classifyingvariable1 1555 | required: false 1556 | type: string 1557 | - default: '' 1558 | in: query 1559 | name: classifyingkey1 1560 | required: false 1561 | type: string 1562 | - default: '' 1563 | in: query 1564 | name: classifyingvariable2 1565 | required: false 1566 | type: string 1567 | - default: '' 1568 | in: query 1569 | name: classifyingkey2 1570 | required: false 1571 | type: string 1572 | - default: '' 1573 | in: query 1574 | name: classifyingvariable3 1575 | required: false 1576 | type: string 1577 | - default: '' 1578 | in: query 1579 | name: classifyingkey3 1580 | required: false 1581 | type: string 1582 | - default: png 1583 | in: query 1584 | name: format 1585 | required: false 1586 | type: string 1587 | - default: 01.01.1970 01:00 1588 | in: query 1589 | name: stand 1590 | required: false 1591 | type: string 1592 | - default: de 1593 | in: query 1594 | name: language 1595 | required: false 1596 | type: string 1597 | responses: 1598 | '200': 1599 | description: Successful Response 1600 | operationId: map2table 1601 | /data/map2timeseries: 1602 | parameters: [] 1603 | get: 1604 | parameters: 1605 | - default: GAST 1606 | in: query 1607 | name: username 1608 | required: false 1609 | type: string 1610 | - default: GAST 1611 | in: query 1612 | name: password 1613 | required: false 1614 | type: string 1615 | - default: '' 1616 | in: query 1617 | name: name 1618 | required: false 1619 | type: string 1620 | - default: free 1621 | in: query 1622 | name: area 1623 | required: false 1624 | type: string 1625 | - default: '0' 1626 | in: query 1627 | name: maptype 1628 | required: false 1629 | type: string 1630 | - default: '5' 1631 | in: query 1632 | name: classes 1633 | required: false 1634 | type: string 1635 | - default: '0' 1636 | in: query 1637 | name: classification 1638 | required: false 1639 | type: string 1640 | - default: '2' 1641 | in: query 1642 | name: zoom 1643 | required: false 1644 | type: string 1645 | - default: '' 1646 | in: query 1647 | name: contents 1648 | required: false 1649 | type: string 1650 | - default: '' 1651 | in: query 1652 | name: startyear 1653 | required: false 1654 | type: string 1655 | - default: '' 1656 | in: query 1657 | name: endyear 1658 | required: false 1659 | type: string 1660 | - default: '' 1661 | in: query 1662 | name: timeslices 1663 | required: false 1664 | type: string 1665 | - default: '' 1666 | in: query 1667 | name: regionalvariable 1668 | required: false 1669 | type: string 1670 | - default: '' 1671 | in: query 1672 | name: regionalkey 1673 | required: false 1674 | type: string 1675 | - default: '' 1676 | in: query 1677 | name: classifyingvariable1 1678 | required: false 1679 | type: string 1680 | - default: '' 1681 | in: query 1682 | name: classifyingkey1 1683 | required: false 1684 | type: string 1685 | - default: '' 1686 | in: query 1687 | name: classifyingvariable2 1688 | required: false 1689 | type: string 1690 | - default: '' 1691 | in: query 1692 | name: classifyingkey2 1693 | required: false 1694 | type: string 1695 | - default: '' 1696 | in: query 1697 | name: classifyingvariable3 1698 | required: false 1699 | type: string 1700 | - default: '' 1701 | in: query 1702 | name: classifyingkey3 1703 | required: false 1704 | type: string 1705 | - default: png 1706 | in: query 1707 | name: format 1708 | required: false 1709 | type: string 1710 | - default: 01.01.1970 01:00 1711 | in: query 1712 | name: stand 1713 | required: false 1714 | type: string 1715 | - default: de 1716 | in: query 1717 | name: language 1718 | required: false 1719 | type: string 1720 | responses: 1721 | '200': 1722 | description: Successful Response 1723 | operationId: map2timeseries 1724 | /data/result: 1725 | parameters: [] 1726 | get: 1727 | parameters: 1728 | - default: GAST 1729 | in: query 1730 | name: username 1731 | required: false 1732 | type: string 1733 | - default: GAST 1734 | in: query 1735 | name: password 1736 | required: false 1737 | type: string 1738 | - default: '' 1739 | in: query 1740 | name: name 1741 | required: false 1742 | type: string 1743 | - default: free 1744 | in: query 1745 | name: area 1746 | required: false 1747 | type: string 1748 | - default: 'false' 1749 | in: query 1750 | name: compress 1751 | required: false 1752 | type: string 1753 | - default: de 1754 | in: query 1755 | name: language 1756 | required: false 1757 | type: string 1758 | responses: 1759 | '200': 1760 | description: Successful Response 1761 | operationId: result 1762 | /data/resultfile: 1763 | parameters: [] 1764 | get: 1765 | parameters: 1766 | - default: GAST 1767 | in: query 1768 | name: username 1769 | required: false 1770 | type: string 1771 | - default: GAST 1772 | in: query 1773 | name: password 1774 | required: false 1775 | type: string 1776 | - default: '' 1777 | in: query 1778 | name: name 1779 | required: false 1780 | type: string 1781 | - default: free 1782 | in: query 1783 | name: area 1784 | required: false 1785 | type: string 1786 | - default: 'false' 1787 | in: query 1788 | name: compress 1789 | required: false 1790 | type: string 1791 | - default: csv 1792 | in: query 1793 | name: format 1794 | required: false 1795 | type: string 1796 | - default: de 1797 | in: query 1798 | name: language 1799 | required: false 1800 | type: string 1801 | responses: 1802 | '200': 1803 | description: Successful Response 1804 | operationId: resultfile 1805 | /data/table: 1806 | parameters: [] 1807 | get: 1808 | parameters: 1809 | - default: GAST 1810 | in: query 1811 | name: username 1812 | required: false 1813 | type: string 1814 | - default: GAST 1815 | in: query 1816 | name: password 1817 | required: false 1818 | type: string 1819 | - default: '' 1820 | in: query 1821 | name: name 1822 | required: false 1823 | type: string 1824 | - default: free 1825 | in: query 1826 | name: area 1827 | required: false 1828 | type: string 1829 | - default: 'false' 1830 | in: query 1831 | name: compress 1832 | required: false 1833 | type: string 1834 | - default: 'false' 1835 | in: query 1836 | name: transpose 1837 | required: false 1838 | type: string 1839 | - default: '' 1840 | in: query 1841 | name: startyear 1842 | required: false 1843 | type: string 1844 | - default: '' 1845 | in: query 1846 | name: endyear 1847 | required: false 1848 | type: string 1849 | - default: '' 1850 | in: query 1851 | name: timeslices 1852 | required: false 1853 | type: string 1854 | - default: '' 1855 | in: query 1856 | name: regionalvariable 1857 | required: false 1858 | type: string 1859 | - default: '' 1860 | in: query 1861 | name: regionalkey 1862 | required: false 1863 | type: string 1864 | - default: '' 1865 | in: query 1866 | name: classifyingvariable1 1867 | required: false 1868 | type: string 1869 | - default: '' 1870 | in: query 1871 | name: classifyingkey1 1872 | required: false 1873 | type: string 1874 | - default: '' 1875 | in: query 1876 | name: classifyingvariable2 1877 | required: false 1878 | type: string 1879 | - default: '' 1880 | in: query 1881 | name: classifyingkey2 1882 | required: false 1883 | type: string 1884 | - default: '' 1885 | in: query 1886 | name: classifyingvariable3 1887 | required: false 1888 | type: string 1889 | - default: '' 1890 | in: query 1891 | name: classifyingkey3 1892 | required: false 1893 | type: string 1894 | - default: 'false' 1895 | in: query 1896 | name: job 1897 | required: false 1898 | type: string 1899 | - default: 01.01.1970 01:00 1900 | in: query 1901 | name: stand 1902 | required: false 1903 | type: string 1904 | - default: de 1905 | in: query 1906 | name: language 1907 | required: false 1908 | type: string 1909 | responses: 1910 | '200': 1911 | description: Successful Response 1912 | operationId: table 1913 | /data/tablefile: 1914 | parameters: [] 1915 | get: 1916 | parameters: 1917 | - default: GAST 1918 | in: query 1919 | name: username 1920 | required: false 1921 | type: string 1922 | - default: GAST 1923 | in: query 1924 | name: password 1925 | required: false 1926 | type: string 1927 | - default: '' 1928 | in: query 1929 | name: name 1930 | required: false 1931 | type: string 1932 | - default: free 1933 | in: query 1934 | name: area 1935 | required: false 1936 | type: string 1937 | - default: 'false' 1938 | in: query 1939 | name: compress 1940 | required: false 1941 | type: string 1942 | - default: 'false' 1943 | in: query 1944 | name: transpose 1945 | required: false 1946 | type: string 1947 | - default: '' 1948 | in: query 1949 | name: startyear 1950 | required: false 1951 | type: string 1952 | - default: '' 1953 | in: query 1954 | name: endyear 1955 | required: false 1956 | type: string 1957 | - default: '' 1958 | in: query 1959 | name: timeslices 1960 | required: false 1961 | type: string 1962 | - default: '' 1963 | in: query 1964 | name: regionalvariable 1965 | required: false 1966 | type: string 1967 | - default: '' 1968 | in: query 1969 | name: regionalkey 1970 | required: false 1971 | type: string 1972 | - default: '' 1973 | in: query 1974 | name: classifyingvariable1 1975 | required: false 1976 | type: string 1977 | - default: '' 1978 | in: query 1979 | name: classifyingkey1 1980 | required: false 1981 | type: string 1982 | - default: '' 1983 | in: query 1984 | name: classifyingvariable2 1985 | required: false 1986 | type: string 1987 | - default: '' 1988 | in: query 1989 | name: classifyingkey2 1990 | required: false 1991 | type: string 1992 | - default: '' 1993 | in: query 1994 | name: classifyingvariable3 1995 | required: false 1996 | type: string 1997 | - default: '' 1998 | in: query 1999 | name: classifyingkey3 2000 | required: false 2001 | type: string 2002 | - default: csv 2003 | in: query 2004 | name: format 2005 | required: false 2006 | type: string 2007 | - default: 'false' 2008 | in: query 2009 | name: job 2010 | required: false 2011 | type: string 2012 | - default: 01.01.1970 01:00 2013 | in: query 2014 | name: stand 2015 | required: false 2016 | type: string 2017 | - default: de 2018 | in: query 2019 | name: language 2020 | required: false 2021 | type: string 2022 | responses: 2023 | '200': 2024 | description: Successful Response 2025 | operationId: tablefile 2026 | /data/timeseries: 2027 | parameters: [] 2028 | get: 2029 | parameters: 2030 | - default: GAST 2031 | in: query 2032 | name: username 2033 | required: false 2034 | type: string 2035 | - default: GAST 2036 | in: query 2037 | name: password 2038 | required: false 2039 | type: string 2040 | - default: '' 2041 | in: query 2042 | name: name 2043 | required: false 2044 | type: string 2045 | - default: free 2046 | in: query 2047 | name: area 2048 | required: false 2049 | type: string 2050 | - default: 'false' 2051 | in: query 2052 | name: compress 2053 | required: false 2054 | type: string 2055 | - default: 'false' 2056 | in: query 2057 | name: transpose 2058 | required: false 2059 | type: string 2060 | - default: '' 2061 | in: query 2062 | name: contents 2063 | required: false 2064 | type: string 2065 | - default: '' 2066 | in: query 2067 | name: startyear 2068 | required: false 2069 | type: string 2070 | - default: '' 2071 | in: query 2072 | name: endyear 2073 | required: false 2074 | type: string 2075 | - default: '' 2076 | in: query 2077 | name: timeslices 2078 | required: false 2079 | type: string 2080 | - default: '' 2081 | in: query 2082 | name: regionalvariable 2083 | required: false 2084 | type: string 2085 | - default: '' 2086 | in: query 2087 | name: regionalkey 2088 | required: false 2089 | type: string 2090 | - default: '' 2091 | in: query 2092 | name: regionalkeycode 2093 | required: false 2094 | type: string 2095 | - default: '' 2096 | in: query 2097 | name: classifyingvariable1 2098 | required: false 2099 | type: string 2100 | - default: '' 2101 | in: query 2102 | name: classifyingkey1 2103 | required: false 2104 | type: string 2105 | - default: '' 2106 | in: query 2107 | name: classifyingkeycode1 2108 | required: false 2109 | type: string 2110 | - default: '' 2111 | in: query 2112 | name: classifyingvariable2 2113 | required: false 2114 | type: string 2115 | - default: '' 2116 | in: query 2117 | name: classifyingkey2 2118 | required: false 2119 | type: string 2120 | - default: '' 2121 | in: query 2122 | name: classifyingkeycode2 2123 | required: false 2124 | type: string 2125 | - default: '' 2126 | in: query 2127 | name: classifyingvariable3 2128 | required: false 2129 | type: string 2130 | - default: '' 2131 | in: query 2132 | name: classifyingkey3 2133 | required: false 2134 | type: string 2135 | - default: '' 2136 | in: query 2137 | name: classifyingkeycode3 2138 | required: false 2139 | type: string 2140 | - default: 'false' 2141 | in: query 2142 | name: job 2143 | required: false 2144 | type: string 2145 | - default: 01.01.1970 01:00 2146 | in: query 2147 | name: stand 2148 | required: false 2149 | type: string 2150 | - default: de 2151 | in: query 2152 | name: language 2153 | required: false 2154 | type: string 2155 | responses: 2156 | '200': 2157 | description: Successful Response 2158 | operationId: timeseriesData 2159 | /data/timeseriesfile: 2160 | parameters: [] 2161 | get: 2162 | parameters: 2163 | - default: GAST 2164 | in: query 2165 | name: username 2166 | required: false 2167 | type: string 2168 | - default: GAST 2169 | in: query 2170 | name: password 2171 | required: false 2172 | type: string 2173 | - default: '' 2174 | in: query 2175 | name: name 2176 | required: false 2177 | type: string 2178 | - default: free 2179 | in: query 2180 | name: area 2181 | required: false 2182 | type: string 2183 | - default: 'false' 2184 | in: query 2185 | name: compress 2186 | required: false 2187 | type: string 2188 | - default: 'false' 2189 | in: query 2190 | name: transpose 2191 | required: false 2192 | type: string 2193 | - default: '' 2194 | in: query 2195 | name: contents 2196 | required: false 2197 | type: string 2198 | - default: '' 2199 | in: query 2200 | name: startyear 2201 | required: false 2202 | type: string 2203 | - default: '' 2204 | in: query 2205 | name: endyear 2206 | required: false 2207 | type: string 2208 | - default: '' 2209 | in: query 2210 | name: timeslices 2211 | required: false 2212 | type: string 2213 | - default: '' 2214 | in: query 2215 | name: regionalvariable 2216 | required: false 2217 | type: string 2218 | - default: '' 2219 | in: query 2220 | name: regionalkey 2221 | required: false 2222 | type: string 2223 | - default: '' 2224 | in: query 2225 | name: regionalkeycode 2226 | required: false 2227 | type: string 2228 | - default: '' 2229 | in: query 2230 | name: classifyingvariable1 2231 | required: false 2232 | type: string 2233 | - default: '' 2234 | in: query 2235 | name: classifyingkey1 2236 | required: false 2237 | type: string 2238 | - default: '' 2239 | in: query 2240 | name: classifyingkeycode1 2241 | required: false 2242 | type: string 2243 | - default: '' 2244 | in: query 2245 | name: classifyingvariable2 2246 | required: false 2247 | type: string 2248 | - default: '' 2249 | in: query 2250 | name: classifyingkey2 2251 | required: false 2252 | type: string 2253 | - default: '' 2254 | in: query 2255 | name: classifyingkeycode2 2256 | required: false 2257 | type: string 2258 | - default: '' 2259 | in: query 2260 | name: classifyingvariable3 2261 | required: false 2262 | type: string 2263 | - default: '' 2264 | in: query 2265 | name: classifyingkey3 2266 | required: false 2267 | type: string 2268 | - default: '' 2269 | in: query 2270 | name: classifyingkeycode3 2271 | required: false 2272 | type: string 2273 | - default: csv 2274 | in: query 2275 | name: format 2276 | required: false 2277 | type: string 2278 | - default: 'false' 2279 | in: query 2280 | name: job 2281 | required: false 2282 | type: string 2283 | - default: 01.01.1970 01:00 2284 | in: query 2285 | name: stand 2286 | required: false 2287 | type: string 2288 | - default: de 2289 | in: query 2290 | name: language 2291 | required: false 2292 | type: string 2293 | responses: 2294 | '200': 2295 | description: Successful Response 2296 | operationId: timeseriesfile 2297 | /find/find: 2298 | parameters: [] 2299 | get: 2300 | parameters: 2301 | - default: GAST 2302 | in: query 2303 | name: username 2304 | required: false 2305 | type: string 2306 | - default: GAST 2307 | in: query 2308 | name: password 2309 | required: false 2310 | type: string 2311 | - in: query 2312 | name: term 2313 | required: false 2314 | type: string 2315 | - default: all 2316 | in: query 2317 | name: category 2318 | required: false 2319 | type: string 2320 | - default: '100' 2321 | in: query 2322 | name: pagelength 2323 | required: false 2324 | type: string 2325 | - default: de 2326 | in: query 2327 | name: language 2328 | required: false 2329 | type: string 2330 | responses: 2331 | '200': 2332 | description: Successful Response 2333 | operationId: find 2334 | /helloworld/logincheck: 2335 | parameters: [] 2336 | get: 2337 | parameters: 2338 | - in: query 2339 | name: username 2340 | required: false 2341 | type: string 2342 | - in: query 2343 | name: password 2344 | required: false 2345 | type: string 2346 | - default: de 2347 | in: query 2348 | name: language 2349 | required: false 2350 | type: string 2351 | responses: 2352 | '200': 2353 | description: Successful Response 2354 | operationId: logincheck 2355 | /helloworld/whoami: 2356 | parameters: [] 2357 | get: 2358 | parameters: 2359 | - in: header 2360 | name: user-agent 2361 | required: false 2362 | type: string 2363 | responses: 2364 | '200': 2365 | description: Successful Response 2366 | operationId: whoami 2367 | /metadata/cube: 2368 | parameters: [] 2369 | get: 2370 | parameters: 2371 | - default: GAST 2372 | in: query 2373 | name: username 2374 | required: false 2375 | type: string 2376 | - default: GAST 2377 | in: query 2378 | name: password 2379 | required: false 2380 | type: string 2381 | - default: '' 2382 | in: query 2383 | name: name 2384 | required: false 2385 | type: string 2386 | - default: free 2387 | in: query 2388 | name: area 2389 | required: false 2390 | type: string 2391 | - default: de 2392 | in: query 2393 | name: language 2394 | required: false 2395 | type: string 2396 | responses: 2397 | '200': 2398 | description: Successful Response 2399 | operationId: cubeMeta 2400 | /metadata/statistic: 2401 | parameters: [] 2402 | get: 2403 | parameters: 2404 | - default: GAST 2405 | in: query 2406 | name: username 2407 | required: false 2408 | type: string 2409 | - default: GAST 2410 | in: query 2411 | name: password 2412 | required: false 2413 | type: string 2414 | - default: '' 2415 | in: query 2416 | name: name 2417 | required: false 2418 | type: string 2419 | - default: free 2420 | in: query 2421 | name: area 2422 | required: false 2423 | type: string 2424 | - default: de 2425 | in: query 2426 | name: language 2427 | required: false 2428 | type: string 2429 | responses: 2430 | '200': 2431 | description: Successful Response 2432 | operationId: statistic 2433 | /metadata/table: 2434 | parameters: [] 2435 | get: 2436 | parameters: 2437 | - default: GAST 2438 | in: query 2439 | name: username 2440 | required: false 2441 | type: string 2442 | - default: GAST 2443 | in: query 2444 | name: password 2445 | required: false 2446 | type: string 2447 | - default: '' 2448 | in: query 2449 | name: name 2450 | required: false 2451 | type: string 2452 | - default: free 2453 | in: query 2454 | name: area 2455 | required: false 2456 | type: string 2457 | - default: de 2458 | in: query 2459 | name: language 2460 | required: false 2461 | type: string 2462 | responses: 2463 | '200': 2464 | description: Successful Response 2465 | operationId: tableMeta 2466 | /metadata/timeseries: 2467 | parameters: [] 2468 | get: 2469 | parameters: 2470 | - default: GAST 2471 | in: query 2472 | name: username 2473 | required: false 2474 | type: string 2475 | - default: GAST 2476 | in: query 2477 | name: password 2478 | required: false 2479 | type: string 2480 | - default: '' 2481 | in: query 2482 | name: name 2483 | required: false 2484 | type: string 2485 | - default: free 2486 | in: query 2487 | name: area 2488 | required: false 2489 | type: string 2490 | - default: de 2491 | in: query 2492 | name: language 2493 | required: false 2494 | type: string 2495 | responses: 2496 | '200': 2497 | description: Successful Response 2498 | operationId: timeseriesMeta 2499 | /metadata/value: 2500 | parameters: [] 2501 | get: 2502 | parameters: 2503 | - default: GAST 2504 | in: query 2505 | name: username 2506 | required: false 2507 | type: string 2508 | - default: GAST 2509 | in: query 2510 | name: password 2511 | required: false 2512 | type: string 2513 | - default: '' 2514 | in: query 2515 | name: name 2516 | required: false 2517 | type: string 2518 | - default: free 2519 | in: query 2520 | name: area 2521 | required: false 2522 | type: string 2523 | - default: de 2524 | in: query 2525 | name: language 2526 | required: false 2527 | type: string 2528 | responses: 2529 | '200': 2530 | description: Successful Response 2531 | operationId: value 2532 | /metadata/variable: 2533 | parameters: [] 2534 | get: 2535 | parameters: 2536 | - default: GAST 2537 | in: query 2538 | name: username 2539 | required: false 2540 | type: string 2541 | - default: GAST 2542 | in: query 2543 | name: password 2544 | required: false 2545 | type: string 2546 | - default: '' 2547 | in: query 2548 | name: name 2549 | required: false 2550 | type: string 2551 | - default: free 2552 | in: query 2553 | name: area 2554 | required: false 2555 | type: string 2556 | - default: de 2557 | in: query 2558 | name: language 2559 | required: false 2560 | type: string 2561 | responses: 2562 | '200': 2563 | description: Successful Response 2564 | operationId: variable 2565 | /profile/password: 2566 | parameters: [] 2567 | get: 2568 | parameters: 2569 | - in: query 2570 | name: username 2571 | required: false 2572 | type: string 2573 | - in: query 2574 | name: password 2575 | required: false 2576 | type: string 2577 | - in: query 2578 | name: new 2579 | required: false 2580 | type: string 2581 | - in: query 2582 | name: repeat 2583 | required: false 2584 | type: string 2585 | - default: de 2586 | in: query 2587 | name: language 2588 | required: false 2589 | type: string 2590 | responses: 2591 | '200': 2592 | description: Successful Response 2593 | operationId: password 2594 | /profile/removeResult: 2595 | parameters: [] 2596 | get: 2597 | parameters: 2598 | - default: GAST 2599 | in: query 2600 | name: username 2601 | required: false 2602 | type: string 2603 | - default: GAST 2604 | in: query 2605 | name: password 2606 | required: false 2607 | type: string 2608 | - in: query 2609 | name: name 2610 | required: false 2611 | type: string 2612 | - default: free 2613 | in: query 2614 | name: area 2615 | required: false 2616 | type: string 2617 | - default: de 2618 | in: query 2619 | name: language 2620 | required: false 2621 | type: string 2622 | responses: 2623 | '200': 2624 | description: Successful Response 2625 | operationId: removeResult 2626 | -------------------------------------------------------------------------------- /python-client/.openapi-generator-ignore: -------------------------------------------------------------------------------- 1 | # OpenAPI Generator Ignore 2 | # Generated by openapi-generator https://github.com/openapitools/openapi-generator 3 | 4 | # Use this file to prevent files from being overwritten by the generator. 5 | # The patterns follow closely to .gitignore or .dockerignore. 6 | 7 | # As an example, the C# client generator defines ApiClient.cs. 8 | # You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: 9 | #ApiClient.cs 10 | 11 | # You can match any string of characters against a directory, file or extension with a single asterisk (*): 12 | #foo/*/qux 13 | # The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux 14 | 15 | # You can recursively match patterns against a directory, file or extension with a double asterisk (**): 16 | #foo/**/qux 17 | # This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux 18 | 19 | # You can also negate patterns with an exclamation (!). 20 | # For example, you can ignore all files in a docs folder with the file extension .md: 21 | #docs/*.md 22 | # Then explicitly reverse the ignore rule for a single file: 23 | #!docs/README.md 24 | -------------------------------------------------------------------------------- /python-client/.openapi-generator/FILES: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .gitlab-ci.yml 3 | .openapi-generator-ignore 4 | .travis.yml 5 | README.md 6 | create_doc.py 7 | destatis/__init__.py 8 | destatis/api/__init__.py 9 | destatis/api/default_api.py 10 | destatis/api_client.py 11 | destatis/apis/__init__.py 12 | destatis/configuration.py 13 | destatis/exceptions.py 14 | destatis/model/__init__.py 15 | destatis/model_utils.py 16 | destatis/models/__init__.py 17 | destatis/rest.py 18 | docs/DefaultApi.md 19 | git_push.sh 20 | pyproject.toml 21 | rename_generated_code.py 22 | requirements.txt 23 | requirements.txt 24 | setup.cfg 25 | setup.py 26 | test-requirements.txt 27 | test/__init__.py 28 | test/test_default_api.py 29 | tox.ini 30 | -------------------------------------------------------------------------------- /python-client/.openapi-generator/VERSION: -------------------------------------------------------------------------------- 1 | 6.1.0 -------------------------------------------------------------------------------- /python-client/README.md: -------------------------------------------------------------------------------- 1 | # destatis 2 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) 3 | 4 | This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: 5 | 6 | - API version: 1.0 7 | - Package version: 0.1.0 8 | - Build package: org.openapitools.codegen.languages.PythonClientCodegen 9 | 10 | ## Requirements. 11 | 12 | Python >= 3.6 13 | 14 | ## Installation & Usage 15 | ### pip install 16 | 17 | ```sh 18 | pip install deutschland[destatis] 19 | ``` 20 | 21 | ### poetry install 22 | 23 | ```sh 24 | poetry add deutschland -E destatis 25 | ``` 26 | 27 | ### Setuptools 28 | 29 | Install via [Setuptools](http://pypi.python.org/pypi/setuptools). 30 | 31 | ```sh 32 | python setup.py install --user 33 | ``` 34 | (or `sudo python setup.py install` to install the package for all users) 35 | 36 | ## Usage 37 | 38 | Import the package: 39 | ```python 40 | from deutschland import destatis 41 | ``` 42 | 43 | ## Getting Started 44 | 45 | Please follow the [installation procedure](#installation--usage) and then run the following: 46 | 47 | ```python 48 | 49 | import time 50 | from deutschland import destatis 51 | from pprint import pprint 52 | from deutschland.destatis.api import default_api 53 | # Defining the host is optional and defaults to https://www-genesis.destatis.de/genesisWS/rest/2020 54 | # See configuration.py for a list of all supported configuration parameters. 55 | configuration = destatis.Configuration( 56 | host = "https://www-genesis.destatis.de/genesisWS/rest/2020" 57 | ) 58 | 59 | 60 | 61 | # Enter a context with an instance of the API client 62 | with destatis.ApiClient(configuration) as api_client: 63 | # Create an instance of the API class 64 | api_instance = default_api.DefaultApi(api_client) 65 | username = "GAST" # str | (optional) (default to "GAST") 66 | password = "GAST" # str | (optional) (default to "GAST") 67 | name = "name_example" # str | (optional) 68 | area = "free" # str | (optional) (default to "free") 69 | charttype = "0" # str | (optional) (default to "0") 70 | drawpoints = "false" # str | (optional) (default to "false") 71 | zoom = "2" # str | (optional) (default to "2") 72 | focus = "false" # str | (optional) (default to "false") 73 | tops = "false" # str | (optional) (default to "false") 74 | format = "png" # str | (optional) (default to "png") 75 | language = "de" # str | (optional) (default to "de") 76 | 77 | try: 78 | api_instance.chart2result(username=username, password=password, name=name, area=area, charttype=charttype, drawpoints=drawpoints, zoom=zoom, focus=focus, tops=tops, format=format, language=language) 79 | except destatis.ApiException as e: 80 | print("Exception when calling DefaultApi->chart2result: %s\n" % e) 81 | ``` 82 | 83 | ## Documentation for API Endpoints 84 | 85 | All URIs are relative to *https://www-genesis.destatis.de/genesisWS/rest/2020* 86 | 87 | Class | Method | HTTP request | Description 88 | ------------ | ------------- | ------------- | ------------- 89 | *DefaultApi* | [**chart2result**](docs/DefaultApi.md#chart2result) | **GET** /data/chart2result | 90 | *DefaultApi* | [**chart2table**](docs/DefaultApi.md#chart2table) | **GET** /data/chart2table | 91 | *DefaultApi* | [**chart2timeseries**](docs/DefaultApi.md#chart2timeseries) | **GET** /data/chart2timeseries | 92 | *DefaultApi* | [**cube**](docs/DefaultApi.md#cube) | **GET** /data/cube | 93 | *DefaultApi* | [**cube_meta**](docs/DefaultApi.md#cube_meta) | **GET** /metadata/cube | 94 | *DefaultApi* | [**cubefile**](docs/DefaultApi.md#cubefile) | **GET** /data/cubefile | 95 | *DefaultApi* | [**cubes**](docs/DefaultApi.md#cubes) | **GET** /catalogue/cubes | 96 | *DefaultApi* | [**cubes2statistic**](docs/DefaultApi.md#cubes2statistic) | **GET** /catalogue/cubes2statistic | 97 | *DefaultApi* | [**cubes2variable**](docs/DefaultApi.md#cubes2variable) | **GET** /catalogue/cubes2variable | 98 | *DefaultApi* | [**find**](docs/DefaultApi.md#find) | **GET** /find/find | 99 | *DefaultApi* | [**jobs**](docs/DefaultApi.md#jobs) | **GET** /catalogue/jobs | 100 | *DefaultApi* | [**logincheck**](docs/DefaultApi.md#logincheck) | **GET** /helloworld/logincheck | 101 | *DefaultApi* | [**map2result**](docs/DefaultApi.md#map2result) | **GET** /data/map2result | 102 | *DefaultApi* | [**map2table**](docs/DefaultApi.md#map2table) | **GET** /data/map2table | 103 | *DefaultApi* | [**map2timeseries**](docs/DefaultApi.md#map2timeseries) | **GET** /data/map2timeseries | 104 | *DefaultApi* | [**modifieddata**](docs/DefaultApi.md#modifieddata) | **GET** /catalogue/modifieddata | 105 | *DefaultApi* | [**password**](docs/DefaultApi.md#password) | **GET** /profile/password | 106 | *DefaultApi* | [**qualitysigns**](docs/DefaultApi.md#qualitysigns) | **GET** /catalogue/qualitysigns | 107 | *DefaultApi* | [**remove_result**](docs/DefaultApi.md#remove_result) | **GET** /profile/removeResult | 108 | *DefaultApi* | [**result**](docs/DefaultApi.md#result) | **GET** /data/result | 109 | *DefaultApi* | [**resultfile**](docs/DefaultApi.md#resultfile) | **GET** /data/resultfile | 110 | *DefaultApi* | [**results**](docs/DefaultApi.md#results) | **GET** /catalogue/results | 111 | *DefaultApi* | [**statistic**](docs/DefaultApi.md#statistic) | **GET** /metadata/statistic | 112 | *DefaultApi* | [**statistics**](docs/DefaultApi.md#statistics) | **GET** /catalogue/statistics | 113 | *DefaultApi* | [**statistics2variable**](docs/DefaultApi.md#statistics2variable) | **GET** /catalogue/statistics2variable | 114 | *DefaultApi* | [**table**](docs/DefaultApi.md#table) | **GET** /data/table | 115 | *DefaultApi* | [**table_meta**](docs/DefaultApi.md#table_meta) | **GET** /metadata/table | 116 | *DefaultApi* | [**tablefile**](docs/DefaultApi.md#tablefile) | **GET** /data/tablefile | 117 | *DefaultApi* | [**tables**](docs/DefaultApi.md#tables) | **GET** /catalogue/tables | 118 | *DefaultApi* | [**tables2statistic**](docs/DefaultApi.md#tables2statistic) | **GET** /catalogue/tables2statistic | 119 | *DefaultApi* | [**tables2variable**](docs/DefaultApi.md#tables2variable) | **GET** /catalogue/tables2variable | 120 | *DefaultApi* | [**terms**](docs/DefaultApi.md#terms) | **GET** /catalogue/terms | 121 | *DefaultApi* | [**timeseries**](docs/DefaultApi.md#timeseries) | **GET** /catalogue/timeseries | 122 | *DefaultApi* | [**timeseries2statistic**](docs/DefaultApi.md#timeseries2statistic) | **GET** /catalogue/timeseries2statistic | 123 | *DefaultApi* | [**timeseries2variable**](docs/DefaultApi.md#timeseries2variable) | **GET** /catalogue/timeseries2variable | 124 | *DefaultApi* | [**timeseries_data**](docs/DefaultApi.md#timeseries_data) | **GET** /data/timeseries | 125 | *DefaultApi* | [**timeseries_meta**](docs/DefaultApi.md#timeseries_meta) | **GET** /metadata/timeseries | 126 | *DefaultApi* | [**timeseriesfile**](docs/DefaultApi.md#timeseriesfile) | **GET** /data/timeseriesfile | 127 | *DefaultApi* | [**value**](docs/DefaultApi.md#value) | **GET** /metadata/value | 128 | *DefaultApi* | [**values**](docs/DefaultApi.md#values) | **GET** /catalogue/values | 129 | *DefaultApi* | [**values2variable**](docs/DefaultApi.md#values2variable) | **GET** /catalogue/values2variable | 130 | *DefaultApi* | [**variable**](docs/DefaultApi.md#variable) | **GET** /metadata/variable | 131 | *DefaultApi* | [**variables**](docs/DefaultApi.md#variables) | **GET** /catalogue/variables | 132 | *DefaultApi* | [**variables2statistic**](docs/DefaultApi.md#variables2statistic) | **GET** /catalogue/variables2statistic | 133 | *DefaultApi* | [**whoami**](docs/DefaultApi.md#whoami) | **GET** /helloworld/whoami | 134 | 135 | 136 | ## Documentation For Models 137 | 138 | 139 | 140 | ## Documentation For Authorization 141 | 142 | All endpoints do not require authorization. 143 | 144 | ## Author 145 | 146 | kontakt@bund.dev 147 | 148 | 149 | ## Notes for Large OpenAPI documents 150 | If the OpenAPI document is large, imports in destatis.apis and destatis.models may fail with a 151 | RecursionError indicating the maximum recursion limit has been exceeded. In that case, there are a couple of solutions: 152 | 153 | Solution 1: 154 | Use specific imports for apis and models like: 155 | - `from deutschland.destatis.api.default_api import DefaultApi` 156 | - `from deutschland.destatis.model.pet import Pet` 157 | 158 | Solution 2: 159 | Before importing the package, adjust the maximum recursion limit as shown below: 160 | ``` 161 | import sys 162 | sys.setrecursionlimit(1500) 163 | from deutschland import destatis 164 | from deutschland.destatis.apis import * 165 | from deutschland.destatis.models import * 166 | ``` 167 | 168 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa 2 | 3 | """ 4 | Destatis-API 5 | 6 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 7 | 8 | The version of the OpenAPI document: 1.0 9 | Contact: kontakt@bund.dev 10 | Generated by: https://openapi-generator.tech 11 | """ 12 | 13 | 14 | __version__ = "0.1.0" 15 | 16 | # import ApiClient 17 | from deutschland.destatis.api_client import ApiClient 18 | 19 | # import Configuration 20 | from deutschland.destatis.configuration import Configuration 21 | 22 | # import exceptions 23 | from deutschland.destatis.exceptions import ( 24 | ApiAttributeError, 25 | ApiException, 26 | ApiKeyError, 27 | ApiTypeError, 28 | ApiValueError, 29 | OpenApiException, 30 | ) 31 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/api/__init__.py: -------------------------------------------------------------------------------- 1 | # do not import all apis into this module because that uses a lot of memory and stack frames 2 | # if you need the ability to import all apis from one package, import them with 3 | # from deutschland.destatis.apis import DefaultApi 4 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/api_client.py: -------------------------------------------------------------------------------- 1 | """ 2 | Destatis-API 3 | 4 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 5 | 6 | The version of the OpenAPI document: 1.0 7 | Contact: kontakt@bund.dev 8 | Generated by: https://openapi-generator.tech 9 | """ 10 | 11 | 12 | import atexit 13 | import io 14 | import json 15 | import mimetypes 16 | import os 17 | import re 18 | import typing 19 | from multiprocessing.pool import ThreadPool 20 | from urllib.parse import quote 21 | 22 | from deutschland.destatis import rest 23 | from deutschland.destatis.configuration import Configuration 24 | from deutschland.destatis.exceptions import ApiException, ApiTypeError, ApiValueError 25 | from deutschland.destatis.model_utils import ( 26 | ModelComposed, 27 | ModelNormal, 28 | ModelSimple, 29 | check_allowed_values, 30 | check_validations, 31 | date, 32 | datetime, 33 | deserialize_file, 34 | file_type, 35 | model_to_dict, 36 | none_type, 37 | validate_and_convert_types, 38 | ) 39 | from urllib3.fields import RequestField 40 | 41 | 42 | class ApiClient(object): 43 | """Generic API client for OpenAPI client library builds. 44 | 45 | OpenAPI generic API client. This client handles the client- 46 | server communication, and is invariant across implementations. Specifics of 47 | the methods and models for each application are generated from the OpenAPI 48 | templates. 49 | 50 | NOTE: This class is auto generated by OpenAPI Generator. 51 | Ref: https://openapi-generator.tech 52 | Do not edit the class manually. 53 | 54 | :param configuration: .Configuration object for this client 55 | :param header_name: a header to pass when making calls to the API. 56 | :param header_value: a header value to pass when making calls to 57 | the API. 58 | :param cookie: a cookie to include in the header when making calls 59 | to the API 60 | :param pool_threads: The number of threads to use for async requests 61 | to the API. More threads means more concurrent API requests. 62 | """ 63 | 64 | _pool = None 65 | 66 | def __init__( 67 | self, 68 | configuration=None, 69 | header_name=None, 70 | header_value=None, 71 | cookie=None, 72 | pool_threads=1, 73 | ): 74 | if configuration is None: 75 | configuration = Configuration.get_default_copy() 76 | self.configuration = configuration 77 | self.pool_threads = pool_threads 78 | 79 | self.rest_client = rest.RESTClientObject(configuration) 80 | self.default_headers = {} 81 | if header_name is not None: 82 | self.default_headers[header_name] = header_value 83 | self.cookie = cookie 84 | # Set default User-Agent. 85 | self.user_agent = "OpenAPI-Generator/0.1.0/python" 86 | 87 | def __enter__(self): 88 | return self 89 | 90 | def __exit__(self, exc_type, exc_value, traceback): 91 | self.close() 92 | 93 | def close(self): 94 | if self._pool: 95 | self._pool.close() 96 | self._pool.join() 97 | self._pool = None 98 | if hasattr(atexit, "unregister"): 99 | atexit.unregister(self.close) 100 | 101 | @property 102 | def pool(self): 103 | """Create thread pool on first request 104 | avoids instantiating unused threadpool for blocking clients. 105 | """ 106 | if self._pool is None: 107 | atexit.register(self.close) 108 | self._pool = ThreadPool(self.pool_threads) 109 | return self._pool 110 | 111 | @property 112 | def user_agent(self): 113 | """User agent for this API client""" 114 | return self.default_headers["User-Agent"] 115 | 116 | @user_agent.setter 117 | def user_agent(self, value): 118 | self.default_headers["User-Agent"] = value 119 | 120 | def set_default_header(self, header_name, header_value): 121 | self.default_headers[header_name] = header_value 122 | 123 | def __call_api( 124 | self, 125 | resource_path: str, 126 | method: str, 127 | path_params: typing.Optional[typing.Dict[str, typing.Any]] = None, 128 | query_params: typing.Optional[ 129 | typing.List[typing.Tuple[str, typing.Any]] 130 | ] = None, 131 | header_params: typing.Optional[typing.Dict[str, typing.Any]] = None, 132 | body: typing.Optional[typing.Any] = None, 133 | post_params: typing.Optional[typing.List[typing.Tuple[str, typing.Any]]] = None, 134 | files: typing.Optional[typing.Dict[str, typing.List[io.IOBase]]] = None, 135 | response_type: typing.Optional[typing.Tuple[typing.Any]] = None, 136 | auth_settings: typing.Optional[typing.List[str]] = None, 137 | _return_http_data_only: typing.Optional[bool] = None, 138 | collection_formats: typing.Optional[typing.Dict[str, str]] = None, 139 | _preload_content: bool = True, 140 | _request_timeout: typing.Optional[ 141 | typing.Union[int, float, typing.Tuple] 142 | ] = None, 143 | _host: typing.Optional[str] = None, 144 | _check_type: typing.Optional[bool] = None, 145 | _content_type: typing.Optional[str] = None, 146 | _request_auths: typing.Optional[ 147 | typing.List[typing.Dict[str, typing.Any]] 148 | ] = None, 149 | ): 150 | config = self.configuration 151 | 152 | # header parameters 153 | header_params = header_params or {} 154 | header_params.update(self.default_headers) 155 | if self.cookie: 156 | header_params["Cookie"] = self.cookie 157 | if header_params: 158 | header_params = self.sanitize_for_serialization(header_params) 159 | header_params = dict( 160 | self.parameters_to_tuples(header_params, collection_formats) 161 | ) 162 | 163 | # path parameters 164 | if path_params: 165 | path_params = self.sanitize_for_serialization(path_params) 166 | path_params = self.parameters_to_tuples(path_params, collection_formats) 167 | for k, v in path_params: 168 | # specified safe chars, encode everything 169 | resource_path = resource_path.replace( 170 | "{%s}" % k, quote(str(v), safe=config.safe_chars_for_path_param) 171 | ) 172 | 173 | # query parameters 174 | if query_params: 175 | query_params = self.sanitize_for_serialization(query_params) 176 | query_params = self.parameters_to_tuples(query_params, collection_formats) 177 | 178 | # post parameters 179 | if post_params or files: 180 | post_params = post_params if post_params else [] 181 | post_params = self.sanitize_for_serialization(post_params) 182 | post_params = self.parameters_to_tuples(post_params, collection_formats) 183 | post_params.extend(self.files_parameters(files)) 184 | if header_params["Content-Type"].startswith("multipart"): 185 | post_params = self.parameters_to_multipart(post_params, (dict)) 186 | 187 | # body 188 | if body: 189 | body = self.sanitize_for_serialization(body) 190 | 191 | # auth setting 192 | self.update_params_for_auth( 193 | header_params, 194 | query_params, 195 | auth_settings, 196 | resource_path, 197 | method, 198 | body, 199 | request_auths=_request_auths, 200 | ) 201 | 202 | # request url 203 | if _host is None: 204 | url = self.configuration.host + resource_path 205 | else: 206 | # use server/host defined in path or operation instead 207 | url = _host + resource_path 208 | 209 | try: 210 | # perform request and return response 211 | response_data = self.request( 212 | method, 213 | url, 214 | query_params=query_params, 215 | headers=header_params, 216 | post_params=post_params, 217 | body=body, 218 | _preload_content=_preload_content, 219 | _request_timeout=_request_timeout, 220 | ) 221 | except ApiException as e: 222 | e.body = e.body.decode("utf-8") 223 | raise e 224 | 225 | self.last_response = response_data 226 | 227 | return_data = response_data 228 | 229 | if not _preload_content: 230 | return return_data 231 | return return_data 232 | 233 | # deserialize response data 234 | if response_type: 235 | if response_type != (file_type,): 236 | encoding = "utf-8" 237 | content_type = response_data.getheader("content-type") 238 | if content_type is not None: 239 | match = re.search(r"charset=([a-zA-Z\-\d]+)[\s\;]?", content_type) 240 | if match: 241 | encoding = match.group(1) 242 | response_data.data = response_data.data.decode(encoding) 243 | 244 | return_data = self.deserialize(response_data, response_type, _check_type) 245 | else: 246 | return_data = None 247 | 248 | if _return_http_data_only: 249 | return return_data 250 | else: 251 | return (return_data, response_data.status, response_data.getheaders()) 252 | 253 | def parameters_to_multipart(self, params, collection_types): 254 | """Get parameters as list of tuples, formatting as json if value is collection_types 255 | 256 | :param params: Parameters as list of two-tuples 257 | :param dict collection_types: Parameter collection types 258 | :return: Parameters as list of tuple or urllib3.fields.RequestField 259 | """ 260 | new_params = [] 261 | if collection_types is None: 262 | collection_types = dict 263 | for k, v in ( 264 | params.items() if isinstance(params, dict) else params 265 | ): # noqa: E501 266 | if isinstance( 267 | v, collection_types 268 | ): # v is instance of collection_type, formatting as application/json 269 | v = json.dumps(v, ensure_ascii=False).encode("utf-8") 270 | field = RequestField(k, v) 271 | field.make_multipart(content_type="application/json; charset=utf-8") 272 | new_params.append(field) 273 | else: 274 | new_params.append((k, v)) 275 | return new_params 276 | 277 | @classmethod 278 | def sanitize_for_serialization(cls, obj): 279 | """Prepares data for transmission before it is sent with the rest client 280 | If obj is None, return None. 281 | If obj is str, int, long, float, bool, return directly. 282 | If obj is datetime.datetime, datetime.date 283 | convert to string in iso8601 format. 284 | If obj is list, sanitize each element in the list. 285 | If obj is dict, return the dict. 286 | If obj is OpenAPI model, return the properties dict. 287 | If obj is io.IOBase, return the bytes 288 | :param obj: The data to serialize. 289 | :return: The serialized form of data. 290 | """ 291 | if isinstance(obj, (ModelNormal, ModelComposed)): 292 | return { 293 | key: cls.sanitize_for_serialization(val) 294 | for key, val in model_to_dict(obj, serialize=True).items() 295 | } 296 | elif isinstance(obj, io.IOBase): 297 | return cls.get_file_data_and_close_file(obj) 298 | elif isinstance(obj, (str, int, float, none_type, bool)): 299 | return obj 300 | elif isinstance(obj, (datetime, date)): 301 | return obj.isoformat() 302 | elif isinstance(obj, ModelSimple): 303 | return cls.sanitize_for_serialization(obj.value) 304 | elif isinstance(obj, (list, tuple)): 305 | return [cls.sanitize_for_serialization(item) for item in obj] 306 | if isinstance(obj, dict): 307 | return { 308 | key: cls.sanitize_for_serialization(val) for key, val in obj.items() 309 | } 310 | raise ApiValueError( 311 | "Unable to prepare type {} for serialization".format(obj.__class__.__name__) 312 | ) 313 | 314 | def deserialize(self, response, response_type, _check_type): 315 | """Deserializes response into an object. 316 | 317 | :param response: RESTResponse object to be deserialized. 318 | :param response_type: For the response, a tuple containing: 319 | valid classes 320 | a list containing valid classes (for list schemas) 321 | a dict containing a tuple of valid classes as the value 322 | Example values: 323 | (str,) 324 | (Pet,) 325 | (float, none_type) 326 | ([int, none_type],) 327 | ({str: (bool, str, int, float, date, datetime, str, none_type)},) 328 | :param _check_type: boolean, whether to check the types of the data 329 | received from the server 330 | :type _check_type: bool 331 | 332 | :return: deserialized object. 333 | """ 334 | # handle file downloading 335 | # save response body into a tmp file and return the instance 336 | if response_type == (file_type,): 337 | content_disposition = response.getheader("Content-Disposition") 338 | return deserialize_file( 339 | response.data, 340 | self.configuration, 341 | content_disposition=content_disposition, 342 | ) 343 | 344 | # fetch data from response object 345 | try: 346 | received_data = json.loads(response.data) 347 | except ValueError: 348 | received_data = response.data 349 | 350 | # store our data under the key of 'received_data' so users have some 351 | # context if they are deserializing a string and the data type is wrong 352 | deserialized_data = validate_and_convert_types( 353 | received_data, 354 | response_type, 355 | ["received_data"], 356 | True, 357 | _check_type, 358 | configuration=self.configuration, 359 | ) 360 | return deserialized_data 361 | 362 | def call_api( 363 | self, 364 | resource_path: str, 365 | method: str, 366 | path_params: typing.Optional[typing.Dict[str, typing.Any]] = None, 367 | query_params: typing.Optional[ 368 | typing.List[typing.Tuple[str, typing.Any]] 369 | ] = None, 370 | header_params: typing.Optional[typing.Dict[str, typing.Any]] = None, 371 | body: typing.Optional[typing.Any] = None, 372 | post_params: typing.Optional[typing.List[typing.Tuple[str, typing.Any]]] = None, 373 | files: typing.Optional[typing.Dict[str, typing.List[io.IOBase]]] = None, 374 | response_type: typing.Optional[typing.Tuple[typing.Any]] = None, 375 | auth_settings: typing.Optional[typing.List[str]] = None, 376 | async_req: typing.Optional[bool] = None, 377 | _return_http_data_only: typing.Optional[bool] = None, 378 | collection_formats: typing.Optional[typing.Dict[str, str]] = None, 379 | _preload_content: bool = True, 380 | _request_timeout: typing.Optional[ 381 | typing.Union[int, float, typing.Tuple] 382 | ] = None, 383 | _host: typing.Optional[str] = None, 384 | _check_type: typing.Optional[bool] = None, 385 | _request_auths: typing.Optional[ 386 | typing.List[typing.Dict[str, typing.Any]] 387 | ] = None, 388 | ): 389 | """Makes the HTTP request (synchronous) and returns deserialized data. 390 | 391 | To make an async_req request, set the async_req parameter. 392 | 393 | :param resource_path: Path to method endpoint. 394 | :param method: Method to call. 395 | :param path_params: Path parameters in the url. 396 | :param query_params: Query parameters in the url. 397 | :param header_params: Header parameters to be 398 | placed in the request header. 399 | :param body: Request body. 400 | :param post_params dict: Request post form parameters, 401 | for `application/x-www-form-urlencoded`, `multipart/form-data`. 402 | :param auth_settings list: Auth Settings names for the request. 403 | :param response_type: For the response, a tuple containing: 404 | valid classes 405 | a list containing valid classes (for list schemas) 406 | a dict containing a tuple of valid classes as the value 407 | Example values: 408 | (str,) 409 | (Pet,) 410 | (float, none_type) 411 | ([int, none_type],) 412 | ({str: (bool, str, int, float, date, datetime, str, none_type)},) 413 | :param files: key -> field name, value -> a list of open file 414 | objects for `multipart/form-data`. 415 | :type files: dict 416 | :param async_req bool: execute request asynchronously 417 | :type async_req: bool, optional 418 | :param _return_http_data_only: response data without head status code 419 | and headers 420 | :type _return_http_data_only: bool, optional 421 | :param collection_formats: dict of collection formats for path, query, 422 | header, and post parameters. 423 | :type collection_formats: dict, optional 424 | :param _preload_content: if False, the urllib3.HTTPResponse object will 425 | be returned without reading/decoding response 426 | data. Default is True. 427 | :type _preload_content: bool, optional 428 | :param _request_timeout: timeout setting for this request. If one 429 | number provided, it will be total request 430 | timeout. It can also be a pair (tuple) of 431 | (connection, read) timeouts. 432 | :param _check_type: boolean describing if the data back from the server 433 | should have its type checked. 434 | :type _check_type: bool, optional 435 | :param _request_auths: set to override the auth_settings for an a single 436 | request; this effectively ignores the authentication 437 | in the spec for a single request. 438 | :type _request_auths: list, optional 439 | :return: 440 | If async_req parameter is True, 441 | the request will be called asynchronously. 442 | The method will return the request thread. 443 | If parameter async_req is False or missing, 444 | then the method will return the response directly. 445 | """ 446 | if not async_req: 447 | return self.__call_api( 448 | resource_path, 449 | method, 450 | path_params, 451 | query_params, 452 | header_params, 453 | body, 454 | post_params, 455 | files, 456 | response_type, 457 | auth_settings, 458 | _return_http_data_only, 459 | collection_formats, 460 | _preload_content, 461 | _request_timeout, 462 | _host, 463 | _check_type, 464 | _request_auths=_request_auths, 465 | ) 466 | 467 | return self.pool.apply_async( 468 | self.__call_api, 469 | ( 470 | resource_path, 471 | method, 472 | path_params, 473 | query_params, 474 | header_params, 475 | body, 476 | post_params, 477 | files, 478 | response_type, 479 | auth_settings, 480 | _return_http_data_only, 481 | collection_formats, 482 | _preload_content, 483 | _request_timeout, 484 | _host, 485 | _check_type, 486 | None, 487 | _request_auths, 488 | ), 489 | ) 490 | 491 | def request( 492 | self, 493 | method, 494 | url, 495 | query_params=None, 496 | headers=None, 497 | post_params=None, 498 | body=None, 499 | _preload_content=True, 500 | _request_timeout=None, 501 | ): 502 | """Makes the HTTP request using RESTClient.""" 503 | if method == "GET": 504 | return self.rest_client.GET( 505 | url, 506 | query_params=query_params, 507 | _preload_content=_preload_content, 508 | _request_timeout=_request_timeout, 509 | headers=headers, 510 | ) 511 | elif method == "HEAD": 512 | return self.rest_client.HEAD( 513 | url, 514 | query_params=query_params, 515 | _preload_content=_preload_content, 516 | _request_timeout=_request_timeout, 517 | headers=headers, 518 | ) 519 | elif method == "OPTIONS": 520 | return self.rest_client.OPTIONS( 521 | url, 522 | query_params=query_params, 523 | headers=headers, 524 | post_params=post_params, 525 | _preload_content=_preload_content, 526 | _request_timeout=_request_timeout, 527 | body=body, 528 | ) 529 | elif method == "POST": 530 | return self.rest_client.POST( 531 | url, 532 | query_params=query_params, 533 | headers=headers, 534 | post_params=post_params, 535 | _preload_content=_preload_content, 536 | _request_timeout=_request_timeout, 537 | body=body, 538 | ) 539 | elif method == "PUT": 540 | return self.rest_client.PUT( 541 | url, 542 | query_params=query_params, 543 | headers=headers, 544 | post_params=post_params, 545 | _preload_content=_preload_content, 546 | _request_timeout=_request_timeout, 547 | body=body, 548 | ) 549 | elif method == "PATCH": 550 | return self.rest_client.PATCH( 551 | url, 552 | query_params=query_params, 553 | headers=headers, 554 | post_params=post_params, 555 | _preload_content=_preload_content, 556 | _request_timeout=_request_timeout, 557 | body=body, 558 | ) 559 | elif method == "DELETE": 560 | return self.rest_client.DELETE( 561 | url, 562 | query_params=query_params, 563 | headers=headers, 564 | _preload_content=_preload_content, 565 | _request_timeout=_request_timeout, 566 | body=body, 567 | ) 568 | else: 569 | raise ApiValueError( 570 | "http method must be `GET`, `HEAD`, `OPTIONS`," 571 | " `POST`, `PATCH`, `PUT` or `DELETE`." 572 | ) 573 | 574 | def parameters_to_tuples(self, params, collection_formats): 575 | """Get parameters as list of tuples, formatting collections. 576 | 577 | :param params: Parameters as dict or list of two-tuples 578 | :param dict collection_formats: Parameter collection formats 579 | :return: Parameters as list of tuples, collections formatted 580 | """ 581 | new_params = [] 582 | if collection_formats is None: 583 | collection_formats = {} 584 | for k, v in ( 585 | params.items() if isinstance(params, dict) else params 586 | ): # noqa: E501 587 | if k in collection_formats: 588 | collection_format = collection_formats[k] 589 | if collection_format == "multi": 590 | new_params.extend((k, value) for value in v) 591 | else: 592 | if collection_format == "ssv": 593 | delimiter = " " 594 | elif collection_format == "tsv": 595 | delimiter = "\t" 596 | elif collection_format == "pipes": 597 | delimiter = "|" 598 | else: # csv is the default 599 | delimiter = "," 600 | new_params.append((k, delimiter.join(str(value) for value in v))) 601 | else: 602 | new_params.append((k, v)) 603 | return new_params 604 | 605 | @staticmethod 606 | def get_file_data_and_close_file(file_instance: io.IOBase) -> bytes: 607 | file_data = file_instance.read() 608 | file_instance.close() 609 | return file_data 610 | 611 | def files_parameters( 612 | self, files: typing.Optional[typing.Dict[str, typing.List[io.IOBase]]] = None 613 | ): 614 | """Builds form parameters. 615 | 616 | :param files: None or a dict with key=param_name and 617 | value is a list of open file objects 618 | :return: List of tuples of form parameters with file data 619 | """ 620 | if files is None: 621 | return [] 622 | 623 | params = [] 624 | for param_name, file_instances in files.items(): 625 | if file_instances is None: 626 | # if the file field is nullable, skip None values 627 | continue 628 | for file_instance in file_instances: 629 | if file_instance is None: 630 | # if the file field is nullable, skip None values 631 | continue 632 | if file_instance.closed is True: 633 | raise ApiValueError( 634 | "Cannot read a closed file. The passed in file_type " 635 | "for %s must be open." % param_name 636 | ) 637 | filename = os.path.basename(file_instance.name) 638 | filedata = self.get_file_data_and_close_file(file_instance) 639 | mimetype = ( 640 | mimetypes.guess_type(filename)[0] or "application/octet-stream" 641 | ) 642 | params.append( 643 | tuple([param_name, tuple([filename, filedata, mimetype])]) 644 | ) 645 | 646 | return params 647 | 648 | def select_header_accept(self, accepts): 649 | """Returns `Accept` based on an array of accepts provided. 650 | 651 | :param accepts: List of headers. 652 | :return: Accept (e.g. application/json). 653 | """ 654 | if not accepts: 655 | return 656 | 657 | accepts = [x.lower() for x in accepts] 658 | 659 | if "application/json" in accepts: 660 | return "application/json" 661 | else: 662 | return ", ".join(accepts) 663 | 664 | def select_header_content_type(self, content_types, method=None, body=None): 665 | """Returns `Content-Type` based on an array of content_types provided. 666 | 667 | :param content_types: List of content-types. 668 | :param method: http method (e.g. POST, PATCH). 669 | :param body: http body to send. 670 | :return: Content-Type (e.g. application/json). 671 | """ 672 | if not content_types: 673 | return None 674 | 675 | content_types = [x.lower() for x in content_types] 676 | 677 | if ( 678 | method == "PATCH" 679 | and "application/json-patch+json" in content_types 680 | and isinstance(body, list) 681 | ): 682 | return "application/json-patch+json" 683 | 684 | if "application/json" in content_types or "*/*" in content_types: 685 | return "application/json" 686 | else: 687 | return content_types[0] 688 | 689 | def update_params_for_auth( 690 | self, 691 | headers, 692 | queries, 693 | auth_settings, 694 | resource_path, 695 | method, 696 | body, 697 | request_auths=None, 698 | ): 699 | """Updates header and query params based on authentication setting. 700 | 701 | :param headers: Header parameters dict to be updated. 702 | :param queries: Query parameters tuple list to be updated. 703 | :param auth_settings: Authentication setting identifiers list. 704 | :param resource_path: A string representation of the HTTP request resource path. 705 | :param method: A string representation of the HTTP request method. 706 | :param body: A object representing the body of the HTTP request. 707 | The object type is the return value of _encoder.default(). 708 | :param request_auths: if set, the provided settings will 709 | override the token in the configuration. 710 | """ 711 | if not auth_settings: 712 | return 713 | 714 | if request_auths: 715 | for auth_setting in request_auths: 716 | self._apply_auth_params( 717 | headers, queries, resource_path, method, body, auth_setting 718 | ) 719 | return 720 | 721 | for auth in auth_settings: 722 | auth_setting = self.configuration.auth_settings().get(auth) 723 | if auth_setting: 724 | self._apply_auth_params( 725 | headers, queries, resource_path, method, body, auth_setting 726 | ) 727 | 728 | def _apply_auth_params( 729 | self, headers, queries, resource_path, method, body, auth_setting 730 | ): 731 | if auth_setting["in"] == "cookie": 732 | headers["Cookie"] = auth_setting["key"] + "=" + auth_setting["value"] 733 | elif auth_setting["in"] == "header": 734 | if auth_setting["type"] != "http-signature": 735 | headers[auth_setting["key"]] = auth_setting["value"] 736 | elif auth_setting["in"] == "query": 737 | queries.append((auth_setting["key"], auth_setting["value"])) 738 | else: 739 | raise ApiValueError("Authentication token must be in `query` or `header`") 740 | 741 | 742 | class Endpoint(object): 743 | def __init__( 744 | self, 745 | settings=None, 746 | params_map=None, 747 | root_map=None, 748 | headers_map=None, 749 | api_client=None, 750 | callable=None, 751 | ): 752 | """Creates an endpoint 753 | 754 | Args: 755 | settings (dict): see below key value pairs 756 | 'response_type' (tuple/None): response type 757 | 'auth' (list): a list of auth type keys 758 | 'endpoint_path' (str): the endpoint path 759 | 'operation_id' (str): endpoint string identifier 760 | 'http_method' (str): POST/PUT/PATCH/GET etc 761 | 'servers' (list): list of str servers that this endpoint is at 762 | params_map (dict): see below key value pairs 763 | 'all' (list): list of str endpoint parameter names 764 | 'required' (list): list of required parameter names 765 | 'nullable' (list): list of nullable parameter names 766 | 'enum' (list): list of parameters with enum values 767 | 'validation' (list): list of parameters with validations 768 | root_map 769 | 'validations' (dict): the dict mapping endpoint parameter tuple 770 | paths to their validation dictionaries 771 | 'allowed_values' (dict): the dict mapping endpoint parameter 772 | tuple paths to their allowed_values (enum) dictionaries 773 | 'openapi_types' (dict): param_name to openapi type 774 | 'attribute_map' (dict): param_name to camelCase name 775 | 'location_map' (dict): param_name to 'body', 'file', 'form', 776 | 'header', 'path', 'query' 777 | collection_format_map (dict): param_name to `csv` etc. 778 | headers_map (dict): see below key value pairs 779 | 'accept' (list): list of Accept header strings 780 | 'content_type' (list): list of Content-Type header strings 781 | api_client (ApiClient) api client instance 782 | callable (function): the function which is invoked when the 783 | Endpoint is called 784 | """ 785 | self.settings = settings 786 | self.params_map = params_map 787 | self.params_map["all"].extend( 788 | [ 789 | "async_req", 790 | "_host_index", 791 | "_preload_content", 792 | "_request_timeout", 793 | "_return_http_data_only", 794 | "_check_input_type", 795 | "_check_return_type", 796 | "_content_type", 797 | "_spec_property_naming", 798 | "_request_auths", 799 | ] 800 | ) 801 | self.params_map["nullable"].extend(["_request_timeout"]) 802 | self.validations = root_map["validations"] 803 | self.allowed_values = root_map["allowed_values"] 804 | self.openapi_types = root_map["openapi_types"] 805 | extra_types = { 806 | "async_req": (bool,), 807 | "_host_index": (none_type, int), 808 | "_preload_content": (bool,), 809 | "_request_timeout": ( 810 | none_type, 811 | float, 812 | (float,), 813 | [float], 814 | int, 815 | (int,), 816 | [int], 817 | ), 818 | "_return_http_data_only": (bool,), 819 | "_check_input_type": (bool,), 820 | "_check_return_type": (bool,), 821 | "_spec_property_naming": (bool,), 822 | "_content_type": (none_type, str), 823 | "_request_auths": (none_type, list), 824 | } 825 | self.openapi_types.update(extra_types) 826 | self.attribute_map = root_map["attribute_map"] 827 | self.location_map = root_map["location_map"] 828 | self.collection_format_map = root_map["collection_format_map"] 829 | self.headers_map = headers_map 830 | self.api_client = api_client 831 | self.callable = callable 832 | 833 | def __validate_inputs(self, kwargs): 834 | for param in self.params_map["enum"]: 835 | if param in kwargs: 836 | check_allowed_values(self.allowed_values, (param,), kwargs[param]) 837 | 838 | for param in self.params_map["validation"]: 839 | if param in kwargs: 840 | check_validations( 841 | self.validations, 842 | (param,), 843 | kwargs[param], 844 | configuration=self.api_client.configuration, 845 | ) 846 | 847 | if kwargs["_check_input_type"] is False: 848 | return 849 | 850 | for key, value in kwargs.items(): 851 | fixed_val = validate_and_convert_types( 852 | value, 853 | self.openapi_types[key], 854 | [key], 855 | kwargs["_spec_property_naming"], 856 | kwargs["_check_input_type"], 857 | configuration=self.api_client.configuration, 858 | ) 859 | kwargs[key] = fixed_val 860 | 861 | def __gather_params(self, kwargs): 862 | params = { 863 | "body": None, 864 | "collection_format": {}, 865 | "file": {}, 866 | "form": [], 867 | "header": {}, 868 | "path": {}, 869 | "query": [], 870 | } 871 | 872 | for param_name, param_value in kwargs.items(): 873 | param_location = self.location_map.get(param_name) 874 | if param_location is None: 875 | continue 876 | if param_location: 877 | if param_location == "body": 878 | params["body"] = param_value 879 | continue 880 | base_name = self.attribute_map[param_name] 881 | if param_location == "form" and self.openapi_types[param_name] == ( 882 | file_type, 883 | ): 884 | params["file"][base_name] = [param_value] 885 | elif param_location == "form" and self.openapi_types[param_name] == ( 886 | [file_type], 887 | ): 888 | # param_value is already a list 889 | params["file"][base_name] = param_value 890 | elif param_location in {"form", "query"}: 891 | param_value_full = (base_name, param_value) 892 | params[param_location].append(param_value_full) 893 | if param_location not in {"form", "query"}: 894 | params[param_location][base_name] = param_value 895 | collection_format = self.collection_format_map.get(param_name) 896 | if collection_format: 897 | params["collection_format"][base_name] = collection_format 898 | 899 | return params 900 | 901 | def __call__(self, *args, **kwargs): 902 | """This method is invoked when endpoints are called 903 | Example: 904 | 905 | api_instance = DefaultApi() 906 | api_instance.chart2result # this is an instance of the class Endpoint 907 | api_instance.chart2result() # this invokes api_instance.chart2result.__call__() 908 | which then invokes the callable functions stored in that endpoint at 909 | api_instance.chart2result.callable or self.callable in this class 910 | 911 | """ 912 | return self.callable(self, *args, **kwargs) 913 | 914 | def call_with_http_info(self, **kwargs): 915 | try: 916 | index = ( 917 | self.api_client.configuration.server_operation_index.get( 918 | self.settings["operation_id"], 919 | self.api_client.configuration.server_index, 920 | ) 921 | if kwargs["_host_index"] is None 922 | else kwargs["_host_index"] 923 | ) 924 | server_variables = ( 925 | self.api_client.configuration.server_operation_variables.get( 926 | self.settings["operation_id"], 927 | self.api_client.configuration.server_variables, 928 | ) 929 | ) 930 | _host = self.api_client.configuration.get_host_from_settings( 931 | index, variables=server_variables, servers=self.settings["servers"] 932 | ) 933 | except IndexError: 934 | if self.settings["servers"]: 935 | raise ApiValueError( 936 | "Invalid host index. Must be 0 <= index < %s" 937 | % len(self.settings["servers"]) 938 | ) 939 | _host = None 940 | 941 | for key, value in kwargs.items(): 942 | if key not in self.params_map["all"]: 943 | raise ApiTypeError( 944 | "Got an unexpected parameter '%s'" 945 | " to method `%s`" % (key, self.settings["operation_id"]) 946 | ) 947 | # only throw this nullable ApiValueError if _check_input_type 948 | # is False, if _check_input_type==True we catch this case 949 | # in self.__validate_inputs 950 | if ( 951 | key not in self.params_map["nullable"] 952 | and value is None 953 | and kwargs["_check_input_type"] is False 954 | ): 955 | raise ApiValueError( 956 | "Value may not be None for non-nullable parameter `%s`" 957 | " when calling `%s`" % (key, self.settings["operation_id"]) 958 | ) 959 | 960 | for key in self.params_map["required"]: 961 | if key not in kwargs.keys(): 962 | raise ApiValueError( 963 | "Missing the required parameter `%s` when calling " 964 | "`%s`" % (key, self.settings["operation_id"]) 965 | ) 966 | 967 | self.__validate_inputs(kwargs) 968 | 969 | params = self.__gather_params(kwargs) 970 | 971 | accept_headers_list = self.headers_map["accept"] 972 | if accept_headers_list: 973 | params["header"]["Accept"] = self.api_client.select_header_accept( 974 | accept_headers_list 975 | ) 976 | 977 | if kwargs.get("_content_type"): 978 | params["header"]["Content-Type"] = kwargs["_content_type"] 979 | else: 980 | content_type_headers_list = self.headers_map["content_type"] 981 | if content_type_headers_list: 982 | if params["body"] != "": 983 | content_types_list = self.api_client.select_header_content_type( 984 | content_type_headers_list, 985 | self.settings["http_method"], 986 | params["body"], 987 | ) 988 | if content_types_list: 989 | params["header"]["Content-Type"] = content_types_list 990 | 991 | return self.api_client.call_api( 992 | self.settings["endpoint_path"], 993 | self.settings["http_method"], 994 | params["path"], 995 | params["query"], 996 | params["header"], 997 | body=params["body"], 998 | post_params=params["form"], 999 | files=params["file"], 1000 | response_type=self.settings["response_type"], 1001 | auth_settings=self.settings["auth"], 1002 | async_req=kwargs["async_req"], 1003 | _check_type=kwargs["_check_return_type"], 1004 | _return_http_data_only=kwargs["_return_http_data_only"], 1005 | _preload_content=kwargs["_preload_content"], 1006 | _request_timeout=kwargs["_request_timeout"], 1007 | _host=_host, 1008 | _request_auths=kwargs["_request_auths"], 1009 | collection_formats=params["collection_format"], 1010 | ) 1011 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/apis/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa 2 | 3 | # Import all APIs into this package. 4 | # If you have many APIs here with many many models used in each API this may 5 | # raise a `RecursionError`. 6 | # In order to avoid this, import only the API that you directly need like: 7 | # 8 | # from deutschland.destatis.api.default_api import DefaultApi 9 | # 10 | # or import this package, but before doing it, use: 11 | # 12 | # import sys 13 | # sys.setrecursionlimit(n) 14 | 15 | # Import APIs into API package: 16 | from deutschland.destatis.api.default_api import DefaultApi 17 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/configuration.py: -------------------------------------------------------------------------------- 1 | """ 2 | Destatis-API 3 | 4 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 5 | 6 | The version of the OpenAPI document: 1.0 7 | Contact: kontakt@bund.dev 8 | Generated by: https://openapi-generator.tech 9 | """ 10 | 11 | 12 | import copy 13 | import logging 14 | import multiprocessing 15 | import sys 16 | from http import client as http_client 17 | 18 | import urllib3 19 | from deutschland.destatis.exceptions import ApiValueError 20 | 21 | JSON_SCHEMA_VALIDATION_KEYWORDS = { 22 | "multipleOf", 23 | "maximum", 24 | "exclusiveMaximum", 25 | "minimum", 26 | "exclusiveMinimum", 27 | "maxLength", 28 | "minLength", 29 | "pattern", 30 | "maxItems", 31 | "minItems", 32 | } 33 | 34 | 35 | class Configuration(object): 36 | """NOTE: This class is auto generated by OpenAPI Generator 37 | 38 | Ref: https://openapi-generator.tech 39 | Do not edit the class manually. 40 | 41 | :param host: Base url 42 | :param api_key: Dict to store API key(s). 43 | Each entry in the dict specifies an API key. 44 | The dict key is the name of the security scheme in the OAS specification. 45 | The dict value is the API key secret. 46 | :param api_key_prefix: Dict to store API prefix (e.g. Bearer) 47 | The dict key is the name of the security scheme in the OAS specification. 48 | The dict value is an API key prefix when generating the auth data. 49 | :param username: Username for HTTP basic authentication 50 | :param password: Password for HTTP basic authentication 51 | :param discard_unknown_keys: Boolean value indicating whether to discard 52 | unknown properties. A server may send a response that includes additional 53 | properties that are not known by the client in the following scenarios: 54 | 1. The OpenAPI document is incomplete, i.e. it does not match the server 55 | implementation. 56 | 2. The client was generated using an older version of the OpenAPI document 57 | and the server has been upgraded since then. 58 | If a schema in the OpenAPI document defines the additionalProperties attribute, 59 | then all undeclared properties received by the server are injected into the 60 | additional properties map. In that case, there are undeclared properties, and 61 | nothing to discard. 62 | :param disabled_client_side_validations (string): Comma-separated list of 63 | JSON schema validation keywords to disable JSON schema structural validation 64 | rules. The following keywords may be specified: multipleOf, maximum, 65 | exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern, 66 | maxItems, minItems. 67 | By default, the validation is performed for data generated locally by the client 68 | and data received from the server, independent of any validation performed by 69 | the server side. If the input data does not satisfy the JSON schema validation 70 | rules specified in the OpenAPI document, an exception is raised. 71 | If disabled_client_side_validations is set, structural validation is 72 | disabled. This can be useful to troubleshoot data validation problem, such as 73 | when the OpenAPI document validation rules do not match the actual API data 74 | received by the server. 75 | :param server_index: Index to servers configuration. 76 | :param server_variables: Mapping with string values to replace variables in 77 | templated server configuration. The validation of enums is performed for 78 | variables with defined enum values before. 79 | :param server_operation_index: Mapping from operation ID to an index to server 80 | configuration. 81 | :param server_operation_variables: Mapping from operation ID to a mapping with 82 | string values to replace variables in templated server configuration. 83 | The validation of enums is performed for variables with defined enum values before. 84 | :param ssl_ca_cert: str - the path to a file of concatenated CA certificates 85 | in PEM format 86 | 87 | """ 88 | 89 | _default = None 90 | 91 | def __init__( 92 | self, 93 | host=None, 94 | api_key=None, 95 | api_key_prefix=None, 96 | access_token=None, 97 | username=None, 98 | password=None, 99 | discard_unknown_keys=False, 100 | disabled_client_side_validations="", 101 | server_index=None, 102 | server_variables=None, 103 | server_operation_index=None, 104 | server_operation_variables=None, 105 | ssl_ca_cert=None, 106 | ): 107 | """Constructor""" 108 | self._base_path = ( 109 | "https://www-genesis.destatis.de/genesisWS/rest/2020" 110 | if host is None 111 | else host 112 | ) 113 | """Default Base url 114 | """ 115 | self.server_index = 0 if server_index is None and host is None else server_index 116 | self.server_operation_index = server_operation_index or {} 117 | """Default server index 118 | """ 119 | self.server_variables = server_variables or {} 120 | self.server_operation_variables = server_operation_variables or {} 121 | """Default server variables 122 | """ 123 | self.temp_folder_path = None 124 | """Temp file folder for downloading files 125 | """ 126 | # Authentication Settings 127 | self.access_token = access_token 128 | self.api_key = {} 129 | if api_key: 130 | self.api_key = api_key 131 | """dict to store API key(s) 132 | """ 133 | self.api_key_prefix = {} 134 | if api_key_prefix: 135 | self.api_key_prefix = api_key_prefix 136 | """dict to store API prefix (e.g. Bearer) 137 | """ 138 | self.refresh_api_key_hook = None 139 | """function hook to refresh API key if expired 140 | """ 141 | self.username = username 142 | """Username for HTTP basic authentication 143 | """ 144 | self.password = password 145 | """Password for HTTP basic authentication 146 | """ 147 | self.discard_unknown_keys = discard_unknown_keys 148 | self.disabled_client_side_validations = disabled_client_side_validations 149 | self.logger = {} 150 | """Logging Settings 151 | """ 152 | self.logger["package_logger"] = logging.getLogger("destatis") 153 | self.logger["urllib3_logger"] = logging.getLogger("urllib3") 154 | self.logger_format = "%(asctime)s %(levelname)s %(message)s" 155 | """Log format 156 | """ 157 | self.logger_stream_handler = None 158 | """Log stream handler 159 | """ 160 | self.logger_file_handler = None 161 | """Log file handler 162 | """ 163 | self.logger_file = None 164 | """Debug file location 165 | """ 166 | self.debug = False 167 | """Debug switch 168 | """ 169 | 170 | self.verify_ssl = True 171 | """SSL/TLS verification 172 | Set this to false to skip verifying SSL certificate when calling API 173 | from https server. 174 | """ 175 | self.ssl_ca_cert = ssl_ca_cert 176 | """Set this to customize the certificate file to verify the peer. 177 | """ 178 | self.cert_file = None 179 | """client certificate file 180 | """ 181 | self.key_file = None 182 | """client key file 183 | """ 184 | self.assert_hostname = None 185 | """Set this to True/False to enable/disable SSL hostname verification. 186 | """ 187 | 188 | self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 189 | """urllib3 connection pool's maximum number of connections saved 190 | per pool. urllib3 uses 1 connection as default value, but this is 191 | not the best value when you are making a lot of possibly parallel 192 | requests to the same host, which is often the case here. 193 | cpu_count * 5 is used as default value to increase performance. 194 | """ 195 | 196 | self.proxy = None 197 | """Proxy URL 198 | """ 199 | self.no_proxy = None 200 | """bypass proxy for host in the no_proxy list. 201 | """ 202 | self.proxy_headers = None 203 | """Proxy headers 204 | """ 205 | self.safe_chars_for_path_param = "" 206 | """Safe chars for path_param 207 | """ 208 | self.retries = None 209 | """Adding retries to override urllib3 default value 3 210 | """ 211 | # Enable client side validation 212 | self.client_side_validation = True 213 | 214 | # Options to pass down to the underlying urllib3 socket 215 | self.socket_options = None 216 | 217 | def __deepcopy__(self, memo): 218 | cls = self.__class__ 219 | result = cls.__new__(cls) 220 | memo[id(self)] = result 221 | for k, v in self.__dict__.items(): 222 | if k not in ("logger", "logger_file_handler"): 223 | setattr(result, k, copy.deepcopy(v, memo)) 224 | # shallow copy of loggers 225 | result.logger = copy.copy(self.logger) 226 | # use setters to configure loggers 227 | result.logger_file = self.logger_file 228 | result.debug = self.debug 229 | return result 230 | 231 | def __setattr__(self, name, value): 232 | object.__setattr__(self, name, value) 233 | if name == "disabled_client_side_validations": 234 | s = set(filter(None, value.split(","))) 235 | for v in s: 236 | if v not in JSON_SCHEMA_VALIDATION_KEYWORDS: 237 | raise ApiValueError("Invalid keyword: '{0}''".format(v)) 238 | self._disabled_client_side_validations = s 239 | 240 | @classmethod 241 | def set_default(cls, default): 242 | """Set default instance of configuration. 243 | 244 | It stores default configuration, which can be 245 | returned by get_default_copy method. 246 | 247 | :param default: object of Configuration 248 | """ 249 | cls._default = copy.deepcopy(default) 250 | 251 | @classmethod 252 | def get_default_copy(cls): 253 | """Return new instance of configuration. 254 | 255 | This method returns newly created, based on default constructor, 256 | object of Configuration class or returns a copy of default 257 | configuration passed by the set_default method. 258 | 259 | :return: The configuration object. 260 | """ 261 | if cls._default is not None: 262 | return copy.deepcopy(cls._default) 263 | return Configuration() 264 | 265 | @property 266 | def logger_file(self): 267 | """The logger file. 268 | 269 | If the logger_file is None, then add stream handler and remove file 270 | handler. Otherwise, add file handler and remove stream handler. 271 | 272 | :param value: The logger_file path. 273 | :type: str 274 | """ 275 | return self.__logger_file 276 | 277 | @logger_file.setter 278 | def logger_file(self, value): 279 | """The logger file. 280 | 281 | If the logger_file is None, then add stream handler and remove file 282 | handler. Otherwise, add file handler and remove stream handler. 283 | 284 | :param value: The logger_file path. 285 | :type: str 286 | """ 287 | self.__logger_file = value 288 | if self.__logger_file: 289 | # If set logging file, 290 | # then add file handler and remove stream handler. 291 | self.logger_file_handler = logging.FileHandler(self.__logger_file) 292 | self.logger_file_handler.setFormatter(self.logger_formatter) 293 | for _, logger in self.logger.items(): 294 | logger.addHandler(self.logger_file_handler) 295 | 296 | @property 297 | def debug(self): 298 | """Debug status 299 | 300 | :param value: The debug status, True or False. 301 | :type: bool 302 | """ 303 | return self.__debug 304 | 305 | @debug.setter 306 | def debug(self, value): 307 | """Debug status 308 | 309 | :param value: The debug status, True or False. 310 | :type: bool 311 | """ 312 | self.__debug = value 313 | if self.__debug: 314 | # if debug status is True, turn on debug logging 315 | for _, logger in self.logger.items(): 316 | logger.setLevel(logging.DEBUG) 317 | # turn on http_client debug 318 | http_client.HTTPConnection.debuglevel = 1 319 | else: 320 | # if debug status is False, turn off debug logging, 321 | # setting log level to default `logging.WARNING` 322 | for _, logger in self.logger.items(): 323 | logger.setLevel(logging.WARNING) 324 | # turn off http_client debug 325 | http_client.HTTPConnection.debuglevel = 0 326 | 327 | @property 328 | def logger_format(self): 329 | """The logger format. 330 | 331 | The logger_formatter will be updated when sets logger_format. 332 | 333 | :param value: The format string. 334 | :type: str 335 | """ 336 | return self.__logger_format 337 | 338 | @logger_format.setter 339 | def logger_format(self, value): 340 | """The logger format. 341 | 342 | The logger_formatter will be updated when sets logger_format. 343 | 344 | :param value: The format string. 345 | :type: str 346 | """ 347 | self.__logger_format = value 348 | self.logger_formatter = logging.Formatter(self.__logger_format) 349 | 350 | def get_api_key_with_prefix(self, identifier, alias=None): 351 | """Gets API key (with prefix if set). 352 | 353 | :param identifier: The identifier of apiKey. 354 | :param alias: The alternative identifier of apiKey. 355 | :return: The token for api key authentication. 356 | """ 357 | if self.refresh_api_key_hook is not None: 358 | self.refresh_api_key_hook(self) 359 | key = self.api_key.get( 360 | identifier, self.api_key.get(alias) if alias is not None else None 361 | ) 362 | if key: 363 | prefix = self.api_key_prefix.get(identifier) 364 | if prefix: 365 | return "%s %s" % (prefix, key) 366 | else: 367 | return key 368 | 369 | def get_basic_auth_token(self): 370 | """Gets HTTP basic authentication header (string). 371 | 372 | :return: The token for basic HTTP authentication. 373 | """ 374 | username = "" 375 | if self.username is not None: 376 | username = self.username 377 | password = "" 378 | if self.password is not None: 379 | password = self.password 380 | return urllib3.util.make_headers(basic_auth=username + ":" + password).get( 381 | "authorization" 382 | ) 383 | 384 | def auth_settings(self): 385 | """Gets Auth Settings dict for api client. 386 | 387 | :return: The Auth Settings information dict. 388 | """ 389 | auth = {} 390 | return auth 391 | 392 | def to_debug_report(self): 393 | """Gets the essential information for debugging. 394 | 395 | :return: The report for debugging. 396 | """ 397 | return ( 398 | "Python SDK Debug Report:\n" 399 | "OS: {env}\n" 400 | "Python Version: {pyversion}\n" 401 | "Version of the API: 1.0\n" 402 | "SDK Package Version: 0.1.0".format(env=sys.platform, pyversion=sys.version) 403 | ) 404 | 405 | def get_host_settings(self): 406 | """Gets an array of host settings 407 | 408 | :return: An array of host settings 409 | """ 410 | return [ 411 | { 412 | "url": "https://www-genesis.destatis.de/genesisWS/rest/2020", 413 | "description": "No description provided", 414 | } 415 | ] 416 | 417 | def get_host_from_settings(self, index, variables=None, servers=None): 418 | """Gets host URL based on the index and variables 419 | :param index: array index of the host settings 420 | :param variables: hash of variable and the corresponding value 421 | :param servers: an array of host settings or None 422 | :return: URL based on host settings 423 | """ 424 | if index is None: 425 | return self._base_path 426 | 427 | variables = {} if variables is None else variables 428 | servers = self.get_host_settings() if servers is None else servers 429 | 430 | try: 431 | server = servers[index] 432 | except IndexError: 433 | raise ValueError( 434 | "Invalid index {0} when selecting the host settings. " 435 | "Must be less than {1}".format(index, len(servers)) 436 | ) 437 | 438 | url = server["url"] 439 | 440 | # go through variables and replace placeholders 441 | for variable_name, variable in server.get("variables", {}).items(): 442 | used_value = variables.get(variable_name, variable["default_value"]) 443 | 444 | if "enum_values" in variable and used_value not in variable["enum_values"]: 445 | raise ValueError( 446 | "The variable `{0}` in the host URL has invalid value " 447 | "{1}. Must be {2}.".format( 448 | variable_name, variables[variable_name], variable["enum_values"] 449 | ) 450 | ) 451 | 452 | url = url.replace("{" + variable_name + "}", used_value) 453 | 454 | return url 455 | 456 | @property 457 | def host(self): 458 | """Return generated host.""" 459 | return self.get_host_from_settings( 460 | self.server_index, variables=self.server_variables 461 | ) 462 | 463 | @host.setter 464 | def host(self, value): 465 | """Fix base path.""" 466 | self._base_path = value 467 | self.server_index = None 468 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/exceptions.py: -------------------------------------------------------------------------------- 1 | """ 2 | Destatis-API 3 | 4 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 5 | 6 | The version of the OpenAPI document: 1.0 7 | Contact: kontakt@bund.dev 8 | Generated by: https://openapi-generator.tech 9 | """ 10 | 11 | 12 | class OpenApiException(Exception): 13 | """The base exception class for all OpenAPIExceptions""" 14 | 15 | 16 | class ApiTypeError(OpenApiException, TypeError): 17 | def __init__(self, msg, path_to_item=None, valid_classes=None, key_type=None): 18 | """Raises an exception for TypeErrors 19 | 20 | Args: 21 | msg (str): the exception message 22 | 23 | Keyword Args: 24 | path_to_item (list): a list of keys an indices to get to the 25 | current_item 26 | None if unset 27 | valid_classes (tuple): the primitive classes that current item 28 | should be an instance of 29 | None if unset 30 | key_type (bool): False if our value is a value in a dict 31 | True if it is a key in a dict 32 | False if our item is an item in a list 33 | None if unset 34 | """ 35 | self.path_to_item = path_to_item 36 | self.valid_classes = valid_classes 37 | self.key_type = key_type 38 | full_msg = msg 39 | if path_to_item: 40 | full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) 41 | super(ApiTypeError, self).__init__(full_msg) 42 | 43 | 44 | class ApiValueError(OpenApiException, ValueError): 45 | def __init__(self, msg, path_to_item=None): 46 | """ 47 | Args: 48 | msg (str): the exception message 49 | 50 | Keyword Args: 51 | path_to_item (list) the path to the exception in the 52 | received_data dict. None if unset 53 | """ 54 | 55 | self.path_to_item = path_to_item 56 | full_msg = msg 57 | if path_to_item: 58 | full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) 59 | super(ApiValueError, self).__init__(full_msg) 60 | 61 | 62 | class ApiAttributeError(OpenApiException, AttributeError): 63 | def __init__(self, msg, path_to_item=None): 64 | """ 65 | Raised when an attribute reference or assignment fails. 66 | 67 | Args: 68 | msg (str): the exception message 69 | 70 | Keyword Args: 71 | path_to_item (None/list) the path to the exception in the 72 | received_data dict 73 | """ 74 | self.path_to_item = path_to_item 75 | full_msg = msg 76 | if path_to_item: 77 | full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) 78 | super(ApiAttributeError, self).__init__(full_msg) 79 | 80 | 81 | class ApiKeyError(OpenApiException, KeyError): 82 | def __init__(self, msg, path_to_item=None): 83 | """ 84 | Args: 85 | msg (str): the exception message 86 | 87 | Keyword Args: 88 | path_to_item (None/list) the path to the exception in the 89 | received_data dict 90 | """ 91 | self.path_to_item = path_to_item 92 | full_msg = msg 93 | if path_to_item: 94 | full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) 95 | super(ApiKeyError, self).__init__(full_msg) 96 | 97 | 98 | class ApiException(OpenApiException): 99 | def __init__(self, status=None, reason=None, http_resp=None): 100 | if http_resp: 101 | self.status = http_resp.status 102 | self.reason = http_resp.reason 103 | self.body = http_resp.data 104 | self.headers = http_resp.getheaders() 105 | else: 106 | self.status = status 107 | self.reason = reason 108 | self.body = None 109 | self.headers = None 110 | 111 | def __str__(self): 112 | """Custom error messages for exception""" 113 | error_message = "Status Code: {0}\n" "Reason: {1}\n".format( 114 | self.status, self.reason 115 | ) 116 | if self.headers: 117 | error_message += "HTTP response headers: {0}\n".format(self.headers) 118 | 119 | if self.body: 120 | error_message += "HTTP response body: {0}\n".format(self.body) 121 | 122 | return error_message 123 | 124 | 125 | class NotFoundException(ApiException): 126 | def __init__(self, status=None, reason=None, http_resp=None): 127 | super(NotFoundException, self).__init__(status, reason, http_resp) 128 | 129 | 130 | class UnauthorizedException(ApiException): 131 | def __init__(self, status=None, reason=None, http_resp=None): 132 | super(UnauthorizedException, self).__init__(status, reason, http_resp) 133 | 134 | 135 | class ForbiddenException(ApiException): 136 | def __init__(self, status=None, reason=None, http_resp=None): 137 | super(ForbiddenException, self).__init__(status, reason, http_resp) 138 | 139 | 140 | class ServiceException(ApiException): 141 | def __init__(self, status=None, reason=None, http_resp=None): 142 | super(ServiceException, self).__init__(status, reason, http_resp) 143 | 144 | 145 | def render_path(path_to_item): 146 | """Returns a string representation of a path""" 147 | result = "" 148 | for pth in path_to_item: 149 | if isinstance(pth, int): 150 | result += "[{0}]".format(pth) 151 | else: 152 | result += "['{0}']".format(pth) 153 | return result 154 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/model/__init__.py: -------------------------------------------------------------------------------- 1 | # we can not import model classes here because that would create a circular 2 | # reference which would not work in python2 3 | # do not import all models into this module because that uses a lot of memory and stack frames 4 | # if you need the ability to import all models from one package, import them with 5 | # from deutschland.destatis.models import ModelA, ModelB 6 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/models/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa 2 | 3 | # import all models into this package 4 | # if you have many models here with many references from one model to another this may 5 | # raise a RecursionError 6 | # to avoid this, import only the models that you directly need like: 7 | # from from deutschland.destatis.model.pet import Pet 8 | # or import this package, but before doing it, use: 9 | # import sys 10 | # sys.setrecursionlimit(n) 11 | -------------------------------------------------------------------------------- /python-client/deutschland/destatis/rest.py: -------------------------------------------------------------------------------- 1 | """ 2 | Destatis-API 3 | 4 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 5 | 6 | The version of the OpenAPI document: 1.0 7 | Contact: kontakt@bund.dev 8 | Generated by: https://openapi-generator.tech 9 | """ 10 | 11 | 12 | import io 13 | import ipaddress 14 | import json 15 | import logging 16 | import re 17 | import ssl 18 | from urllib.parse import urlencode, urlparse 19 | from urllib.request import proxy_bypass_environment 20 | 21 | import urllib3 22 | from deutschland.destatis.exceptions import ( 23 | ApiException, 24 | ApiValueError, 25 | ForbiddenException, 26 | NotFoundException, 27 | ServiceException, 28 | UnauthorizedException, 29 | ) 30 | 31 | logger = logging.getLogger(__name__) 32 | 33 | 34 | class RESTResponse(io.IOBase): 35 | def __init__(self, resp): 36 | self.urllib3_response = resp 37 | self.status = resp.status 38 | self.reason = resp.reason 39 | self.data = resp.data 40 | 41 | def getheaders(self): 42 | """Returns a dictionary of the response headers.""" 43 | return self.urllib3_response.getheaders() 44 | 45 | def getheader(self, name, default=None): 46 | """Returns a given response header.""" 47 | return self.urllib3_response.getheader(name, default) 48 | 49 | 50 | class RESTClientObject(object): 51 | def __init__(self, configuration, pools_size=4, maxsize=None): 52 | # urllib3.PoolManager will pass all kw parameters to connectionpool 53 | # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 54 | # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 55 | # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 56 | # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 57 | 58 | # cert_reqs 59 | if configuration.verify_ssl: 60 | cert_reqs = ssl.CERT_REQUIRED 61 | else: 62 | cert_reqs = ssl.CERT_NONE 63 | 64 | addition_pool_args = {} 65 | if configuration.assert_hostname is not None: 66 | addition_pool_args[ 67 | "assert_hostname" 68 | ] = configuration.assert_hostname # noqa: E501 69 | 70 | if configuration.retries is not None: 71 | addition_pool_args["retries"] = configuration.retries 72 | 73 | if configuration.socket_options is not None: 74 | addition_pool_args["socket_options"] = configuration.socket_options 75 | 76 | if maxsize is None: 77 | if configuration.connection_pool_maxsize is not None: 78 | maxsize = configuration.connection_pool_maxsize 79 | else: 80 | maxsize = 4 81 | 82 | # https pool manager 83 | if configuration.proxy and not should_bypass_proxies( 84 | configuration.host, no_proxy=configuration.no_proxy or "" 85 | ): 86 | self.pool_manager = urllib3.ProxyManager( 87 | num_pools=pools_size, 88 | maxsize=maxsize, 89 | cert_reqs=cert_reqs, 90 | ca_certs=configuration.ssl_ca_cert, 91 | cert_file=configuration.cert_file, 92 | key_file=configuration.key_file, 93 | proxy_url=configuration.proxy, 94 | proxy_headers=configuration.proxy_headers, 95 | **addition_pool_args 96 | ) 97 | else: 98 | self.pool_manager = urllib3.PoolManager( 99 | num_pools=pools_size, 100 | maxsize=maxsize, 101 | cert_reqs=cert_reqs, 102 | ca_certs=configuration.ssl_ca_cert, 103 | cert_file=configuration.cert_file, 104 | key_file=configuration.key_file, 105 | **addition_pool_args 106 | ) 107 | 108 | def request( 109 | self, 110 | method, 111 | url, 112 | query_params=None, 113 | headers=None, 114 | body=None, 115 | post_params=None, 116 | _preload_content=True, 117 | _request_timeout=None, 118 | ): 119 | """Perform requests. 120 | 121 | :param method: http request method 122 | :param url: http request url 123 | :param query_params: query parameters in the url 124 | :param headers: http request headers 125 | :param body: request json body, for `application/json` 126 | :param post_params: request post parameters, 127 | `application/x-www-form-urlencoded` 128 | and `multipart/form-data` 129 | :param _preload_content: if False, the urllib3.HTTPResponse object will 130 | be returned without reading/decoding response 131 | data. Default is True. 132 | :param _request_timeout: timeout setting for this request. If one 133 | number provided, it will be total request 134 | timeout. It can also be a pair (tuple) of 135 | (connection, read) timeouts. 136 | """ 137 | method = method.upper() 138 | assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"] 139 | 140 | if post_params and body: 141 | raise ApiValueError( 142 | "body parameter cannot be used with post_params parameter." 143 | ) 144 | 145 | post_params = post_params or {} 146 | headers = headers or {} 147 | 148 | timeout = None 149 | if _request_timeout: 150 | if isinstance(_request_timeout, (int, float)): # noqa: E501,F821 151 | timeout = urllib3.Timeout(total=_request_timeout) 152 | elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2: 153 | timeout = urllib3.Timeout( 154 | connect=_request_timeout[0], read=_request_timeout[1] 155 | ) 156 | 157 | try: 158 | # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` 159 | if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: 160 | # Only set a default Content-Type for POST, PUT, PATCH and OPTIONS requests 161 | if (method != "DELETE") and ("Content-Type" not in headers): 162 | headers["Content-Type"] = "application/json" 163 | if query_params: 164 | url += "?" + urlencode(query_params) 165 | if ("Content-Type" not in headers) or ( 166 | re.search("json", headers["Content-Type"], re.IGNORECASE) 167 | ): 168 | request_body = None 169 | if body is not None: 170 | request_body = json.dumps(body) 171 | r = self.pool_manager.request( 172 | method, 173 | url, 174 | body=request_body, 175 | preload_content=_preload_content, 176 | timeout=timeout, 177 | headers=headers, 178 | ) 179 | elif ( 180 | headers["Content-Type"] == "application/x-www-form-urlencoded" 181 | ): # noqa: E501 182 | r = self.pool_manager.request( 183 | method, 184 | url, 185 | fields=post_params, 186 | encode_multipart=False, 187 | preload_content=_preload_content, 188 | timeout=timeout, 189 | headers=headers, 190 | ) 191 | elif headers["Content-Type"] == "multipart/form-data": 192 | # must del headers['Content-Type'], or the correct 193 | # Content-Type which generated by urllib3 will be 194 | # overwritten. 195 | del headers["Content-Type"] 196 | r = self.pool_manager.request( 197 | method, 198 | url, 199 | fields=post_params, 200 | encode_multipart=True, 201 | preload_content=_preload_content, 202 | timeout=timeout, 203 | headers=headers, 204 | ) 205 | # Pass a `string` parameter directly in the body to support 206 | # other content types than Json when `body` argument is 207 | # provided in serialized form 208 | elif isinstance(body, str) or isinstance(body, bytes): 209 | request_body = body 210 | r = self.pool_manager.request( 211 | method, 212 | url, 213 | body=request_body, 214 | preload_content=_preload_content, 215 | timeout=timeout, 216 | headers=headers, 217 | ) 218 | else: 219 | # Cannot generate the request from given parameters 220 | msg = """Cannot prepare a request message for provided 221 | arguments. Please check that your arguments match 222 | declared content type.""" 223 | raise ApiException(status=0, reason=msg) 224 | # For `GET`, `HEAD` 225 | else: 226 | r = self.pool_manager.request( 227 | method, 228 | url, 229 | fields=query_params, 230 | preload_content=_preload_content, 231 | timeout=timeout, 232 | headers=headers, 233 | ) 234 | except urllib3.exceptions.SSLError as e: 235 | msg = "{0}\n{1}".format(type(e).__name__, str(e)) 236 | raise ApiException(status=0, reason=msg) 237 | 238 | if _preload_content: 239 | r = RESTResponse(r) 240 | 241 | # log response body 242 | logger.debug("response body: %s", r.data) 243 | 244 | if not 200 <= r.status <= 299: 245 | if r.status == 401: 246 | raise UnauthorizedException(http_resp=r) 247 | 248 | if r.status == 403: 249 | raise ForbiddenException(http_resp=r) 250 | 251 | if r.status == 404: 252 | raise NotFoundException(http_resp=r) 253 | 254 | if 500 <= r.status <= 599: 255 | raise ServiceException(http_resp=r) 256 | 257 | raise ApiException(http_resp=r) 258 | 259 | return r 260 | 261 | def GET( 262 | self, 263 | url, 264 | headers=None, 265 | query_params=None, 266 | _preload_content=True, 267 | _request_timeout=None, 268 | ): 269 | return self.request( 270 | "GET", 271 | url, 272 | headers=headers, 273 | _preload_content=_preload_content, 274 | _request_timeout=_request_timeout, 275 | query_params=query_params, 276 | ) 277 | 278 | def HEAD( 279 | self, 280 | url, 281 | headers=None, 282 | query_params=None, 283 | _preload_content=True, 284 | _request_timeout=None, 285 | ): 286 | return self.request( 287 | "HEAD", 288 | url, 289 | headers=headers, 290 | _preload_content=_preload_content, 291 | _request_timeout=_request_timeout, 292 | query_params=query_params, 293 | ) 294 | 295 | def OPTIONS( 296 | self, 297 | url, 298 | headers=None, 299 | query_params=None, 300 | post_params=None, 301 | body=None, 302 | _preload_content=True, 303 | _request_timeout=None, 304 | ): 305 | return self.request( 306 | "OPTIONS", 307 | url, 308 | headers=headers, 309 | query_params=query_params, 310 | post_params=post_params, 311 | _preload_content=_preload_content, 312 | _request_timeout=_request_timeout, 313 | body=body, 314 | ) 315 | 316 | def DELETE( 317 | self, 318 | url, 319 | headers=None, 320 | query_params=None, 321 | body=None, 322 | _preload_content=True, 323 | _request_timeout=None, 324 | ): 325 | return self.request( 326 | "DELETE", 327 | url, 328 | headers=headers, 329 | query_params=query_params, 330 | _preload_content=_preload_content, 331 | _request_timeout=_request_timeout, 332 | body=body, 333 | ) 334 | 335 | def POST( 336 | self, 337 | url, 338 | headers=None, 339 | query_params=None, 340 | post_params=None, 341 | body=None, 342 | _preload_content=True, 343 | _request_timeout=None, 344 | ): 345 | return self.request( 346 | "POST", 347 | url, 348 | headers=headers, 349 | query_params=query_params, 350 | post_params=post_params, 351 | _preload_content=_preload_content, 352 | _request_timeout=_request_timeout, 353 | body=body, 354 | ) 355 | 356 | def PUT( 357 | self, 358 | url, 359 | headers=None, 360 | query_params=None, 361 | post_params=None, 362 | body=None, 363 | _preload_content=True, 364 | _request_timeout=None, 365 | ): 366 | return self.request( 367 | "PUT", 368 | url, 369 | headers=headers, 370 | query_params=query_params, 371 | post_params=post_params, 372 | _preload_content=_preload_content, 373 | _request_timeout=_request_timeout, 374 | body=body, 375 | ) 376 | 377 | def PATCH( 378 | self, 379 | url, 380 | headers=None, 381 | query_params=None, 382 | post_params=None, 383 | body=None, 384 | _preload_content=True, 385 | _request_timeout=None, 386 | ): 387 | return self.request( 388 | "PATCH", 389 | url, 390 | headers=headers, 391 | query_params=query_params, 392 | post_params=post_params, 393 | _preload_content=_preload_content, 394 | _request_timeout=_request_timeout, 395 | body=body, 396 | ) 397 | 398 | 399 | # end of class RESTClientObject 400 | 401 | 402 | def is_ipv4(target): 403 | """Test if IPv4 address or not""" 404 | try: 405 | chk = ipaddress.IPv4Address(target) 406 | return True 407 | except ipaddress.AddressValueError: 408 | return False 409 | 410 | 411 | def in_ipv4net(target, net): 412 | """Test if target belongs to given IPv4 network""" 413 | try: 414 | nw = ipaddress.IPv4Network(net) 415 | ip = ipaddress.IPv4Address(target) 416 | if ip in nw: 417 | return True 418 | return False 419 | except ipaddress.AddressValueError: 420 | return False 421 | except ipaddress.NetmaskValueError: 422 | return False 423 | 424 | 425 | def should_bypass_proxies(url, no_proxy=None): 426 | """Yet another requests.should_bypass_proxies 427 | Test if proxies should not be used for a particular url. 428 | """ 429 | 430 | parsed = urlparse(url) 431 | 432 | # special cases 433 | if parsed.hostname in [None, ""]: 434 | return True 435 | 436 | # special cases 437 | if no_proxy in [None, ""]: 438 | return False 439 | if no_proxy == "*": 440 | return True 441 | 442 | no_proxy = no_proxy.lower().replace(" ", "") 443 | entries = (host for host in no_proxy.split(",") if host) 444 | 445 | if is_ipv4(parsed.hostname): 446 | for item in entries: 447 | if in_ipv4net(parsed.hostname, item): 448 | return True 449 | return proxy_bypass_environment(parsed.hostname, {"no": no_proxy}) 450 | -------------------------------------------------------------------------------- /python-client/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool] 2 | [tool.poetry] 3 | name = "de-destatis" 4 | version = "0.1.0" 5 | description = "Destatis-API" 6 | keywords = ["OpenAPI", "OpenAPI-Generator", "destatis", "App", "API"] 7 | homepage = "https://github.com/bundesAPI/destatis-api" 8 | authors = ["BundesAPI "] 9 | packages = [ 10 | { include = "deutschland"} 11 | ] 12 | license = "Apache-2.0" 13 | readme = "README.md" 14 | 15 | [tool.poetry.dependencies] 16 | python = ">=3.6" 17 | python-dateutil = "*" 18 | urllib3 = ">=1.25.3" 19 | 20 | [tool.poetry.urls] 21 | "Bug Tracker" = "https://github.com/bundesAPI/destatis-api/issues" 22 | 23 | [tool.poetry.dev-dependencies] 24 | black = "^21.7b0" 25 | pytest = "^6.2.4" 26 | 27 | 28 | [build-system] 29 | requires = ["poetry-core>=1.0.0"] 30 | build-backend = "poetry.core.masonry.api" 31 | 32 | -------------------------------------------------------------------------------- /python-client/requirements.txt: -------------------------------------------------------------------------------- 1 | python_dateutil >= 2.5.3 2 | setuptools >= 59.0.0 3 | urllib3 >= 1.25.3 4 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/conf.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | sys.path.insert(0, os.path.abspath("../")) 5 | # Configuration file for the Sphinx documentation builder. 6 | # 7 | # For the full list of built-in configuration values, see the documentation: 8 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 9 | 10 | # -- Project information ----------------------------------------------------- 11 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information 12 | 13 | project = "destatis-api" 14 | copyright = "2023, BundesAPI" 15 | author = "BundesAPI" 16 | 17 | version = "0.1.0" 18 | release = "0.1.0" 19 | 20 | # -- General configuration --------------------------------------------------- 21 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration 22 | 23 | extensions = [ 24 | "m2r2", 25 | "sphinx.ext.autodoc", 26 | "sphinx.ext.napoleon", 27 | "sphinx.ext.autosummary", 28 | ] 29 | 30 | templates_path = ["_templates"] 31 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 32 | 33 | language = "de" 34 | 35 | # -- Options for HTML output ------------------------------------------------- 36 | # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output 37 | 38 | html_theme = "alabaster" 39 | html_static_path = ["_static"] 40 | 41 | source_extensions = [".rst", ".md"] 42 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/index.rst: -------------------------------------------------------------------------------- 1 | destatis-api Documentation 2 | ========================== 3 | 4 | .. toctree:: 5 | :glob: 6 | 7 | source/* 8 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | %SPHINXBUILD% >NUL 2>NUL 14 | if errorlevel 9009 ( 15 | echo. 16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 17 | echo.installed, then set the SPHINXBUILD environment variable to point 18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 19 | echo.may add the Sphinx directory to PATH. 20 | echo. 21 | echo.If you don't have Sphinx installed, grab it from 22 | echo.https://www.sphinx-doc.org/ 23 | exit /b 1 24 | ) 25 | 26 | if "%1" == "" goto help 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/destatis.api.rst: -------------------------------------------------------------------------------- 1 | destatis.api package 2 | ==================== 3 | 4 | Submodules 5 | ---------- 6 | 7 | destatis.api.default\_api module 8 | -------------------------------- 9 | 10 | .. automodule:: destatis.api.default_api 11 | :members: 12 | :undoc-members: 13 | :show-inheritance: 14 | 15 | Module contents 16 | --------------- 17 | 18 | .. automodule:: destatis.api 19 | :members: 20 | :undoc-members: 21 | :show-inheritance: 22 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/destatis.apis.rst: -------------------------------------------------------------------------------- 1 | destatis.apis package 2 | ===================== 3 | 4 | Module contents 5 | --------------- 6 | 7 | .. automodule:: destatis.apis 8 | :members: 9 | :undoc-members: 10 | :show-inheritance: 11 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/destatis.model.rst: -------------------------------------------------------------------------------- 1 | destatis.model package 2 | ====================== 3 | 4 | Module contents 5 | --------------- 6 | 7 | .. automodule:: destatis.model 8 | :members: 9 | :undoc-members: 10 | :show-inheritance: 11 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/destatis.models.rst: -------------------------------------------------------------------------------- 1 | destatis.models package 2 | ======================= 3 | 4 | Module contents 5 | --------------- 6 | 7 | .. automodule:: destatis.models 8 | :members: 9 | :undoc-members: 10 | :show-inheritance: 11 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/destatis.rst: -------------------------------------------------------------------------------- 1 | destatis package 2 | ================ 3 | 4 | Subpackages 5 | ----------- 6 | 7 | .. toctree:: 8 | :maxdepth: 4 9 | 10 | destatis.api 11 | destatis.apis 12 | destatis.model 13 | destatis.models 14 | 15 | Submodules 16 | ---------- 17 | 18 | destatis.api\_client module 19 | --------------------------- 20 | 21 | .. automodule:: destatis.api_client 22 | :members: 23 | :undoc-members: 24 | :show-inheritance: 25 | 26 | destatis.configuration module 27 | ----------------------------- 28 | 29 | .. automodule:: destatis.configuration 30 | :members: 31 | :undoc-members: 32 | :show-inheritance: 33 | 34 | destatis.exceptions module 35 | -------------------------- 36 | 37 | .. automodule:: destatis.exceptions 38 | :members: 39 | :undoc-members: 40 | :show-inheritance: 41 | 42 | destatis.model\_utils module 43 | ---------------------------- 44 | 45 | .. automodule:: destatis.model_utils 46 | :members: 47 | :undoc-members: 48 | :show-inheritance: 49 | 50 | destatis.rest module 51 | -------------------- 52 | 53 | .. automodule:: destatis.rest 54 | :members: 55 | :undoc-members: 56 | :show-inheritance: 57 | 58 | Module contents 59 | --------------- 60 | 61 | .. automodule:: destatis 62 | :members: 63 | :undoc-members: 64 | :show-inheritance: 65 | -------------------------------------------------------------------------------- /python-client/sphinx-docs/source/modules.rst: -------------------------------------------------------------------------------- 1 | deutschland 2 | =========== 3 | 4 | .. toctree:: 5 | :maxdepth: 4 6 | 7 | destatis 8 | -------------------------------------------------------------------------------- /python-client/test-requirements.txt: -------------------------------------------------------------------------------- 1 | pytest-cov>=2.8.1 2 | -------------------------------------------------------------------------------- /python-client/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bundesAPI/destatis-api/0dd95bff1669e8492dad0b2bf310ae744bbafa4e/python-client/test/__init__.py -------------------------------------------------------------------------------- /python-client/test/test_default_api.py: -------------------------------------------------------------------------------- 1 | """ 2 | Destatis-API 3 | 4 | No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 5 | 6 | The version of the OpenAPI document: 1.0 7 | Contact: kontakt@bund.dev 8 | Generated by: https://openapi-generator.tech 9 | """ 10 | 11 | 12 | import unittest 13 | 14 | from deutschland.destatis.api.default_api import DefaultApi # noqa: E501 15 | 16 | from deutschland import destatis 17 | 18 | 19 | class TestDefaultApi(unittest.TestCase): 20 | """DefaultApi unit test stubs""" 21 | 22 | def setUp(self): 23 | self.api = DefaultApi() # noqa: E501 24 | 25 | def tearDown(self): 26 | pass 27 | 28 | def test_chart2result(self): 29 | """Test case for chart2result""" 30 | pass 31 | 32 | def test_chart2table(self): 33 | """Test case for chart2table""" 34 | pass 35 | 36 | def test_chart2timeseries(self): 37 | """Test case for chart2timeseries""" 38 | pass 39 | 40 | def test_cube(self): 41 | """Test case for cube""" 42 | pass 43 | 44 | def test_cube_meta(self): 45 | """Test case for cube_meta""" 46 | pass 47 | 48 | def test_cubefile(self): 49 | """Test case for cubefile""" 50 | pass 51 | 52 | def test_cubes(self): 53 | """Test case for cubes""" 54 | pass 55 | 56 | def test_cubes2statistic(self): 57 | """Test case for cubes2statistic""" 58 | pass 59 | 60 | def test_cubes2variable(self): 61 | """Test case for cubes2variable""" 62 | pass 63 | 64 | def test_find(self): 65 | """Test case for find""" 66 | pass 67 | 68 | def test_jobs(self): 69 | """Test case for jobs""" 70 | pass 71 | 72 | def test_logincheck(self): 73 | """Test case for logincheck""" 74 | pass 75 | 76 | def test_map2result(self): 77 | """Test case for map2result""" 78 | pass 79 | 80 | def test_map2table(self): 81 | """Test case for map2table""" 82 | pass 83 | 84 | def test_map2timeseries(self): 85 | """Test case for map2timeseries""" 86 | pass 87 | 88 | def test_modifieddata(self): 89 | """Test case for modifieddata""" 90 | pass 91 | 92 | def test_password(self): 93 | """Test case for password""" 94 | pass 95 | 96 | def test_qualitysigns(self): 97 | """Test case for qualitysigns""" 98 | pass 99 | 100 | def test_remove_result(self): 101 | """Test case for remove_result""" 102 | pass 103 | 104 | def test_result(self): 105 | """Test case for result""" 106 | pass 107 | 108 | def test_resultfile(self): 109 | """Test case for resultfile""" 110 | pass 111 | 112 | def test_results(self): 113 | """Test case for results""" 114 | pass 115 | 116 | def test_statistic(self): 117 | """Test case for statistic""" 118 | pass 119 | 120 | def test_statistics(self): 121 | """Test case for statistics""" 122 | pass 123 | 124 | def test_statistics2variable(self): 125 | """Test case for statistics2variable""" 126 | pass 127 | 128 | def test_table(self): 129 | """Test case for table""" 130 | pass 131 | 132 | def test_table_meta(self): 133 | """Test case for table_meta""" 134 | pass 135 | 136 | def test_tablefile(self): 137 | """Test case for tablefile""" 138 | pass 139 | 140 | def test_tables(self): 141 | """Test case for tables""" 142 | pass 143 | 144 | def test_tables2statistic(self): 145 | """Test case for tables2statistic""" 146 | pass 147 | 148 | def test_tables2variable(self): 149 | """Test case for tables2variable""" 150 | pass 151 | 152 | def test_terms(self): 153 | """Test case for terms""" 154 | pass 155 | 156 | def test_timeseries(self): 157 | """Test case for timeseries""" 158 | pass 159 | 160 | def test_timeseries2statistic(self): 161 | """Test case for timeseries2statistic""" 162 | pass 163 | 164 | def test_timeseries2variable(self): 165 | """Test case for timeseries2variable""" 166 | pass 167 | 168 | def test_timeseries_data(self): 169 | """Test case for timeseries_data""" 170 | pass 171 | 172 | def test_timeseries_meta(self): 173 | """Test case for timeseries_meta""" 174 | pass 175 | 176 | def test_timeseriesfile(self): 177 | """Test case for timeseriesfile""" 178 | pass 179 | 180 | def test_value(self): 181 | """Test case for value""" 182 | pass 183 | 184 | def test_values(self): 185 | """Test case for values""" 186 | pass 187 | 188 | def test_values2variable(self): 189 | """Test case for values2variable""" 190 | pass 191 | 192 | def test_variable(self): 193 | """Test case for variable""" 194 | pass 195 | 196 | def test_variables(self): 197 | """Test case for variables""" 198 | pass 199 | 200 | def test_variables2statistic(self): 201 | """Test case for variables2statistic""" 202 | pass 203 | 204 | def test_whoami(self): 205 | """Test case for whoami""" 206 | pass 207 | 208 | 209 | if __name__ == "__main__": 210 | unittest.main() 211 | -------------------------------------------------------------------------------- /python-client/tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py3 3 | 4 | [testenv] 5 | deps=-r{toxinidir}/requirements.txt 6 | -r{toxinidir}/test-requirements.txt 7 | 8 | commands= 9 | pytest --cov=destatis 10 | --------------------------------------------------------------------------------