kpubdata 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kpubdata-0.3.0 → kpubdata-0.4.0}/ARCHITECTURE.md +3 -3
- {kpubdata-0.3.0 → kpubdata-0.4.0}/CHANGELOG.md +30 -3
- {kpubdata-0.3.0 → kpubdata-0.4.0}/PKG-INFO +24 -4
- {kpubdata-0.3.0 → kpubdata-0.4.0}/README.md +23 -3
- kpubdata-0.4.0/ROADMAP.md +101 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/SUPPORTED_DATA.md +18 -1
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/product-family-architecture.md +10 -9
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/providers/datago.md +15 -9
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/quickstart.md +8 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/pyproject.toml +1 -1
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/__init__.py +3 -1
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/client.py +1 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/config.py +3 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/datago/adapter.py +31 -7
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/localdata/adapter.py +1 -1
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/lofin/adapter.py +1 -1
- kpubdata-0.4.0/src/kpubdata/providers/semas/__init__.py +3 -0
- kpubdata-0.4.0/src/kpubdata/providers/semas/adapter.py +333 -0
- kpubdata-0.4.0/src/kpubdata/providers/semas/catalogue.json +665 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_localdata.py +1 -1
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_lofin.py +4 -4
- kpubdata-0.4.0/tests/contract/test_semas.py +90 -0
- kpubdata-0.4.0/tests/fixtures/semas/empty_response.json +14 -0
- kpubdata-0.4.0/tests/fixtures/semas/error_auth.json +14 -0
- kpubdata-0.4.0/tests/fixtures/semas/error_invalid_request.json +14 -0
- kpubdata-0.4.0/tests/fixtures/semas/store_one_success.json +138 -0
- kpubdata-0.4.0/tests/fixtures/semas/upjong_large_success.json +27 -0
- kpubdata-0.4.0/tests/fixtures/semas/zone_one_success.json +39 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_datago_live.py +14 -3
- kpubdata-0.4.0/tests/unit/core/test_version.py +10 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/test_adapter.py +32 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/localdata/test_adapter.py +3 -3
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/lofin/test_lofin_adapter.py +1 -1
- kpubdata-0.4.0/tests/unit/providers/semas/test_adapter.py +204 -0
- kpubdata-0.4.0/tests/unit/transport/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/uv.lock +1 -1
- kpubdata-0.3.0/ROADMAP.md +0 -55
- {kpubdata-0.3.0 → kpubdata-0.4.0}/.github/ISSUE_TEMPLATE/new-provider-adapter.yml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/.github/workflows/ci.yml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/.github/workflows/integration.yml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/.github/workflows/publish-pypi.yml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/.gitignore +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/AGENTS.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/API_SPEC.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/CANONICAL_MODEL.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/CONTRIBUTING.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/LICENSE +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/PACKAGING.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/PRD.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/PROVIDER_ADAPTER_CONTRACT.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/VALIDATION.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/adrs/0001-dialect-inspired-architecture.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/adrs/0002-standardize-ux-not-native-shape.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/architecture-diagrams.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/caching.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/cli.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/datago-api-reference.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/logging.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/providers/bok.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/providers/kosis.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/providers/seoul.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/docs/tutorial-ai-agent-workflow.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/plans/sgis-provider-issue-150.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/catalog.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/cli.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/capability.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/dataset.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/models.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/protocol.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/core/representation.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/exceptions.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/_common.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/bok/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/bok/adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/bok/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/datago/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/datago/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/kosis/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/kosis/adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/kosis/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/localdata/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/localdata/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/lofin/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/lofin/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/seoul/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/seoul/adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/seoul/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/sgis/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/sgis/adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/sgis/auth.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/providers/sgis/catalogue.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/py.typed +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/registry.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/transport/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/transport/cache.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/transport/decode.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/transport/http.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/src/kpubdata/transport/retry.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/provider_adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_bok.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_datago.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_kosis.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_seoul.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/contract/test_sgis_contract.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/bok/error_auth.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/bok/success_empty.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/bok/success_single_page.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/bus_arrival_v2.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/error_auth_30.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/error_invalid_request_10.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/error_rate_limit_22.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/error_service_unavailable_01.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/error_xml_auth_30.xml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_apt_rent.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_apt_trade.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_empty.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_metro_fare.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_metro_path.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_multi_page_1.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_multi_page_2.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_offi_rent.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_offi_trade.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_rh_rent.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_rh_trade.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_sh_rent.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_sh_trade.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_single_item.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_single_page.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_string_numerics.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_tour_kor_area.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_tour_kor_festival.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_tour_kor_keyword.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_tour_kor_location.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_xml.xml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/datago/success_xml_single_item.xml +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/kosis/error_auth.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/kosis/success_empty.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/kosis/success_single_page.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/affiliated_medical_institution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/air_pollution_prevention_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/amusement_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_breeding_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_care_service_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_crematorium_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_exhibition_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_funeral_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_hospital_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_import_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_training_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/animal_transport_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/bakery_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/barber_shop_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/beauty_salon_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/billiard_hall_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/boxing_gym_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/breeding_stock_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/building_sanitation_management_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/caregiver_training_institution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/city_gas_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/civil_defense_water_supply_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/clinic_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/companion_animal_related_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/composite_game_provider_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/comprehensive_amusement_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/comprehensive_resort_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/comprehensive_sports_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/comprehensive_travel_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/container_packaging_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/contract_foodservice_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/culture_industry_company_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/dance_academy_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/dance_hall_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/dental_lab_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/disinfection_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/distribution_specialized_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/domestic_international_travel_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/domestic_travel_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/door_to_door_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/ecommerce_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/edible_ice_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/electrical_construction_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/electrical_safety_management_agency_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/electricity_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/electronic_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/elevator_maintenance_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/elevator_manufacturing_import_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/emergency_patient_transport_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/empty_response.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/energy_saving_company_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/entertainment_bar_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/environmental_consulting_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/environmental_impact_assessment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/environmental_measurement_agency_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/error_auth.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/feed_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/fitness_center_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_additive_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_cold_storage_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_repackaging_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_transportation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/food_vending_machine_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/foreign_tourist_city_homestay_lodging_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/foreign_tourist_city_homestay_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/foreigner_exclusive_entertainment_restaurant_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/free_job_placement_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/funeral_director_training_institution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/funeral_service_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/game_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/game_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/game_provider_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/gas_appliance_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/general_amusement_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/general_lodging_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/general_restaurant_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/golf_course_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/golf_practice_range_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/groundwater_construction_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/groundwater_impact_assessment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/groundwater_purification_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/group_cafeteria_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/hanok_experience_lodging_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/hanok_experience_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/hatchery_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/health_functional_food_distributor_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/health_functional_food_retail_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/health_functional_food_specialty_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/high_pressure_gas_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/horse_riding_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/hospital_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/ice_rink_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/imported_food_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/imported_livestock_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/instant_food_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/international_conference_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/international_conference_planning_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/international_freight_forwarding_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/internet_computer_game_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/karaoke_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/large_store_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/laundry_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_artificial_insemination_center_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_farming_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_processing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_storage_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/livestock_transportation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/log_production_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/logistics_warehouse_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/lpg_charging_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/lpg_collective_supply_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/lpg_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/mail_order_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/marine_environment_management_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/martial_arts_gym_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/medical_device_repair_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/medical_device_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/medical_foundation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/medical_linen_processing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/medical_waste_treatment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/meter_repair_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/milk_collection_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/motor_racing_course_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/movie_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/movie_import_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/movie_production_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/movie_screening_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/movie_theater_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/multilevel_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/music_video_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/music_video_production_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/night_soil_collection_transportation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/noise_vibration_prevention_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/onggi_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/online_music_service_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/optical_shop_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/other_food_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/outdoor_advertising_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/paid_job_placement_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/performance_hall_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/pet_grooming_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/petroleum_import_export_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/petroleum_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/pharmacy_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/popular_culture_arts_planning_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/postpartum_care_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/prepaid_installment_trade_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/printing_house_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/public_bath_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/publisher_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/quasi_medical_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/record_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/record_production_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/residential_accommodation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/rest_cafe_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/rural_guesthouse_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/safe_over_the_counter_drug_store_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/sanitary_product_manufacturing_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/sanitation_treatment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/sawmill_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/singing_bar_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/ski_resort_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/slaughterhouse_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/small_hotel_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/soil_remediation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/specialized_resort_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/swimming_pool_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/timber_import_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tobacco_import_sales_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tobacco_retail_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tobacco_wholesale_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourism_business_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourism_convenience_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourism_duty_free_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_accommodation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_entertainment_restaurant_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_excursion_boat_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_pension_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_performance_hall_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_restaurant_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_theater_entertainment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/tourist_track_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/video_distribution_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/video_production_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/video_small_theater_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/video_viewing_room_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/video_viewing_service_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/waste_collection_transportation_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/waste_recycling_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/waste_treatment_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/water_pollution_prevention_facility_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/water_tank_cleaning_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/yacht_marina_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/localdata/youth_game_provider_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/lofin/error_auth.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/lofin/success_fiacrv.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/lofin/success_single_page.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/seoul/bike_rent_month_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/seoul/empty_response.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/seoul/error_auth.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/seoul/subway_realtime_arrival_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/sgis/auth_success.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/sgis/error_invalid_token.json +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/sgis/sido_boundary.geojson +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/fixtures/sgis/sigungu_boundary.geojson +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/README.md +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/conftest.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_bok_live.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_client_flow.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_exception_propagation.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_kosis_live.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_localdata_live.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_lofin_live.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_seoul_live.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/integration/test_transport_http.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_dataset.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_dataset_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_exceptions.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_exceptions_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_models.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_models_fixtures.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/core/test_to_pandas.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/bok/test_bok_adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/conftest.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/test_adapter_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/test_fixtures.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/datago/test_generic.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/kosis/test_adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/localdata/__init__.py +0 -0
- {kpubdata-0.3.0/tests/unit/providers/seoul → kpubdata-0.4.0/tests/unit/providers/semas}/__init__.py +0 -0
- {kpubdata-0.3.0/tests/unit/transport → kpubdata-0.4.0/tests/unit/providers/seoul}/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/seoul/test_adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/sgis/__init__.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/sgis/test_adapter.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/providers/sgis/test_auth.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_catalog.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_catalog_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_catalogue_validation.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_cli.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_client_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_client_transport_requirements.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_config.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_config_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_failure_path_logging.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_logging.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_registry.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/test_registry_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_cache.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_decode.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_decode_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_http_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_http_coverage_extra.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_logging.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_retry.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_retry_after.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_retry_coverage.py +0 -0
- {kpubdata-0.3.0 → kpubdata-0.4.0}/tests/unit/transport/test_transport_requirements.py +0 -0
|
@@ -349,9 +349,10 @@ Not part of the core runtime contract.
|
|
|
349
349
|
Examples:
|
|
350
350
|
|
|
351
351
|
- pandas export
|
|
352
|
-
- MCP adapter
|
|
353
352
|
- plugin loaders
|
|
354
353
|
|
|
354
|
+
MCP adapter는 별도 레포(kpubdata-mcp 등)로 분리합니다. 코어 런타임에 포함하지 않습니다.
|
|
355
|
+
|
|
355
356
|
## 4. Main abstractions
|
|
356
357
|
|
|
357
358
|
### 4.1 Client
|
|
@@ -475,7 +476,7 @@ src/kpubdata/
|
|
|
475
476
|
mappings.py
|
|
476
477
|
adapters/
|
|
477
478
|
pandas.py
|
|
478
|
-
mcp
|
|
479
|
+
# MCP adapter는 별도 레포(kpubdata-mcp 등)로 분리
|
|
479
480
|
```
|
|
480
481
|
|
|
481
482
|
## 9. Execution flow
|
|
@@ -546,4 +547,3 @@ Do **not** change the core just because one adapter is weird.
|
|
|
546
547
|
| :--- | :--- | :--- |
|
|
547
548
|
| [kpubdata-builder](https://github.com/yeongseon/kpubdata-builder) | [ARCHITECTURE.md](https://github.com/yeongseon/kpubdata-builder/blob/main/ARCHITECTURE.md) | Builder 아키텍처 |
|
|
548
549
|
| [kpubdata-studio](https://github.com/yeongseon/kpubdata-studio) | [ARCHITECTURE.md](https://github.com/yeongseon/kpubdata-studio/blob/main/ARCHITECTURE.md) | Studio 아키텍처 |
|
|
549
|
-
|
|
@@ -7,7 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [0.3.
|
|
10
|
+
## [0.3.1] - 2026-04-23
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Source `__version__` from `importlib.metadata` instead of hardcoded string (#127)
|
|
14
|
+
- Add 활용신청 (activation request) hint to datago 403 `AuthError` and document API key activation requirement (#128)
|
|
15
|
+
- Add required parameters to metro integration tests (#140)
|
|
16
|
+
|
|
17
|
+
## [0.3.0] - 2026-04-22
|
|
11
18
|
|
|
12
19
|
### Added
|
|
13
20
|
- `localdata` provider: expand permit datasets from 26 to **195**, covering all official KSIC categories — health (13), animal (18), culture (53), living (26), food (32), resources & environment (37), other (16)
|
|
@@ -19,7 +26,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
19
26
|
- Unit and contract tests plus SGIS fixture responses for boundary and auth/error scenarios
|
|
20
27
|
- Full fixture, unit test, and contract test coverage for all 195 localdata datasets
|
|
21
28
|
|
|
22
|
-
## [0.2.
|
|
29
|
+
## [0.2.3] - 2026-04-19
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- `LofinAdapter` SSL context ignored when `Client` passes shared transport
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
- 7 real estate transaction datasets to datago provider (`apt_rent`, `offi_trade`, `offi_rent`, `rh_trade`, `rh_rent`, `sh_trade`, `sh_rent`)
|
|
36
|
+
- Treat `resultCode` `'000'` as success for RTMS endpoints
|
|
37
|
+
|
|
38
|
+
## [0.2.2] - 2026-04-17
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
- Cursor pagination support and pagination documentation
|
|
42
|
+
|
|
43
|
+
## [0.2.1] - 2026-04-17
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
- `SUPPORTED_DATA.md` 실API 최종 검증일 컬럼 추가
|
|
47
|
+
- Single-page pagination contract and `list_all()` implementation
|
|
48
|
+
|
|
49
|
+
## [0.2.0] - 2026-04-17
|
|
23
50
|
|
|
24
51
|
### Added
|
|
25
52
|
- Single-page pagination contract for all adapters (datago, bok, lofin, kosis)
|
|
@@ -35,7 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
35
62
|
- Unreachable single-record adapter stubs
|
|
36
63
|
- Single-record access from the provider and dataset public APIs
|
|
37
64
|
|
|
38
|
-
## [0.1.0] -
|
|
65
|
+
## [0.1.0] - 2026-04-10
|
|
39
66
|
|
|
40
67
|
### Added
|
|
41
68
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kpubdata
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Dialect-inspired Python access framework for Korean public data
|
|
5
5
|
Author: Yeongseon Choe
|
|
6
6
|
License: MIT
|
|
@@ -166,6 +166,11 @@ KPubData가 지원하는 각 기관의 API 키를 발급받아 [환경 변수](h
|
|
|
166
166
|
- **절차**: 회원가입 → 지방행정인허가 Open API(일반음식점/휴게음식점) 활용신청 → 승인 후 인증키 확인
|
|
167
167
|
- **환경 변수**: `KPUBDATA_LOCALDATA_API_KEY`
|
|
168
168
|
|
|
169
|
+
#### 소상공인시장진흥공단 상가(상권)정보 (data.go.kr) — `semas`
|
|
170
|
+
- **가입 URL**: [https://www.data.go.kr](https://www.data.go.kr)
|
|
171
|
+
- **절차**: 회원가입 → 소상공인시장진흥공단 상가(상권)정보 Open API 활용신청 → 승인 후 인증키 확인
|
|
172
|
+
- **환경 변수**: `KPUBDATA_SEMAS_API_KEY`
|
|
173
|
+
|
|
169
174
|
#### 서울 열린데이터광장 (data.seoul.go.kr) — `seoul`
|
|
170
175
|
- **가입 URL**: [https://data.seoul.go.kr/](https://data.seoul.go.kr/)
|
|
171
176
|
- **절차**: 회원가입 → 원하는 Open API 페이지에서 인증키 신청/확인 → 마이페이지에서 발급 키 확인
|
|
@@ -198,6 +203,9 @@ export KPUBDATA_LOFIN_API_KEY="your-lofin-api-key"
|
|
|
198
203
|
# 지방행정인허가
|
|
199
204
|
export KPUBDATA_LOCALDATA_API_KEY="your-localdata-service-key"
|
|
200
205
|
|
|
206
|
+
# 소상공인시장진흥공단 상가(상권)정보
|
|
207
|
+
export KPUBDATA_SEMAS_API_KEY="your-semas-service-key"
|
|
208
|
+
|
|
201
209
|
# 서울 열린데이터광장
|
|
202
210
|
export KPUBDATA_SEOUL_API_KEY="your-seoul-api-key"
|
|
203
211
|
|
|
@@ -221,6 +229,7 @@ client = Client(provider_keys={
|
|
|
221
229
|
"kosis": "YOUR_KOSIS_API_KEY",
|
|
222
230
|
"lofin": "YOUR_LOFIN_API_KEY",
|
|
223
231
|
"localdata": "YOUR_DATA_GO_KR_API_KEY",
|
|
232
|
+
"semas": "YOUR_SEMAS_API_KEY",
|
|
224
233
|
"seoul": "YOUR_SEOUL_API_KEY",
|
|
225
234
|
"sgis": "YOUR_SGIS_CONSUMER_KEY:YOUR_SGIS_CONSUMER_SECRET",
|
|
226
235
|
})
|
|
@@ -349,7 +358,18 @@ for item in result.items:
|
|
|
349
358
|
print(item["BPLC_NM"], item["ROAD_NM_ADDR"])
|
|
350
359
|
```
|
|
351
360
|
|
|
352
|
-
### 10.
|
|
361
|
+
### 10. 소상공인 상가정보 조회 (Semas)
|
|
362
|
+
|
|
363
|
+
```python
|
|
364
|
+
client = Client(provider_keys={"semas": "YOUR_SEMAS_API_KEY"})
|
|
365
|
+
ds = client.dataset("semas.store_radius")
|
|
366
|
+
result = ds.list(cx="127.02758", cy="37.49794", radius="250", page_size=10)
|
|
367
|
+
|
|
368
|
+
for item in result.items:
|
|
369
|
+
print(item["bizesNm"], item["rdnmAdr"])
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 11. 전체 페이지 자동 조회 (list_all)
|
|
353
373
|
|
|
354
374
|
대량의 데이터를 페이지 단위로 자동 순회하려면 `list_all()`을 사용합니다.
|
|
355
375
|
|
|
@@ -363,7 +383,7 @@ for batch in ds.list_all(fyr="2024"):
|
|
|
363
383
|
print(item)
|
|
364
384
|
```
|
|
365
385
|
|
|
366
|
-
###
|
|
386
|
+
### 12. pandas DataFrame 변환
|
|
367
387
|
|
|
368
388
|
조회 결과를 pandas DataFrame으로 변환하여 분석할 수 있습니다.
|
|
369
389
|
|
|
@@ -494,4 +514,4 @@ KPubData의 설계 철학과 사용 방법을 안내하는 문서 목록입니
|
|
|
494
514
|
- [Pandas](https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html)(데이터 분석용 파이썬 라이브러리) 데이터프레임 변환 어댑터 추가
|
|
495
515
|
|
|
496
516
|
### v0.3
|
|
497
|
-
-
|
|
517
|
+
- Provider 확장 (지역 기반 추가 데이터셋)
|
|
@@ -129,6 +129,11 @@ KPubData가 지원하는 각 기관의 API 키를 발급받아 [환경 변수](h
|
|
|
129
129
|
- **절차**: 회원가입 → 지방행정인허가 Open API(일반음식점/휴게음식점) 활용신청 → 승인 후 인증키 확인
|
|
130
130
|
- **환경 변수**: `KPUBDATA_LOCALDATA_API_KEY`
|
|
131
131
|
|
|
132
|
+
#### 소상공인시장진흥공단 상가(상권)정보 (data.go.kr) — `semas`
|
|
133
|
+
- **가입 URL**: [https://www.data.go.kr](https://www.data.go.kr)
|
|
134
|
+
- **절차**: 회원가입 → 소상공인시장진흥공단 상가(상권)정보 Open API 활용신청 → 승인 후 인증키 확인
|
|
135
|
+
- **환경 변수**: `KPUBDATA_SEMAS_API_KEY`
|
|
136
|
+
|
|
132
137
|
#### 서울 열린데이터광장 (data.seoul.go.kr) — `seoul`
|
|
133
138
|
- **가입 URL**: [https://data.seoul.go.kr/](https://data.seoul.go.kr/)
|
|
134
139
|
- **절차**: 회원가입 → 원하는 Open API 페이지에서 인증키 신청/확인 → 마이페이지에서 발급 키 확인
|
|
@@ -161,6 +166,9 @@ export KPUBDATA_LOFIN_API_KEY="your-lofin-api-key"
|
|
|
161
166
|
# 지방행정인허가
|
|
162
167
|
export KPUBDATA_LOCALDATA_API_KEY="your-localdata-service-key"
|
|
163
168
|
|
|
169
|
+
# 소상공인시장진흥공단 상가(상권)정보
|
|
170
|
+
export KPUBDATA_SEMAS_API_KEY="your-semas-service-key"
|
|
171
|
+
|
|
164
172
|
# 서울 열린데이터광장
|
|
165
173
|
export KPUBDATA_SEOUL_API_KEY="your-seoul-api-key"
|
|
166
174
|
|
|
@@ -184,6 +192,7 @@ client = Client(provider_keys={
|
|
|
184
192
|
"kosis": "YOUR_KOSIS_API_KEY",
|
|
185
193
|
"lofin": "YOUR_LOFIN_API_KEY",
|
|
186
194
|
"localdata": "YOUR_DATA_GO_KR_API_KEY",
|
|
195
|
+
"semas": "YOUR_SEMAS_API_KEY",
|
|
187
196
|
"seoul": "YOUR_SEOUL_API_KEY",
|
|
188
197
|
"sgis": "YOUR_SGIS_CONSUMER_KEY:YOUR_SGIS_CONSUMER_SECRET",
|
|
189
198
|
})
|
|
@@ -312,7 +321,18 @@ for item in result.items:
|
|
|
312
321
|
print(item["BPLC_NM"], item["ROAD_NM_ADDR"])
|
|
313
322
|
```
|
|
314
323
|
|
|
315
|
-
### 10.
|
|
324
|
+
### 10. 소상공인 상가정보 조회 (Semas)
|
|
325
|
+
|
|
326
|
+
```python
|
|
327
|
+
client = Client(provider_keys={"semas": "YOUR_SEMAS_API_KEY"})
|
|
328
|
+
ds = client.dataset("semas.store_radius")
|
|
329
|
+
result = ds.list(cx="127.02758", cy="37.49794", radius="250", page_size=10)
|
|
330
|
+
|
|
331
|
+
for item in result.items:
|
|
332
|
+
print(item["bizesNm"], item["rdnmAdr"])
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 11. 전체 페이지 자동 조회 (list_all)
|
|
316
336
|
|
|
317
337
|
대량의 데이터를 페이지 단위로 자동 순회하려면 `list_all()`을 사용합니다.
|
|
318
338
|
|
|
@@ -326,7 +346,7 @@ for batch in ds.list_all(fyr="2024"):
|
|
|
326
346
|
print(item)
|
|
327
347
|
```
|
|
328
348
|
|
|
329
|
-
###
|
|
349
|
+
### 12. pandas DataFrame 변환
|
|
330
350
|
|
|
331
351
|
조회 결과를 pandas DataFrame으로 변환하여 분석할 수 있습니다.
|
|
332
352
|
|
|
@@ -457,4 +477,4 @@ KPubData의 설계 철학과 사용 방법을 안내하는 문서 목록입니
|
|
|
457
477
|
- [Pandas](https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html)(데이터 분석용 파이썬 라이브러리) 데이터프레임 변환 어댑터 추가
|
|
458
478
|
|
|
459
479
|
### v0.3
|
|
460
|
-
-
|
|
480
|
+
- Provider 확장 (지역 기반 추가 데이터셋)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Roadmap — KPubData
|
|
2
|
+
|
|
3
|
+
> kpubdata는 **한국 공공데이터 접근 코어 프레임워크**에 집중합니다.
|
|
4
|
+
> MCP, HTTP API 등 서비스 레이어는 본체에 포함하지 않으며, 필요 시 별도 레포(`kpubdata-mcp` 등)로 분리합니다.
|
|
5
|
+
|
|
6
|
+
## 개발 3축
|
|
7
|
+
|
|
8
|
+
| 축 | 설명 | 대표 이슈 |
|
|
9
|
+
| :--- | :--- | :--- |
|
|
10
|
+
| **Core** | 핵심 계약(contract), 스키마, 메타데이터, discovery 안정화 | #55, #57, #63 |
|
|
11
|
+
| **Plugin Ecosystem** | entry-point plugin discovery, provider scaffolding 도구 | #112, #61 |
|
|
12
|
+
| **Provider Adapters** | 기관별 어댑터 확장 (datago, localdata, semas, bok, ...) | #87-#94, #161-#168 |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## v0.1 ✅
|
|
17
|
+
|
|
18
|
+
Foundation release.
|
|
19
|
+
|
|
20
|
+
- finalize core contracts
|
|
21
|
+
- implement transport skeleton
|
|
22
|
+
- implement 3 distinct adapters (datago, bok, kosis)
|
|
23
|
+
- support XML + JSON
|
|
24
|
+
- support discovery + list + raw
|
|
25
|
+
- ship docs and contract tests
|
|
26
|
+
|
|
27
|
+
## v0.2 ✅
|
|
28
|
+
|
|
29
|
+
Stabilization and ergonomics.
|
|
30
|
+
|
|
31
|
+
- dataset metadata enrichment
|
|
32
|
+
- schema improvements
|
|
33
|
+
- pandas adapter (`to_pandas()`)
|
|
34
|
+
- single-page pagination contract + `list_all()`
|
|
35
|
+
- more examples and documentation
|
|
36
|
+
|
|
37
|
+
## v0.3 ✅
|
|
38
|
+
|
|
39
|
+
Provider expansion.
|
|
40
|
+
|
|
41
|
+
- localdata provider: 195개 인허가 데이터셋
|
|
42
|
+
- sgis provider: 행정구역 경계 GeoJSON
|
|
43
|
+
- semas provider: 상가(상권)정보 17개 데이터셋
|
|
44
|
+
- seoul provider: 지하철 실시간, 따릉이
|
|
45
|
+
- lofin provider: 6개 재정 데이터셋
|
|
46
|
+
- datago provider: 부동산 실거래가, 관광, 지하철 어댑터 추가
|
|
47
|
+
|
|
48
|
+
## v0.4 — Core 안정화
|
|
49
|
+
|
|
50
|
+
- dataset metadata enrichment (#55)
|
|
51
|
+
- schema improvements (#57)
|
|
52
|
+
- more robust discovery (#63)
|
|
53
|
+
- documentation (#59, #172)
|
|
54
|
+
- integration tests (#80)
|
|
55
|
+
|
|
56
|
+
## v0.5 — Provider 확장
|
|
57
|
+
|
|
58
|
+
- datago: 실시간 도로교통정보 (#87), 농수축산물 가격정보 (#88)
|
|
59
|
+
- datago: 건축물대장 (#90), 사업자등록 상태조회 (#91)
|
|
60
|
+
- datago: 의약품 안전사용정보 (#92), 지하철역별 승하차 인원 (#93)
|
|
61
|
+
- datago: 기상청 중기예보 (#94)
|
|
62
|
+
- datago: 워크넷 채용정보 (#161), 긴급재난문자 (#162), 채권시세정보 (#163)
|
|
63
|
+
- datago: NEIS 급식식단정보 (#164), 식품이력추적 (#165), 전국체육시설 (#166)
|
|
64
|
+
- datago: 문화시설 (#167), 환경소음 측정망 (#168)
|
|
65
|
+
|
|
66
|
+
## v1.0 criteria
|
|
67
|
+
|
|
68
|
+
- public API feels stable
|
|
69
|
+
- adapter contract proven across multiple provider families (7+ providers)
|
|
70
|
+
- plugin discovery로 외부 provider 패키지 등록 가능
|
|
71
|
+
- docs/examples sufficient for external users
|
|
72
|
+
- breakage policy and versioning discipline established
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 본체에 포함하지 않는 것
|
|
77
|
+
|
|
78
|
+
아래 항목은 kpubdata 코어에 넣지 않습니다. 필요 시 product family 별도 레포로 분리합니다.
|
|
79
|
+
|
|
80
|
+
| 항목 | 분리 대상 레포 | 상태 |
|
|
81
|
+
| :--- | :--- | :--- |
|
|
82
|
+
| MCP adapter | `kpubdata-mcp` | 미생성 (필요 시 분리) |
|
|
83
|
+
| HTTP/REST API 서비스 | `kpubdata-api` | 미생성 (필요 시 분리) |
|
|
84
|
+
| LLM tool schema / agent helper | `kpubdata-mcp` | 미생성 (필요 시 분리) |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 관련 문서
|
|
89
|
+
|
|
90
|
+
### 이 저장소 내 문서
|
|
91
|
+
| 문서 | 설명 |
|
|
92
|
+
| :--- | :--- |
|
|
93
|
+
| [PRD.md](./PRD.md) | 제품 요구사항 정의 |
|
|
94
|
+
| [ARCHITECTURE.md](./ARCHITECTURE.md) | 시스템 아키텍처 설계 |
|
|
95
|
+
| [API_SPEC.md](./API_SPEC.md) | 파이썬 API 명세 |
|
|
96
|
+
|
|
97
|
+
### KPubData Product Family
|
|
98
|
+
| 저장소 | 문서 | 설명 |
|
|
99
|
+
| :--- | :--- | :--- |
|
|
100
|
+
| [kpubdata-builder](https://github.com/yeongseon/kpubdata-builder) | [ROADMAP.md](https://github.com/yeongseon/kpubdata-builder/blob/main/ROADMAP.md) | Builder 로드맵 |
|
|
101
|
+
| [kpubdata-studio](https://github.com/yeongseon/kpubdata-studio) | [ROADMAP.md](https://github.com/yeongseon/kpubdata-studio/blob/main/ROADMAP.md) | Studio 로드맵 |
|
|
@@ -235,10 +235,27 @@
|
|
|
235
235
|
| 지원 | 테스트 검증 | - | 지방행정인허가 (`localdata`) | `caregiver_training_institution` | 요양보호사교육기관 인허가 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 행정안전부 제공, 기타/전문교육기관 |
|
|
236
236
|
| 지원 | 테스트 검증 | - | 지방행정인허가 (`localdata`) | `funeral_director_training_institution` | 장례지도사교육기관 인허가 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 행정안전부 제공, 기타/전문교육기관 |
|
|
237
237
|
| 지원 | 테스트 검증 | - | 지방행정인허가 (`localdata`) | `free_job_placement` | 무료직업소개소 인허가 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 행정안전부 제공, 기타/사무지원 |
|
|
238
|
-
| 지원 | 테스트 검증 | - | 지방행정인허가 (`localdata`) | `paid_job_placement` | 유료직업소개소 인허가 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 행정안전부 제공, 기타/사무지원 |
|
|
238
|
+
| 지원 | 테스트 검증 | - | 지방행정인허가 (`localdata`) | `paid_job_placement` | 유료직업소개소 인허가 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 행정안전부 제공, 기타/사무지원 |
|
|
239
239
|
| 지원 | 테스트 검증 | - | 통계청 통계지리정보서비스 (`sgis`) | `boundary.sido` | 시도 행정구역 경계 | SGIS `consumer_key` + `consumer_secret` | [sgis.kostat.go.kr](https://sgis.kostat.go.kr/developer/html/main.html) | GeoJSON FeatureCollection 응답을 레코드 단위(`items`)로 정규화 |
|
|
240
240
|
| 지원 | 테스트 검증 | - | 통계청 통계지리정보서비스 (`sgis`) | `boundary.sigungu` | 시군구 행정구역 경계 | SGIS `consumer_key` + `consumer_secret` | [sgis.kostat.go.kr](https://sgis.kostat.go.kr/developer/html/main.html) | `boundary/hadmarea.geojson` + `low_search` 기반 조회 |
|
|
241
241
|
| 지원 | 테스트 검증 | - | 통계청 통계지리정보서비스 (`sgis`) | `boundary.emd` | 읍면동 행정구역 경계 | SGIS `consumer_key` + `consumer_secret` | [sgis.kostat.go.kr](https://sgis.kostat.go.kr/developer/html/main.html) | fixture/contract 검증 완료, 실API 검증은 후속 |
|
|
242
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `zone_one` | 지정상권 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeZoneOne` |
|
|
243
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `zone_radius` | 반경상권 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeZoneInRadius` |
|
|
244
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `zone_rect` | 사각형상권 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeZoneInRectangle` |
|
|
245
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `zone_admi` | 행정구역상권 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeZoneInAdmi` |
|
|
246
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_one` | 단일상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeOne` |
|
|
247
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_building` | 건물상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInBuilding` |
|
|
248
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_pnu` | 지번상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInPnu` |
|
|
249
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_dong` | 행정동상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInDong` |
|
|
250
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_area` | 상권상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInArea` |
|
|
251
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_radius` | 반경상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInRadius` |
|
|
252
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_rect` | 사각형상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInRectangle` |
|
|
253
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_polygon` | 다각형상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInPolygon` |
|
|
254
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_upjong` | 업종별상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListInUpjong` |
|
|
255
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `store_date` | 수정일자상가 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `storeListByDate` |
|
|
256
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `upjong_large` | 업종대분류 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `largeUpjongList` |
|
|
257
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `upjong_middle` | 업종중분류 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `middleUpjongList` |
|
|
258
|
+
| 지원 | 테스트 검증 | - | 소상공인시장진흥공단 (`semas`) | `upjong_small` | 업종소분류 조회 | [공공데이터포털](https://www.data.go.kr) 서비스키 | [data.go.kr](https://www.data.go.kr) | 상가(상권)정보 API / `smallUpjongList` |
|
|
242
259
|
| 지원 | 테스트 검증 | - | 서울 열린데이터광장 (`seoul`) | `subway_realtime_arrival` | 서울시 지하철 실시간 도착정보 | [서울 열린데이터광장](https://data.seoul.go.kr/) 인증키 | [data.seoul.go.kr](https://data.seoul.go.kr/) | 경로 기반 인증키 + 서비스별 top-level envelope |
|
|
243
260
|
| 지원 | 테스트 검증 | - | 서울 열린데이터광장 (`seoul`) | `bike_rent_month` | 서울시 공공자전거 이용정보(월별) | [서울 열린데이터광장](https://data.seoul.go.kr/) 인증키 | [data.seoul.go.kr](https://data.seoul.go.kr/) | 경로 기반 인증키 + 인덱스 페이지네이션 |
|
|
244
261
|
| 지원 | 실API 검증 | 2025-04-15 | 한국은행 ECOS (`bok`) | `base_rate` | 한국은행 기준금리 | [ECOS](https://ecos.bok.or.kr/api/) 인증키 | [ecos.bok.or.kr](https://ecos.bok.or.kr/api/) | |
|
|
@@ -8,7 +8,7 @@ KPubData Product Family(Korea Public Data Product Family)는 한국 공공데이
|
|
|
8
8
|
| :--- | :--- | :--- |
|
|
9
9
|
| [kpubdata](https://github.com/yeongseon/kpubdata) | 공공데이터를 가져오고 표준화하는 코어 라이브러리 | Python 3.10+ |
|
|
10
10
|
| [kpubdata-builder](https://github.com/yeongseon/kpubdata-builder) | 수집된 데이터를 다양한 형식으로 가공하는 빌드 파이프라인 | Python 3.10+ |
|
|
11
|
-
| [kpubdata-studio](https://github.com/yeongseon/kpubdata-studio) | 빌드 과정을 시각적으로 관리하는 웹 대시보드 |
|
|
11
|
+
| [kpubdata-studio](https://github.com/yeongseon/kpubdata-studio) | 빌드 과정을 시각적으로 관리하는 웹 대시보드 | Vite + React Router + TypeScript (SPA) |
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -52,7 +52,7 @@ graph TD
|
|
|
52
52
|
U3([파이썬 개발자]) -->|Python SDK| Core
|
|
53
53
|
|
|
54
54
|
subgraph "KPubData Product Family"
|
|
55
|
-
Studio["kpubdata-studio<br/>웹 대시보드<br/>(
|
|
55
|
+
Studio["kpubdata-studio<br/>웹 대시보드<br/>(Vite + React Router + TypeScript (SPA))"]
|
|
56
56
|
Builder["kpubdata-builder<br/>데이터 빌드 파이프라인<br/>(Python 3.10+)"]
|
|
57
57
|
Core["kpubdata<br/>데이터 접속 코어<br/>(Python 3.10+)"]
|
|
58
58
|
end
|
|
@@ -180,9 +180,9 @@ graph LR
|
|
|
180
180
|
| 항목 | kpubdata | kpubdata-builder | kpubdata-studio |
|
|
181
181
|
| :--- | :--- | :--- | :--- |
|
|
182
182
|
| **언어** | [Python](https://docs.python.org/ko/3/tutorial/) 3.10+ | [Python](https://docs.python.org/ko/3/tutorial/) 3.10+ | [TypeScript](https://www.typescriptlang.org/ko/docs/) 5 |
|
|
183
|
-
| **프레임워크** | — (순수 라이브러리) | — (CLI + 라이브러리) | [
|
|
183
|
+
| **프레임워크** | — (순수 라이브러리) | — (CLI + 라이브러리) | [Vite](https://vite.dev/) + [React Router](https://reactrouter.com/) |
|
|
184
184
|
| **UI** | 없음 (코드로만 사용) | CLI(명령줄 인터페이스) | 웹 브라우저 ([React](https://ko.react.dev/) + [Tailwind CSS](https://tailwindcss.com/docs)) |
|
|
185
|
-
| **빌드 도구** | [hatchling](https://hatch.pypa.io/) | [hatchling](https://hatch.pypa.io/) |
|
|
185
|
+
| **빌드 도구** | [hatchling](https://hatch.pypa.io/) | [hatchling](https://hatch.pypa.io/) | Vite 내장 빌드 |
|
|
186
186
|
| **패키지 관리** | [uv](https://github.com/astral-sh/uv) | [uv](https://github.com/astral-sh/uv) | [npm](https://docs.npmjs.com/about-npm) |
|
|
187
187
|
| **타입 검사** | [mypy](https://mypy.readthedocs.io/) | [mypy](https://mypy.readthedocs.io/) | TypeScript 내장 (`tsc`) |
|
|
188
188
|
| **린터** | [ruff](https://docs.astral.sh/ruff/) | [ruff](https://docs.astral.sh/ruff/) | [ESLint](https://eslint.org/) |
|
|
@@ -198,7 +198,7 @@ graph LR
|
|
|
198
198
|
graph TD
|
|
199
199
|
subgraph "사용자 환경 (브라우저)"
|
|
200
200
|
direction TB
|
|
201
|
-
StudioUI["kpubdata-studio<br/>
|
|
201
|
+
StudioUI["kpubdata-studio<br/>Vite SPA<br/>(사용자가 직접 보는 화면)"]
|
|
202
202
|
end
|
|
203
203
|
|
|
204
204
|
subgraph "서버 환경 (Python Runtime)"
|
|
@@ -223,7 +223,7 @@ graph TD
|
|
|
223
223
|
|
|
224
224
|
| 환경 | 프로젝트 | 실행 방식 |
|
|
225
225
|
| :--- | :--- | :--- |
|
|
226
|
-
| **사용자 브라우저** | kpubdata-studio | `npm run dev` → [http://localhost:
|
|
226
|
+
| **사용자 브라우저** | kpubdata-studio | `npm run dev` → [http://localhost:5173](http://localhost:5173) 접속 |
|
|
227
227
|
| **Python 서버/로컬** | kpubdata, kpubdata-builder | `pip install` 후 Python 코드에서 import 또는 CLI 실행 |
|
|
228
228
|
| **외부** | 공공 데이터 API | 정부/기관에서 운영하는 서버 (우리가 제어할 수 없음) |
|
|
229
229
|
|
|
@@ -318,7 +318,7 @@ Studio (브라우저) Builder (서버)
|
|
|
318
318
|
| :--- | :--- | :--- | :--- |
|
|
319
319
|
| **v0.1** | 동기 코어, 주요 5개 API 어댑터, XML/JSON 지원 | BuildSpec 모델, Markdown 내보내기, Manifest 생성 | 정보 구조 설계, Draft 상태 관리, Builder API 연동 |
|
|
320
320
|
| **v0.2** | 메타데이터 보강, Pandas 어댑터, 신규 기관 확대 | JSONL/Parquet 내보내기, HuggingFace 레이아웃 | 실시간 미리보기, 데이터 검증 뷰, 결과물 뷰어 |
|
|
321
|
-
| **v0.3** |
|
|
321
|
+
| **v0.3** | Provider 확장 (datago 부동산, 관광, 지하철) | Publish 훅, 빌드 이력 관리, CI/CD 연동 | Publish 워크플로우, 전체 대시보드 |
|
|
322
322
|
|
|
323
323
|
---
|
|
324
324
|
|
|
@@ -331,7 +331,7 @@ A: 네. kpubdata는 독립적인 파이썬 라이브러리입니다. `pip instal
|
|
|
331
331
|
A: 아니요. Studio는 Builder의 API를 호출하여 동작하므로, Builder가 반드시 실행되고 있어야 합니다. Studio는 "화면"이고, Builder가 실제 "엔진"입니다.
|
|
332
332
|
|
|
333
333
|
**Q: 세 프로젝트를 한 컴퓨터에서 동시에 실행해야 하나요?**
|
|
334
|
-
A: 개발 환경에서는 한 컴퓨터에서 모두 실행할 수 있습니다. 운영 환경에서는 Builder(Python 서버)와 Studio(
|
|
334
|
+
A: 개발 환경에서는 한 컴퓨터에서 모두 실행할 수 있습니다. 운영 환경에서는 Builder(Python 서버)와 Studio(Vite 웹 서버)를 별도 서버에 배포하는 것이 일반적입니다.
|
|
335
335
|
|
|
336
336
|
**Q: 새로운 공공 API를 추가하려면 어디를 수정하나요?**
|
|
337
337
|
A: kpubdata의 `providers/` 디렉토리에 새 어댑터를 추가합니다. Builder와 Studio는 수정할 필요 없이 자동으로 새 데이터셋을 사용할 수 있게 됩니다. 이것이 의존성이 한 방향인 것의 장점입니다.
|
|
@@ -366,4 +366,5 @@ A: kpubdata의 `providers/` 디렉토리에 새 어댑터를 추가합니다. Bu
|
|
|
366
366
|
| YAML | 들여쓰기로 구조를 표현하는 설정 파일 형식 | [위키백과](https://ko.wikipedia.org/wiki/YAML) |
|
|
367
367
|
| Python | 읽기 쉬운 범용 프로그래밍 언어 | [공식 튜토리얼 (한국어)](https://docs.python.org/ko/3/tutorial/) |
|
|
368
368
|
| TypeScript | 자바스크립트에 타입을 추가한 언어 | [공식 문서 (한국어)](https://www.typescriptlang.org/ko/docs/) |
|
|
369
|
-
|
|
|
369
|
+
| Vite | 빠른 프론트엔드 개발 서버 및 번들러 | [공식 문서](https://vite.dev/) |
|
|
370
|
+
| React Router | SPA 라우팅 라이브러리 | [공식 문서](https://reactrouter.com/) |
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
### 3단계: 승인 대기
|
|
37
37
|
|
|
38
|
-
- **자동 승인**:
|
|
38
|
+
- **자동 승인**: 대부분의 API는 활용신청 후 약 1~5분 안에 자동 승인됩니다.
|
|
39
39
|
- **심의 승인**: 국토교통부 아파트매매 실거래가 등 일부 API는 담당 기관의 심의 후 승인까지 1~2일이 소요될 수 있습니다.
|
|
40
40
|
|
|
41
41
|
### 4단계: 인증키 확인
|
|
@@ -52,16 +52,22 @@
|
|
|
52
52
|
export KPUBDATA_DATAGO_API_KEY="발급받은-일반-인증키"
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
## API별 활용신청(활성화) requirement
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
data.go.kr은 **계정용 공통 인증키 1개만 있으면 끝나는 구조가 아닙니다.** 호출하려는 Open API마다 상세 페이지에서 별도로 **활용신청**을 해야 합니다.
|
|
58
58
|
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
59
|
+
- 같은 `KPUBDATA_DATAGO_API_KEY`를 쓰더라도 API별 활성화 상태는 서로 다를 수 있습니다.
|
|
60
|
+
- 활용신청 후 대부분의 API는 약 **1~5분 안에 자동 승인/활성화**됩니다.
|
|
61
|
+
- 활성화 전에는 KPubData 호출이 **HTTP 403**으로 실패할 수 있습니다.
|
|
62
|
+
- 이 경우 해당 데이터셋의 data.go.kr 상세 페이지로 가서 **"활용신청"** 버튼을 눌렀는지 먼저 확인하세요.
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
예시:
|
|
65
|
+
|
|
66
|
+
- `datago.village_fcst`를 쓰려면 단기예보 API 페이지에서 활용신청 필요
|
|
67
|
+
- `datago.air_quality`를 쓰려면 대기오염정보 API 페이지에서 활용신청 필요
|
|
68
|
+
- 둘은 같은 포털/같은 키를 써도 **각각 따로** 활성화해야 함
|
|
69
|
+
|
|
70
|
+
### 6단계: 활성화 확인
|
|
65
71
|
|
|
66
72
|
키가 활성화되었는지 확인하려면 다음과 같이 테스트합니다:
|
|
67
73
|
|
|
@@ -70,7 +76,7 @@ export KPUBDATA_DATAGO_API_KEY="발급받은-일반-인증키"
|
|
|
70
76
|
curl "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?serviceKey=YOUR_KEY&dataType=json&numOfRows=1&pageNo=1&base_date=20250401&base_time=0500&nx=55&ny=127"
|
|
71
77
|
```
|
|
72
78
|
|
|
73
|
-
정상 응답이 오면 활성화가 완료된 것입니다. `SERVICE_KEY_IS_NOT_REGISTERED_ERROR
|
|
79
|
+
정상 응답이 오면 활성화가 완료된 것입니다. `403 Forbidden`, `SERVICE_KEY_IS_NOT_REGISTERED_ERROR`, 또는 인증 관련 오류가 나오면 활용신청 여부와 승인 대기 시간을 다시 확인하세요.
|
|
74
80
|
|
|
75
81
|
## KPubData에서 신청해야 할 API 목록
|
|
76
82
|
|
|
@@ -117,6 +117,12 @@ ProviderResponseError: BOK ECOS returned error
|
|
|
117
117
|
```
|
|
118
118
|
→ 날짜를 `"20240101"` 대신 `"202401"` (YYYYMM) 형식으로 입력했는지 확인하세요.
|
|
119
119
|
|
|
120
|
+
### "data.go.kr에서 403이 나옵니다"
|
|
121
|
+
```
|
|
122
|
+
AuthError: data.go.kr returned 403...
|
|
123
|
+
```
|
|
124
|
+
→ data.go.kr은 공통 인증키만으로는 부족하고 **API별 활용신청**이 필요합니다. 사용하려는 API 상세 페이지에서 "활용신청"을 눌렀는지 확인하세요. 대부분 1~5분 안에 자동 승인되지만 일부 API는 더 오래 걸릴 수 있습니다.
|
|
125
|
+
|
|
120
126
|
## Step 7: 다른 데이터도 조회해보기
|
|
121
127
|
|
|
122
128
|
### 사용 가능한 전체 데이터셋 목록 보기
|
|
@@ -146,6 +152,8 @@ kosis.population_migration — 시도별 이동자수 (Population Migration)
|
|
|
146
152
|
- 공공데이터포털(datago): [datago API 키 발급 가이드](./providers/datago.md)
|
|
147
153
|
- 통계청 KOSIS: [KOSIS API 키 발급 가이드](./providers/kosis.md)
|
|
148
154
|
|
|
155
|
+
> 참고: `datago`는 인증키 발급 후에도 **데이터셋별 활용신청**이 필요합니다. 활용신청 전에는 403이 발생할 수 있습니다.
|
|
156
|
+
|
|
149
157
|
## Step 8: 전체 페이지 자동 조회
|
|
150
158
|
|
|
151
159
|
데이터가 많을 때 `list_all()`을 사용하면 모든 페이지를 자동으로 순회합니다.
|
|
@@ -26,6 +26,7 @@ _BUILTIN_PROVIDERS: tuple[tuple[str, str, str], ...] = (
|
|
|
26
26
|
("kosis", "kpubdata.providers.kosis", "KosisAdapter"),
|
|
27
27
|
("lofin", "kpubdata.providers.lofin", "LofinAdapter"),
|
|
28
28
|
("localdata", "kpubdata.providers.localdata.adapter", "LocaldataAdapter"),
|
|
29
|
+
("semas", "kpubdata.providers.semas.adapter", "SemasAdapter"),
|
|
29
30
|
)
|
|
30
31
|
|
|
31
32
|
|
|
@@ -4,6 +4,9 @@ Key lookup order for provider keys:
|
|
|
4
4
|
1. Explicit `provider_keys` dict passed to constructor
|
|
5
5
|
2. Environment variable: KPUBDATA_{PROVIDER}_API_KEY (uppercased)
|
|
6
6
|
3. Environment variable: {PROVIDER}_API_KEY (uppercased, fallback)
|
|
7
|
+
|
|
8
|
+
data.go.kr providers (localdata, lofin, semas) all use the "datago" key.
|
|
9
|
+
Set KPUBDATA_DATAGO_API_KEY once for all data.go.kr-based providers.
|
|
7
10
|
"""
|
|
8
11
|
|
|
9
12
|
from __future__ import annotations
|
|
@@ -7,6 +7,8 @@ from collections.abc import Mapping, Sequence
|
|
|
7
7
|
from typing import NoReturn, cast
|
|
8
8
|
from urllib.parse import urlparse
|
|
9
9
|
|
|
10
|
+
import httpx
|
|
11
|
+
|
|
10
12
|
from kpubdata.config import KPubDataConfig
|
|
11
13
|
from kpubdata.core.models import (
|
|
12
14
|
DatasetRef,
|
|
@@ -22,6 +24,7 @@ from kpubdata.exceptions import (
|
|
|
22
24
|
ProviderResponseError,
|
|
23
25
|
RateLimitError,
|
|
24
26
|
ServiceUnavailableError,
|
|
27
|
+
TransportError,
|
|
25
28
|
)
|
|
26
29
|
from kpubdata.providers._common import build_schema_from_metadata, coerce_int, load_catalogue
|
|
27
30
|
from kpubdata.transport.decode import decode_json, decode_xml, detect_content_type
|
|
@@ -29,6 +32,12 @@ from kpubdata.transport.http import HttpTransport, TransportConfig
|
|
|
29
32
|
|
|
30
33
|
logger = logging.getLogger("kpubdata.provider.datago")
|
|
31
34
|
|
|
35
|
+
_DATAGO_403_HINT = (
|
|
36
|
+
"data.go.kr returned 403. This usually means the specific API has not been activated "
|
|
37
|
+
"(활용신청) for your key. Visit the dataset's page on https://www.data.go.kr and "
|
|
38
|
+
"click '활용신청'. Approval is usually automatic and becomes active within a few minutes."
|
|
39
|
+
)
|
|
40
|
+
|
|
32
41
|
|
|
33
42
|
def _is_success_code(code: str) -> bool:
|
|
34
43
|
"""Return True for any data.go.kr resultCode that signals success.
|
|
@@ -362,13 +371,23 @@ class DataGoAdapter:
|
|
|
362
371
|
self, url: str, params: Mapping[str, object], dataset_id: str = ""
|
|
363
372
|
) -> dict[str, object]:
|
|
364
373
|
string_params = {key: str(value) for key, value in params.items()}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
374
|
+
try:
|
|
375
|
+
response = self._transport.request(
|
|
376
|
+
"GET",
|
|
377
|
+
url,
|
|
378
|
+
params=string_params,
|
|
379
|
+
dataset_id=dataset_id,
|
|
380
|
+
provider="datago",
|
|
381
|
+
)
|
|
382
|
+
except TransportError as exc:
|
|
383
|
+
if self._is_http_403(exc):
|
|
384
|
+
raise AuthError(
|
|
385
|
+
_DATAGO_403_HINT,
|
|
386
|
+
provider="datago",
|
|
387
|
+
dataset_id=dataset_id or None,
|
|
388
|
+
status_code=403,
|
|
389
|
+
) from exc
|
|
390
|
+
raise
|
|
372
391
|
|
|
373
392
|
try:
|
|
374
393
|
content_type = detect_content_type(response)
|
|
@@ -394,6 +413,11 @@ class DataGoAdapter:
|
|
|
394
413
|
)
|
|
395
414
|
raise ParseError("Decoded payload is not an object", provider="datago")
|
|
396
415
|
|
|
416
|
+
@staticmethod
|
|
417
|
+
def _is_http_403(exc: TransportError) -> bool:
|
|
418
|
+
cause = exc.__cause__
|
|
419
|
+
return isinstance(cause, httpx.HTTPStatusError) and cause.response.status_code == 403
|
|
420
|
+
|
|
397
421
|
def _validate_envelope(
|
|
398
422
|
self, payload: dict[str, object], dataset: DatasetRef | None = None
|
|
399
423
|
) -> tuple[dict[str, object], list[dict[str, object]]]:
|
|
@@ -160,7 +160,7 @@ class LocaldataAdapter:
|
|
|
160
160
|
return payload
|
|
161
161
|
|
|
162
162
|
def _require_api_key(self) -> str:
|
|
163
|
-
return self._config.require_provider_key("
|
|
163
|
+
return self._config.require_provider_key("datago")
|
|
164
164
|
|
|
165
165
|
def _build_request_url(self, dataset: DatasetRef, operation: str | None = None) -> str:
|
|
166
166
|
base_url_raw = dataset.raw_metadata.get("base_url")
|