{"id":17650736,"url":"https://github.com/eaceto/xcspec","last_synced_at":"2025-03-30T08:22:21.061Z","repository":{"id":244651345,"uuid":"815873625","full_name":"eaceto/xcspec","owner":"eaceto","description":"A tool for exploring iOS, macOS, and Apple-like frameworks","archived":false,"fork":false,"pushed_at":"2024-06-22T07:15:39.000Z","size":35,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T07:52:08.433Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eaceto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-16T11:41:00.000Z","updated_at":"2024-06-22T07:15:42.000Z","dependencies_parsed_at":"2024-06-20T18:33:41.315Z","dependency_job_id":null,"html_url":"https://github.com/eaceto/xcspec","commit_stats":null,"previous_names":["eaceto/xcinfo","eaceto/xcspec"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eaceto%2Fxcspec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eaceto%2Fxcspec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eaceto%2Fxcspec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eaceto%2Fxcspec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eaceto","download_url":"https://codeload.github.com/eaceto/xcspec/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246291983,"owners_count":20753984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-23T11:39:21.292Z","updated_at":"2025-03-30T08:22:21.042Z","avatar_url":"https://github.com/eaceto.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xcspec\n\nA tool to extract and format information of iOS, macOS, and Apple-like frameworks \u0026 libraries. It provides details about the framework, including its name, version, supported platforms, architectures, Swift version, and more.\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Basic Usage](#basic-usage)\n  - [Output Formats](#output-formats)\n    - [JSON Output (default)](#json-output-default)\n    - [YAML Output](#yaml-output)\n  - [Output to a File](#output-to-a-file)\n- [Example Output](#example-output)\n  - [JSON](#json)\n  - [YAML](#yaml)\n- [Contributing](#contributing)\n- [Author](#author)\n\n## Features\n\n- Extracts framework name and version\n- Checks if the framework is mergeable\n- Extracts Swift compiler and Swift version details\n- Provides details about available libraries within the framework\n- Provides information about Privacy Manifests (if `PrivacyInfo.xcprivacy` file exists)\n\n## Installation\n\nYou can install xcspec using Homebrew:\n\n```sh\nbrew tap eaceto/tools\nbrew install eaceto/tools/xcspec\n```\n\n## Usage\n\nAfter installation, you can use the xcspec command to inspect a zipped framework file.\n\n### Basic Usage\n\n```sh\nxcspec path_to_xcframework.zip\nxcspec -f path_to_xcframework.zip\nxcspec --file path_to_xcframework.zip\n```\n\n### Output formats\n\nBy default, the output is in JSON format. You can also export the result as YAML using the **-t** or **--output-format** flag.\n\n#### JSON Output (default)\n\n```sh\nxcspec --file path_to_xcframework.zip\nxcspec --file path_to_xcframework.zip -t json\nxcspec --file path_to_xcframework.zip --output-format json\n```\n\n#### YAML Output\n\n```sh\nxcspec --file path_to_xcframework.zip -t yaml\nxcspec --file path_to_xcframework.zip --output-format yaml\n```\n\n### Output to a File\n\nWrite the output to a file can be addressed directly from the tool by defining an output (**-o** / **--output**) flag.\n\n\n```sh\nxcspec --file path_to_xcframework.zip -t yaml -o info.yaml\nxcspec --file path_to_xcframework.zip -o info.json\nxcspec --file path_to_xcframework.zip -output info.json\n```\n\n### Example Output\n\n#### JSON\n\n```json\n{\n  \"framework_name\": \"TestFramework\",\n  \"is_mergeable\": true,\n  \"swift_compiler_info\": \"Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)\",\n  \"swift_compiler_version\": \"5.10.0.13\",\n  \"swift_version\": \"5\",\n  \"library_evolution_enabled\": true,\n  \"built_for_distribution\": true,\n  \"available_libraries\": [\n    {\n      \"binary_path\": \"TestFramework.framework/TestFramework\",\n      \"library_identifier\": \"ios-arm64_x86_64-simulator\",\n      \"library_path\": \"TestFramework.framework\",\n      \"marketing_version\": \"1.0\",\n      \"mergeable_metadata\": true,\n      \"supported_architectures\": [\n        \"arm64\",\n        \"x86_64\"\n      ],\n      \"supported_platform\": \"ios\",\n      \"supported_platform_variant\": \"simulator\",\n      \"size\": \"170.85 KB\",\n      \"dependencies\": [\n        \"AVRouting\",\n        \"Accounts\",\n        \"ContactsUI\",\n        \"Foundation\",\n        \"Swift\",\n        \"_Concurrency\",\n        \"_StringProcessing\",\n        \"_SwiftConcurrencyShims\"\n      ],\n      \"privacy_info\": {\n        \"present\": true,\n        \"tracking\": true,\n        \"tracking_domains\": [\n          \"domain1.com\",\n          \"domain2.com\"\n        ],\n        \"collected_data_types\": [\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeUserID\",\n            \"linked_to_user\": true,\n            \"tracking\": false,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeProductPersonalization\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeDeviceID\",\n            \"linked_to_user\": true,\n            \"tracking\": true,\n            \"purposes\": [\n              \"\",\n              \"NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeProductPersonalization\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeProductInteraction\",\n            \"linked_to_user\": true,\n            \"tracking\": true,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",\n              \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeAdvertisingData\",\n            \"linked_to_user\": true,\n            \"tracking\": true,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeOtherUsageData\",\n            \"linked_to_user\": true,\n            \"tracking\": true,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\",\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeProductPersonalization\",\n              \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeCrashData\",\n            \"linked_to_user\": true,\n            \"tracking\": false,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"\n            ]\n          },\n          {\n            \"data_type\": \"NSPrivacyCollectedDataTypeOtherDiagnosticData\",\n            \"linked_to_user\": true,\n            \"tracking\": true,\n            \"purposes\": [\n              \"NSPrivacyCollectedDataTypePurposeAnalytics\",\n              \"NSPrivacyCollectedDataTypePurposeAppFunctionality\"\n            ]\n          }\n        ],\n        \"accessed_api_types\": [\n          {\n            \"api\": \"NSPrivacyAccessedAPICategoryUserDefaults\",\n            \"reasons\": [\n              \"1C8F.1\"\n            ]\n          },\n          {\n            \"api\": \"NSPrivacyAccessedAPICategoryFileTimestamp\",\n            \"reasons\": [\n              \"C617.1\"\n            ]\n          },\n          {\n            \"api\": \"NSPrivacyAccessedAPICategoryUserDefaults\",\n            \"reasons\": [\n              \"CA92.1\"\n            ]\n          },\n          {\n            \"api\": \"NSPrivacyAccessedAPICategorySystemBootTime\",\n            \"reasons\": [\n              \"35F9.1\"\n            ]\n          },\n          {\n            \"api\": \"NSPrivacyAccessedAPICategoryDiskSpace\",\n            \"reasons\": [\n              \"E174.1\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n```\n\n#### YAML\n\n````yml\nframework_name: TestFramework\nis_mergeable: true\nswift_compiler_info: Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)\nswift_compiler_version: 5.10.0.13\nswift_version: '5'\nlibrary_evolution_enabled: true\nbuilt_for_distribution: true\navailable_libraries:\n  - binary_path: TestFramework.framework/TestFramework\n    library_identifier: ios-arm64_x86_64-simulator\n    library_path: TestFramework.framework\n    marketing_version: '1.0'\n    mergeable_metadata: true\n    supported_architectures:\n      - arm64\n      - x86_64\n    supported_platform: ios\n    supported_platform_variant: simulator\n    size: 170.85 KB\n    dependencies:\n      - AVRouting\n      - Accounts\n      - ContactsUI\n      - Foundation\n      - Swift\n      - _Concurrency\n      - _StringProcessing\n      - _SwiftConcurrencyShims\n    privacy_info:\n      present: true\n      tracking: true\n      tracking_domains:\n        - domain1.com\n        - domain2.com\n      collected_data_types:\n        - data_type: NSPrivacyCollectedDataTypeUserID\n          linked_to_user: true\n          tracking: false\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\n            - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeProductPersonalization\n        - data_type: NSPrivacyCollectedDataTypeDeviceID\n          linked_to_user: true\n          tracking: true\n          purposes:\n            - ''\n            - NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\n            - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeProductPersonalization\n        - data_type: NSPrivacyCollectedDataTypeProductInteraction\n          linked_to_user: true\n          tracking: true\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\n            - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeProductPersonalization\n            - NSPrivacyCollectedDataTypePurposeAppFunctionality\n        - data_type: NSPrivacyCollectedDataTypeAdvertisingData\n          linked_to_user: true\n          tracking: true\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\n            - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\n        - data_type: NSPrivacyCollectedDataTypeOtherUsageData\n          linked_to_user: true\n          tracking: true\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising\n            - NSPrivacyCollectedDataTypePurposeDeveloperAdvertising\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeProductPersonalization\n            - NSPrivacyCollectedDataTypePurposeAppFunctionality\n        - data_type: NSPrivacyCollectedDataTypeCrashData\n          linked_to_user: true\n          tracking: false\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeAppFunctionality\n        - data_type: NSPrivacyCollectedDataTypeOtherDiagnosticData\n          linked_to_user: true\n          tracking: true\n          purposes:\n            - NSPrivacyCollectedDataTypePurposeAnalytics\n            - NSPrivacyCollectedDataTypePurposeAppFunctionality\n      accessed_api_types:\n        - api: NSPrivacyAccessedAPICategoryUserDefaults\n          reasons:\n            - 1C8F.1\n        - api: NSPrivacyAccessedAPICategoryFileTimestamp\n          reasons:\n            - C617.1\n        - api: NSPrivacyAccessedAPICategoryUserDefaults\n          reasons:\n            - CA92.1\n        - api: NSPrivacyAccessedAPICategorySystemBootTime\n          reasons:\n            - 35F9.1\n        - api: NSPrivacyAccessedAPICategoryDiskSpace\n          reasons:\n            - E174.1\n````\n\n## Contributing\n\nContributions are welcome! Please open an issue or submit a pull request if you have any improvements or bug fixes.\n\n## Author\n\nEzequiel (Kimi) Aceto\n\n* [My blog](https://eaceto.dev)\n* [Find my on LinkedIn](https://es.linkedin.com/in/ezequielaceto)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feaceto%2Fxcspec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feaceto%2Fxcspec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feaceto%2Fxcspec/lists"}