diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 0000000..ecf48ba --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,70 @@ +# @format +name: Documentation + +permissions: + contents: write + +on: + push: + branches: + - main + tags: + - "*" + +concurrency: + group: docs-deploy + cancel-in-progress: false + +jobs: + build-and-push-documentation: + runs-on: macos-26 + + steps: + - name: Select Xcode 26.5 + run: sudo xcode-select -s /Applications/Xcode_26.5.app + + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: mise setup + uses: jdx/mise-action@v4 + with: + install: true + env: + MISE_HTTP_TIMEOUT: 300 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Resolve documentation version + id: docs-version + env: + REF_TYPE: ${{ github.ref_type }} + REF_NAME: ${{ github.ref_name }} + run: | + if [[ "${REF_TYPE}" == "tag" ]]; then + VERSION="${REF_NAME#v}" + UPDATE_LATEST="false" + else + VERSION="latest" + UPDATE_LATEST="false" + fi + + echo "version=${VERSION}" >> "${GITHUB_OUTPUT}" + echo "update_latest=${UPDATE_LATEST}" >> "${GITHUB_OUTPUT}" + + echo "Resolved documentation version: ${VERSION}" + echo "Update latest: ${UPDATE_LATEST}" + + - name: Build documentation + env: + DOCS_VERSION: ${{ steps.docs-version.outputs.version }} + run: mise run docs:build + + - name: Fix permissions + run: sudo chown -R "$USER" .docs-out + + - name: Deploy documentation + env: + UPDATE_LATEST: ${{ steps.docs-version.outputs.update_latest }} + run: mise run docs:deploy diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 3a48738..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: CI - -on: [push] - -jobs: - tests: - name: Unit-Tests - runs-on: macos-10.15 - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Force Xcode 12.2 - run: sudo xcode-select -switch /Applications/Xcode_12.2.app - - name: fastlane ios tests - run: fastlane ios tests - compatibility: - name: Compatibility-Tests - runs-on: macos-10.15 - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - name: Force Xcode 12.2 - run: sudo xcode-select -switch /Applications/Xcode_12.2.app - - name: fastlane ios compatibilityTests - run: fastlane ios compatibilityTests diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..b27f6be --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,50 @@ +# @format +name: Test +on: + push: + branches: + - main + pull_request: + branches: + - "*" + - "!gh-pages" +jobs: + test: + name: Test ${{ matrix.platform }} + runs-on: macos-26 + strategy: + fail-fast: false + matrix: + include: + - platform: iOS + destination: "platform=iOS Simulator,OS=26.5,name=iPhone 17 Pro" + - platform: watchOS + destination: "platform=watchOS Simulator,OS=26.5,name=Apple Watch Ultra 3 (49mm)" + - platform: visionOS + destination: "platform=visionOS Simulator,OS=26.5,name=Apple Vision Pro" + - platform: tvOS + destination: "platform=tvOS Simulator,OS=26.5,name=Apple TV" + - platform: macOS + destination: "platform=macOS" + steps: + - name: Select Xcode 26.5 + run: sudo xcode-select -s /Applications/Xcode_26.5.app + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: mise setup + uses: jdx/mise-action@v4 + with: + install: true + env: + MISE_HTTP_TIMEOUT: 300 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Test ${{ matrix.platform }} + run: > + set -euo pipefail + + xcodebuild test + -scheme LoggingKit + -destination "${{ matrix.destination }}" + | xcbeautify diff --git a/.gitignore b/.gitignore index 98e169a..97f5b2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,110 +1,17 @@ - -# Created by https://www.gitignore.io/api/macos,xcode,carthage,cocoapods,fastlane - -### Carthage ### -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -Carthage/Checkouts - -Carthage/Build - -### CocoaPods ### -## CocoaPods GitIgnore Template - -# CocoaPods - Only use to conserve bandwidth / Save time on Pushing -# - Also handy if you have a large number of dependant pods -# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE -Pods/ - -### macOS ### -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Documentation -#Documentation - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Xcode ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -build/ +# macOS +.DS_Store +.netrc + +# SPM +.swiftpm +/.deriveddata +/.build +/Packages DerivedData/ - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 xcuserdata/ -## Other -*.moved-aside -*.xccheckout -*.xcscmblueprint - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno - -### fastlane ### -# fastlane - A streamlined workflow tool for Cocoa deployment -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -# fastlane specific -/fastlane/README.md -fastlane/report.xml - -# deliver temporary files -fastlane/Preview.html - -# snapshot generated screenshots -fastlane/screenshots/**/*.png -fastlane/screenshots/screenshots.html - -# scan temporary files -fastlane/test_output - -# End of https://www.gitignore.io/api/macos,xcode,carthage,cocoapods,fastlane - -.build/** -.bundle/** -.vendor/** -.swiftpm/** -.vendor/** +# Documentation +.documentation_website +*.doccarchive +.docs-out/ +*.docc-build/ diff --git a/.jazzy.yaml b/.jazzy.yaml deleted file mode 100644 index 901f80f..0000000 --- a/.jazzy.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# LoggingKit document generator jazzy settings - -copyright: Copyright 2020 Alexander WeiรŸ -author: Alexander WeiรŸ -xcodebuild_arguments: [-target, LoggingKit-iOS] -clean: true -output: ./docs diff --git a/.mise/tasks/docs/assets/version-picker.css b/.mise/tasks/docs/assets/version-picker.css new file mode 100644 index 0000000..3607d07 --- /dev/null +++ b/.mise/tasks/docs/assets/version-picker.css @@ -0,0 +1,30 @@ +.version-picker { + display: flex; + align-items: center; + gap: 6px; + margin-left: auto; + padding: 0 16px; + font-size: 14px; +} + +.version-picker-label { + color: var(--color-figure-gray-secondary, #6e6e73); + white-space: nowrap; +} + +.version-picker-select { + appearance: auto; + background: var(--color-fill, #fff); + border: 1px solid var(--color-grid, #d2d2d7); + border-radius: 4px; + color: var(--color-text, #1d1d1f); + font-size: 13px; + padding: 4px 8px; + cursor: pointer; +} + +body[data-color-scheme="dark"] .version-picker-select { + background: var(--color-fill, #1c1c1e); + border-color: var(--color-grid, #424245); + color: var(--color-text, #f5f5f7); +} diff --git a/.mise/tasks/docs/assets/version-picker.js b/.mise/tasks/docs/assets/version-picker.js new file mode 100644 index 0000000..6703572 --- /dev/null +++ b/.mise/tasks/docs/assets/version-picker.js @@ -0,0 +1,121 @@ +(function () { + "use strict"; + + var SITE_ROOT = "/LoggingKit/"; + var VERSIONS_URL = SITE_ROOT + "versions.json"; + + function getCurrentVersion() { + var path = window.location.pathname; + + if (path.startsWith(SITE_ROOT)) { + var segment = path.substring(SITE_ROOT.length).split("/")[0]; + + if (segment) { + return segment; + } + } + + return "latest"; + } + + function createPicker(versions, currentVersion) { + var container = document.createElement("div"); + container.className = "version-picker"; + + var label = document.createElement("span"); + label.className = "version-picker-label"; + label.textContent = "Version"; + + var select = document.createElement("select"); + select.className = "version-picker-select"; + select.setAttribute("aria-label", "Documentation version"); + + versions.forEach(function (version) { + var option = document.createElement("option"); + option.value = version.url; + option.textContent = version.version; + + if (version.version === currentVersion) { + option.selected = true; + } + + select.appendChild(option); + }); + + select.addEventListener("change", function () { + window.location.href = select.value; + }); + + container.appendChild(label); + container.appendChild(select); + + return container; + } + + function injectPicker(picker) { + function tryInject() { + var target = document.querySelector(".nav-content"); + + if (!target) { + target = document.querySelector("nav.nav"); + } + + if (!target) { + target = document.querySelector("#app nav"); + } + + if (target && !target.querySelector(".version-picker")) { + target.appendChild(picker); + return true; + } + + return false; + } + + if (tryInject()) { + return; + } + + var observer = new MutationObserver(function (_, observer) { + if (tryInject()) { + observer.disconnect(); + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); + + setTimeout(function () { + observer.disconnect(); + + if (!document.querySelector(".version-picker")) { + document.body.insertBefore(picker, document.body.firstChild); + } + }, 5000); + } + + var css = document.createElement("link"); + css.rel = "stylesheet"; + css.href = SITE_ROOT + "version-picker.css"; + document.head.appendChild(css); + + fetch(VERSIONS_URL) + .then(function (response) { + return response.json(); + }) + .then(function (versions) { + if (versions.length <= 1) { + return; + } + + var currentVersion = getCurrentVersion(); + var picker = createPicker(versions, currentVersion); + + injectPicker(picker); + }) + .catch(function (error) { + console.warn("Version picker: could not load versions.json", error); + }); +})(); diff --git a/.mise/tasks/docs/build.sh b/.mise/tasks/docs/build.sh new file mode 100755 index 0000000..78899dc --- /dev/null +++ b/.mise/tasks/docs/build.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +#MISE description="Build the documentation" + +set -euo pipefail + +### Variables ### +VERSION="${DOCS_VERSION:-latest}" +SCHEMES=("LoggingKit") + +DOCC_BUNDLE_PATH="./Sources/Documentation.docc" + +DERIVED_DATA_DIR=".deriveddata" +BUILD_DIR="${PWD}/.build" +SYMBOL_GRAPHS_DIR="${BUILD_DIR}/symbol-graphs" + +WEBSITE_OUTPUT_PATH="${PWD}/.docs-out" +FALLBACK_BUNDLE_IDENTIFIER="dev.alexanderweiss.loggingkit" +FALLBACK_DISPLAY_NAME="LoggingKit" +SITE_BASE_PATH="/LoggingKit" +HOSTING_BASE_PATH="${SITE_BASE_PATH}/${VERSION}" +DOCCARCHIVE_PATH="${PWD}/${FALLBACK_DISPLAY_NAME}.doccarchive" + +### Methods ### +build_for_platform() { + local LOC_SYMBOL_GRAPHS_DIR=$1 + local LOC_DERIVED_DATA_DIR=$2 + local LOC_PLATFORM=$3 + local LOC_SCHEME=$4 + + echo " ๐Ÿ“‚ SYMBOL_GRAPHS_DIR: ${LOC_SYMBOL_GRAPHS_DIR}" + echo " ๐Ÿ“‚ DERIVED_DATA_DIR: ${LOC_DERIVED_DATA_DIR}" + echo " ๐ŸŽฏ PLATFORM: ${LOC_PLATFORM}" + echo " ๐Ÿ“ฆ SCHEME: ${LOC_SCHEME}" + + mkdir -p "${LOC_SYMBOL_GRAPHS_DIR}" + + xcodebuild build \ + -scheme "${LOC_SCHEME}" \ + -destination "${LOC_PLATFORM}" \ + -derivedDataPath "${LOC_DERIVED_DATA_DIR}" \ + DOCC_EXTRACT_EXTENSION_SYMBOLS=YES \ + OTHER_SWIFT_FLAGS="-Xfrontend -emit-symbol-graph -Xfrontend -emit-symbol-graph-dir -Xfrontend ${LOC_SYMBOL_GRAPHS_DIR} -Xfrontend -emit-extension-block-symbols" | xcbeautify +} + +platforms=( + "iOS,๐Ÿ“ฑ" + "watchOS,โŒš" + "visionOS,๐Ÿ•ถ๏ธ" + "tvOS,๐Ÿ“บ" + "macOS,๐Ÿ’ป" +) + +# Iterate over available platforms +for SCHEME in "${SCHEMES[@]}"; do + echo "Building documentation symbols for ${SCHEME}" + for input in "${platforms[@]}"; do + IFS="," read -r platform icon <<<"${input}" + platform_symbol_graphs_dir="${SYMBOL_GRAPHS_DIR}/${SCHEME}/${platform}" + echo "${icon} Building ${SCHEME} for ${platform}" + build_for_platform \ + "${platform_symbol_graphs_dir}" \ + "${DERIVED_DATA_DIR}" \ + "generic/platform=${platform}" \ + "${SCHEME}" + done +done + +### Creating Archive ### +echo "๐Ÿ“ฆ Creating .doccarchive" +# Create a .doccarchive from the combined symbol graphs. +xcrun docc convert "${DOCC_BUNDLE_PATH}" \ + --fallback-display-name "${FALLBACK_DISPLAY_NAME}" \ + --fallback-bundle-identifier "${FALLBACK_BUNDLE_IDENTIFIER}" \ + --fallback-bundle-version 1 \ + --output-dir "${DOCCARCHIVE_PATH}" \ + --additional-symbol-graph-dir "${SYMBOL_GRAPHS_DIR}" \ + --enable-experimental-markdown-output \ + --enable-experimental-markdown-output-manifest + +### Processing Archive ### +echo "โš™๏ธ Processing .doccarchive" +mkdir -p "${WEBSITE_OUTPUT_PATH}" +xcrun docc process-archive \ + transform-for-static-hosting "${DOCCARCHIVE_PATH}" \ + --output-path "${WEBSITE_OUTPUT_PATH}" \ + --hosting-base-path "${HOSTING_BASE_PATH}" + +echo "๐Ÿ”ง Injecting version picker script" + +PICKER_SCRIPT="" + +find "${WEBSITE_OUTPUT_PATH}" -name 'index.html' -exec \ + perl -pi -e "s||${PICKER_SCRIPT}|" {} + + +echo "${VERSION}" >"${WEBSITE_OUTPUT_PATH}/.docs-version" + +echo "โœ… Documentation built successfully (version: ${VERSION})" + +# Clean up. +rm -rf "${DERIVED_DATA_DIR}" +rm -rf "${BUILD_DIR}" diff --git a/.mise/tasks/docs/deploy.sh b/.mise/tasks/docs/deploy.sh new file mode 100755 index 0000000..0a18078 --- /dev/null +++ b/.mise/tasks/docs/deploy.sh @@ -0,0 +1,250 @@ +#!/usr/bin/env bash +#MISE description="Deploy documentation to gh-pages branch" + +set -euo pipefail + +readonly DOCS_DIR="${PWD}/.docs-out" +readonly GH_PAGES_BRANCH="gh-pages" +readonly REMOTE="origin" +readonly ORIGINAL_DIR="${PWD}" + +readonly SITE_BASE_PATH="/LoggingKit" +readonly ASSETS_DIR="${PWD}/.mise/tasks/docs/assets" + +WORKTREE_DIR="" + +VERSION=$(cat "${DOCS_DIR}/.docs-version" 2>/dev/null || echo "latest") + +cleanup_worktree() { + if [[ -n "${WORKTREE_DIR}" && -d "${WORKTREE_DIR}" ]]; then + cd "${ORIGINAL_DIR}" + git worktree remove --force "${WORKTREE_DIR}" 2>/dev/null || true + rm -rf "${WORKTREE_DIR}" 2>/dev/null || true + fi +} + +check_prerequisites() { + if [[ ! -d "${DOCS_DIR}" ]]; then + echo "โŒ Error: ${DOCS_DIR} directory not found" >&2 + echo "Run the documentation build first." >&2 + exit 1 + fi + + if [[ ! -f "${DOCS_DIR}/index.html" ]]; then + echo "โŒ Error: ${DOCS_DIR} appears incomplete. No index.html found." >&2 + exit 1 + fi + + if [[ ! -f "${ASSETS_DIR}/version-picker.js" ]]; then + echo "โŒ Error: version-picker.js not found in ${ASSETS_DIR}" >&2 + exit 1 + fi + + if [[ ! -f "${ASSETS_DIR}/version-picker.css" ]]; then + echo "โŒ Error: version-picker.css not found in ${ASSETS_DIR}" >&2 + exit 1 + fi +} + +ensure_gh_pages_branch_exists() { + if git show-ref --verify --quiet "refs/heads/${GH_PAGES_BRANCH}"; then + echo "โ„น๏ธ Using existing local ${GH_PAGES_BRANCH} branch" + return + fi + + if git show-ref --verify --quiet "refs/remotes/${REMOTE}/${GH_PAGES_BRANCH}"; then + echo "โ„น๏ธ Fetching ${GH_PAGES_BRANCH} from ${REMOTE}" + git fetch "${REMOTE}" "${GH_PAGES_BRANCH}:${GH_PAGES_BRANCH}" + return + fi + + echo "โ„น๏ธ Creating new ${GH_PAGES_BRANCH} branch" + + git switch --orphan "${GH_PAGES_BRANCH}" + git rm -rf . 2>/dev/null || true + git commit --allow-empty -m "docs: initialize gh-pages branch" + git push -u "${REMOTE}" "${GH_PAGES_BRANCH}" + git switch - +} + +update_versions_manifest() { + local version="$1" + local manifest="./versions.json" + + python3 - "$manifest" "$version" "$SITE_BASE_PATH" <<'PY' +import json +import re +import sys +from pathlib import Path + +manifest_path = Path(sys.argv[1]) +version = sys.argv[2] +site_base_path = sys.argv[3] + +if manifest_path.exists(): + versions = json.loads(manifest_path.read_text()) +else: + versions = [] + +entry = { + "version": version, + "url": f"{site_base_path}/{version}/documentation/overview/" +} + +versions = [item for item in versions if item["version"] != version] +versions.append(entry) + +def sort_key(item): + version = item["version"] + + if version == "latest": + return (0, []) + + parts = [int(part) for part in re.findall(r"\d+", version)] + return (1, [-part for part in parts]) + +versions.sort(key=sort_key) + +manifest_path.write_text(json.dumps(versions, indent=2) + "\n") +PY +} + +generate_root_redirect() { + cat >./index.html < + + + + + Redirecting... + + + +

Redirecting to latest documentation...

+ + +EOF +} + +generate_404_page() { + cat >./404.html < + + + + Page Not Found + + + +

Page not found. Go to documentation.

+ + +EOF +} + +rewrite_base_path() { + local dir="$1" + local from_version="$2" + local to_version="$3" + + echo "๐Ÿ”„ Rewriting base path from ${from_version} to ${to_version}" + + find "${dir}" -name 'index.html' -exec \ + perl -pi -e "s|\Q${SITE_BASE_PATH}/${from_version}/\E|${SITE_BASE_PATH}/${to_version}/|g" {} + +} + +deploy_version() { + local target_version="$1" + + echo "๐Ÿงน Cleaning ${target_version}/" + rm -rf "./${target_version}" + mkdir -p "./${target_version}" + + echo "๐Ÿ“‹ Copying documentation to ${target_version}/" + cp -R "${DOCS_DIR}/." "./${target_version}/" + rm -f "./${target_version}/.docs-version" + + if [[ "${target_version}" != "${VERSION}" ]]; then + rewrite_base_path "./${target_version}" "${VERSION}" "${target_version}" + fi + + echo "๐Ÿ“ Updating versions.json for ${target_version}" + update_versions_manifest "${target_version}" +} + +deploy_with_worktree() { + WORKTREE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/docc-gh-pages.XXXXXX") + + echo "๐Ÿ“ Creating temporary worktree at ${WORKTREE_DIR}" + + git worktree prune + git worktree add --detach "${WORKTREE_DIR}" "${GH_PAGES_BRANCH}" + + cd "${WORKTREE_DIR}" + + if [[ ! -f ./versions.json ]]; then + echo "๐Ÿ”„ Migrating to versioned documentation layout" + find . -maxdepth 1 \ + -not -name '.git' \ + -not -name '.' \ + -not -name '..' \ + -exec rm -rf {} + + fi + + deploy_version "${VERSION}" + + if [[ "${UPDATE_LATEST:-false}" == "true" && "${VERSION}" != "latest" ]]; then + echo "๐Ÿ”„ Also updating latest/" + deploy_version "latest" + fi + + echo "๐Ÿ“ฆ Updating shared assets" + cp "${ASSETS_DIR}/version-picker.js" ./version-picker.js + cp "${ASSETS_DIR}/version-picker.css" ./version-picker.css + + generate_root_redirect + generate_404_page + + touch .nojekyll + + git add --all + + if git diff --quiet && git diff --cached --quiet; then + echo "โ„น๏ธ No changes to deploy" + return 0 + fi + + SOURCE_COMMIT=$(git -C "${ORIGINAL_DIR}" rev-parse HEAD) + + echo "๐Ÿ’พ Committing changes" + git commit -m "docs: deploy ${VERSION} documentation from ${SOURCE_COMMIT}" + + echo "๐Ÿš€ Pushing to ${REMOTE}/${GH_PAGES_BRANCH}" + git push "${REMOTE}" "HEAD:${GH_PAGES_BRANCH}" +} + +main() { + echo "๐Ÿ“š Deploying documentation version ${VERSION} to ${GH_PAGES_BRANCH}" + + check_prerequisites + ensure_gh_pages_branch_exists + deploy_with_worktree + cleanup_worktree + + echo "โœ… Documentation deployed successfully" +} + +trap cleanup_worktree EXIT ERR INT TERM + +main diff --git a/.mise/tasks/format.sh b/.mise/tasks/format.sh new file mode 100755 index 0000000..c8f12cf --- /dev/null +++ b/.mise/tasks/format.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +#MISE description="Format the project" + +if [ -z "$1" ]; then + TARGET_DIR="." +else + TARGET_DIR="$1" +fi + +swiftformat $TARGET_DIR --config .swiftformat \ No newline at end of file diff --git a/.mise/tasks/lint.sh b/.mise/tasks/lint.sh new file mode 100755 index 0000000..eace5d6 --- /dev/null +++ b/.mise/tasks/lint.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +#MISE description="Lint the project" + +if [ -z "$1" ]; then + TARGET_DIR="." +else + TARGET_DIR="$1" +fi + +swiftlint $TARGET_DIR --config .swiftlint.yml \ No newline at end of file diff --git a/.spi.yml b/.spi.yml new file mode 100644 index 0000000..ed90c5f --- /dev/null +++ b/.spi.yml @@ -0,0 +1,15 @@ +version: 1 +external_links: + documentation: "https://alexanderwe.github.io/LoggingKit/latest/documentation/overview" +builder: + configs: + - platform: ios + scheme: LoggingKit + - platform: watchos + scheme: LoggingKit + - platform: visionOS + scheme: LoggingKit + - platform: tvOS + scheme: LoggingKit + - platform: macOS + scheme: LoggingKit diff --git a/.swift-version b/.swift-version new file mode 100644 index 0000000..e0ea36f --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +6.0 diff --git a/.swiftformat b/.swiftformat new file mode 100644 index 0000000..ff13c17 --- /dev/null +++ b/.swiftformat @@ -0,0 +1,47 @@ +# exclusion +--exclude Package.swift, \ +Sources/Documentation.docc/, \ +.swiftpm, \ +.deriveddata + +# format options +--allman false # use K&R indentation style +--binarygrouping 4,8 +--closingparen balanced +--commas always +--comments indent +--computedvarattrs same-line +--decimalgrouping 3,6 +--elseposition same-line +--empty void +--exponentcase lowercase +--exponentgrouping disabled +--extensionacl on-declarations +--fractiongrouping disabled +--funcattributes prev-line +--hexgrouping 4,8 +--hexliteralcase uppercase +--ifdef no-indent +--indent 4 +--indentcase false +--importgrouping testable-bottom +--lineaftermarks false # Do not insert a blank line after "MARK: comments" +--linebreaks lf +--maxwidth 130 +--octalgrouping 4,8 +--operatorfunc spaced +--patternlet hoist +--ranges spaced +--semicolons inline +--storedvarattrs same-line +--stripunusedargs always +--trimwhitespace always +--typeattributes prev-line +--wraparguments before-first +--wrapcollections before-first +--wrapconditions after-first +--wrapparameters before-first + +# rules +--disable elseOnSameLine,redundantSelf,redundantStaticSelf,redundantType,redundantRawValues,redundantReturn,preferForLoop +--enable blankLinesBetweenImports diff --git a/.swiftlint.yml b/.swiftlint.yml index 8038d1f..03e8a61 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,21 +1,60 @@ -opt_in_rules: # some rules are only opt-in +excluded: + - "Package.swift" + - ".swiftpm/" + - "Sources/Documentation.docc" + - ".deriveddata/" + +only_rules: + - custom_rules + - discouraged_optional_boolean - empty_count - - redundant_nil_coalescing - - switch_case_on_newline + - empty_string + - explicit_init + - force_cast + - force_try - force_unwrapping - - conditional_returns_on_newline - - closure_spacing + - identifier_name - implicitly_unwrapped_optional - - sorted_imports - - valid_docs - - nslocalizedstring_require_bundle + - operator_usage_whitespace -included: - - Sources +empty_count: + severity: error +empty_string: + severity: error +explicit_init: + include_bare_init: true + severity: error +force_cast: + severity: warning # implicitly +force_try: + severity: warning # explicitly +force_unwrapping: + severity: error +identifier_name: + excluded: + - at + - d + - id + - Id + - z + - x + - y + - on + - vc + allowed_symbols: + - _ +implicitly_unwrapped_optional: + severity: error +operator_usage_whitespace: + severity: error -excluded: # paths to ignore during linting. Takes precedence over `included`. - - Tests - - Example +custom_rules: + disable_print: + included: ".*\\.swift" + name: "print usage" + regex: "((\\bprint)|(Swift\\.print))\\s*\\(" + message: "Use Logger over print" + severity: warning -disabled_rules: # rule identifiers to exclude from running - - trailing_whitespace \ No newline at end of file +# Allows for 0 lintable files, e.g. all files to lint match exclusion rules +allow_zero_lintable_files: true diff --git a/Configs/LoggingKit.plist b/Configs/LoggingKit.plist deleted file mode 100644 index 0cb04e2..0000000 --- a/Configs/LoggingKit.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - LoggingKit - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.0.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright ยฉ 2020 Alexander WeiรŸ. All rights reserved. - NSPrincipalClass - - - diff --git a/Configs/LoggingKitTests.plist b/Configs/LoggingKitTests.plist deleted file mode 100644 index f931463..0000000 --- a/Configs/LoggingKitTests.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 2.0.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/AppDelegate.swift b/Example/AppDelegate.swift deleted file mode 100644 index 35351de..0000000 --- a/Example/AppDelegate.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// AppDelegate.swift -// Example -// -// Created by Alexander WeiรŸ on 25. Apr 2020. -// Copyright ยฉ 2020 LoggingKit. All rights reserved. -// - -import UIKit -import LoggingKit - -// MARK: - AppDelegate - -/// The AppDelegate -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - /// The UIWindow - var window: UIWindow? - - /// The RootViewController - var rootViewController: UIViewController { - return ViewController() - } - - /// Application did finish launching with options - /// - /// - Parameters: - /// - application: The UIApplication - /// - launchOptions: The LaunchOptions - /// - Returns: The launch result - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - - LogService.register(logProviders: MyTestLogProvider()) - - - // Initialize UIWindow - self.window = .init(frame: UIScreen.main.bounds) - // Set RootViewController - self.window?.rootViewController = self.rootViewController - // Make Key and Visible - self.window?.makeKeyAndVisible() - - // Return positive launch - return true - } - -} diff --git a/Example/Logging+LogCategories.swift b/Example/Logging+LogCategories.swift deleted file mode 100644 index b96dc17..0000000 --- a/Example/Logging+LogCategories.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Logging+LogCategories.swift -// Example -// -// Created by Alexander Weiss on 25.04.20. -// Copyright ยฉ 2020 LoggingKit. All rights reserved. -// - -import LoggingKit - -extension LogCategories { - public var viewControllers: LogCategory { return .init("viewControllers") } - public var combine: LogCategory { return .init("combine") } -} diff --git a/Example/LoggingDemo.xcodeproj/project.pbxproj b/Example/LoggingDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..fad60a8 --- /dev/null +++ b/Example/LoggingDemo.xcodeproj/project.pbxproj @@ -0,0 +1,373 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + C2E032EC2FFA5BFC00DD0F47 /* LoggingKit in Frameworks */ = {isa = PBXBuildFile; productRef = C2E032EB2FFA5BFC00DD0F47 /* LoggingKit */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + A4D19E592D2042030044AA5E /* LoggingDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LoggingDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + C2E033022FFA5C1D00DD0F47 /* LoggingDemo */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = LoggingDemo; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + A4D19E562D2042030044AA5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C2E032EC2FFA5BFC00DD0F47 /* LoggingKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A4D19E502D2042020044AA5E = { + isa = PBXGroup; + children = ( + C2E033022FFA5C1D00DD0F47 /* LoggingDemo */, + A4D19E852D20437C0044AA5E /* Frameworks */, + A4D19E5A2D2042030044AA5E /* Products */, + ); + sourceTree = ""; + }; + A4D19E5A2D2042030044AA5E /* Products */ = { + isa = PBXGroup; + children = ( + A4D19E592D2042030044AA5E /* LoggingDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + A4D19E852D20437C0044AA5E /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A4D19E582D2042030044AA5E /* LoggingDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = A4D19E682D20420C0044AA5E /* Build configuration list for PBXNativeTarget "LoggingDemo" */; + buildPhases = ( + A4D19E552D2042030044AA5E /* Sources */, + A4D19E562D2042030044AA5E /* Frameworks */, + A4D19E572D2042030044AA5E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + C2E033022FFA5C1D00DD0F47 /* LoggingDemo */, + ); + name = LoggingDemo; + packageProductDependencies = ( + C2E032EB2FFA5BFC00DD0F47 /* LoggingKit */, + ); + productName = LoggingDemo; + productReference = A4D19E592D2042030044AA5E /* LoggingDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A4D19E512D2042020044AA5E /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; + TargetAttributes = { + A4D19E582D2042030044AA5E = { + CreatedOnToolsVersion = 16.2; + }; + }; + }; + buildConfigurationList = A4D19E542D2042030044AA5E /* Build configuration list for PBXProject "LoggingDemo" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = A4D19E502D2042020044AA5E; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + C2E032EA2FFA5BFC00DD0F47 /* XCLocalSwiftPackageReference "../../LoggingKit" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = A4D19E5A2D2042030044AA5E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A4D19E582D2042030044AA5E /* LoggingDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A4D19E572D2042030044AA5E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A4D19E552D2042030044AA5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A4D19E662D20420C0044AA5E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A4D19E672D20420C0044AA5E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + A4D19E692D20420C0044AA5E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"LoggingDemo/Resources/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LoggingDemo/SupportingFiles/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.test.LoggingDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,7"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + A4D19E6A2D20420C0044AA5E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"LoggingDemo/Resources/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LoggingDemo/SupportingFiles/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.test.LoggingDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,7"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A4D19E542D2042030044AA5E /* Build configuration list for PBXProject "LoggingDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A4D19E662D20420C0044AA5E /* Debug */, + A4D19E672D20420C0044AA5E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A4D19E682D20420C0044AA5E /* Build configuration list for PBXNativeTarget "LoggingDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A4D19E692D20420C0044AA5E /* Debug */, + A4D19E6A2D20420C0044AA5E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + C2E032EA2FFA5BFC00DD0F47 /* XCLocalSwiftPackageReference "../../LoggingKit" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../../LoggingKit; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + C2E032EB2FFA5BFC00DD0F47 /* LoggingKit */ = { + isa = XCSwiftPackageProductDependency; + productName = LoggingKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = A4D19E512D2042020044AA5E /* Project object */; +} diff --git a/Example/LoggingDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/LoggingDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Example/LoggingDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-watchOS.xcscheme b/Example/LoggingDemo.xcodeproj/xcshareddata/xcschemes/LoggingDemo.xcscheme similarity index 59% rename from LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-watchOS.xcscheme rename to Example/LoggingDemo.xcodeproj/xcshareddata/xcschemes/LoggingDemo.xcscheme index d44895d..e63eefe 100644 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-watchOS.xcscheme +++ b/Example/LoggingDemo.xcodeproj/xcshareddata/xcschemes/LoggingDemo.xcscheme @@ -1,10 +1,11 @@ + LastUpgradeVersion = "2660" + version = "1.7"> + buildImplicitDependencies = "YES" + buildArchitectures = "Automatic"> + BlueprintIdentifier = "A4D19E582D2042030044AA5E" + BuildableName = "LoggingDemo.app" + BlueprintName = "LoggingDemo" + ReferencedContainer = "container:LoggingDemo.xcodeproj"> @@ -26,14 +27,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - codeCoverageEnabled = "YES" - shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - + shouldUseLaunchSchemeArgsEnv = "YES" + shouldAutocreateTestPlan = "YES"> - + allowLocationSimulation = "YES" + queueDebuggingEnableBacktraceRecording = "Yes"> + + BlueprintIdentifier = "A4D19E582D2042030044AA5E" + BuildableName = "LoggingDemo.app" + BlueprintName = "LoggingDemo" + ReferencedContainer = "container:LoggingDemo.xcodeproj"> - - - + - + + BlueprintIdentifier = "A4D19E582D2042030044AA5E" + BuildableName = "LoggingDemo.app" + BlueprintName = "LoggingDemo" + ReferencedContainer = "container:LoggingDemo.xcodeproj"> - + diff --git a/Example/LoggingDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Example/LoggingDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Example/LoggingDemo/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/LoggingDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/LoggingDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..ffdfe15 --- /dev/null +++ b/Example/LoggingDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,85 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/LoggingDemo/Resources/Assets.xcassets/Contents.json b/Example/LoggingDemo/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example/LoggingDemo/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/LoggingDemo/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/Example/LoggingDemo/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example/LoggingDemo/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/LoggingDemo/Sources/ContentView.swift b/Example/LoggingDemo/Sources/ContentView.swift new file mode 100644 index 0000000..220fe80 --- /dev/null +++ b/Example/LoggingDemo/Sources/ContentView.swift @@ -0,0 +1,25 @@ +// +// ContentView.swift +// LoggingDemo +// +// Created by WeiรŸ, Alexander on 28.12.24. +// + +import LoggingKit +import SwiftUI + +struct ContentView: View { + var body: some View { + Button("Log", systemImage: "envelope") { + LogService.verbose("Verbose", logCategory: \.view) + LogService.debug("Debug", logCategory: \.view) + LogService.info("Info", logCategory: \.view) + LogService.warning("Warning", logCategory: \.view) + LogService.error("Error", logCategory: \.view) + } + } +} + +#Preview { + ContentView() +} diff --git a/Example/LoggingDemo/Sources/Logging/LoggingCategories.swift b/Example/LoggingDemo/Sources/Logging/LoggingCategories.swift new file mode 100644 index 0000000..7a48f7b --- /dev/null +++ b/Example/LoggingDemo/Sources/Logging/LoggingCategories.swift @@ -0,0 +1,18 @@ +// +// LoggingCategories.swift +// LoggingDemo +// +// Created by Alexander WeiรŸ on 05.07.26. +// + +import LoggingKit + +extension LogCategories { + var view: LogCategory { + LogCategory("view") + } + + var appLifecycle: LogCategory { + LogCategory("app-lifecycle") + } +} diff --git a/Example/LoggingDemo/Sources/Logging/SampleLogProvider.swift b/Example/LoggingDemo/Sources/Logging/SampleLogProvider.swift new file mode 100644 index 0000000..1c390e5 --- /dev/null +++ b/Example/LoggingDemo/Sources/Logging/SampleLogProvider.swift @@ -0,0 +1,21 @@ +// +// SampleLogProvider.swift +// LoggingDemo +// +// Created by Alexander WeiรŸ on 05.07.26. +// + +import LoggingKit + +struct SampleLogProvider: LogProvider { + func log( + _ event: LogType, + _ message: @autoclosure () -> Any?, + logCategory _: KeyPath, + fileName _: StaticString = #file, + functionName _: StaticString = #function, + lineNumber _: Int = #line + ) { + print("\(event) > \(message() ?? "")") + } +} diff --git a/Example/LoggingDemo/Sources/LoggingDemoApp.swift b/Example/LoggingDemo/Sources/LoggingDemoApp.swift new file mode 100644 index 0000000..4ec87f2 --- /dev/null +++ b/Example/LoggingDemo/Sources/LoggingDemoApp.swift @@ -0,0 +1,66 @@ +// +// LoggingDemoApp.swift +// LoggingDemo +// +// Created by WeiรŸ, Alexander on 28.12.24. +// + +import LoggingKit +import SwiftUI + +#if canImport(AppKit) + import AppKit +#endif + +@main +struct LoggingDemoApp: App { + // MARK: - State Properties + #if os(macOS) + @NSApplicationDelegateAdaptor private var appDelegate: ApplicationDelegate + #endif + + #if os(iOS) || os(visionOS) + @UIApplicationDelegateAdaptor private var appDelegate: ApplicationDelegate + #endif + + #if os(watchOS) + @WKApplicationDelegateAdaptor private var appDelegate: ApplicationDelegate + #endif + + // MARK: - Body + var body: some Scene { + WindowGroup { + ContentView() + } + } +} + +#if os(macOS) + class ApplicationDelegate: NSObject, NSApplicationDelegate, ObservableObject { + func applicationDidFinishLaunching(_: Notification) { + LogService.register(logProviders: OSLogProvider(), SampleLogProvider()) + + LogService.info("Application did finish launching", logCategory: \.appLifecycle) + } + } +#endif + +#if os(watchOS) + class ApplicationDelegate: NSObject, WKApplicationDelegate, ObservableObject { + func applicationDidFinishLaunching(_: Notification) { + LogService.register(logProviders: OSLogProvider(), SampleLogProvider()) + + LogService.info("Application did finish launching", logCategory: \.appLifecycle) + } + } +#endif + +#if os(iOS) || os(visionOS) + class ApplicationDelegate: NSObject, UIApplicationDelegate, ObservableObject { + func applicationDidFinishLaunching(_: Notification) { + LogService.register(logProviders: OSLogProvider(), SampleLogProvider()) + + LogService.info("Application did finish launching", logCategory: \.appLifecycle) + } + } +#endif diff --git a/Example/LoggingDemo/SupportingFiles/Info.plist b/Example/LoggingDemo/SupportingFiles/Info.plist new file mode 100644 index 0000000..ecd98cd --- /dev/null +++ b/Example/LoggingDemo/SupportingFiles/Info.plist @@ -0,0 +1,13 @@ + + + + + UIAppFonts + + FuzzyBubbles-Bold.ttf + FuzzyBubbles-Regular.ttf + + ATSApplicationFontsPath + . + + diff --git a/Example/MyTestLogProvider.swift b/Example/MyTestLogProvider.swift deleted file mode 100644 index fcd0796..0000000 --- a/Example/MyTestLogProvider.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// MyTestLogProvider.swift -// Example -// -// Created by Alexander WeiรŸ on 13.06.20. -// Copyright ยฉ 2020 Alexander WeiรŸ. All rights reserved. -// - -import Foundation -import LoggingKit - -class MyTestLogProvider: LogProvider { - - static var dateFormatter: DateFormatter = { - let df = DateFormatter() - df.dateFormat = "yyyy-MM-dd HH:mm:ssSSS" - df.locale = Locale.current - df.timeZone = TimeZone.current - return df - }() - - - func log(_ event: LogType, _ message: @autoclosure () -> Any?, logCategory: KeyPath, fileName: StaticString, functionName: StaticString, lineNumber: Int) { - - guard let message = message() else { - return - } - - let category = LoggingCategories[logCategory] - let timeString = MyTestLogProvider.dateFormatter.string(from: Date()) - let fileString = "[\((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber)] \(functionName)" - - print("\(timeString) [\(event.rawValue)] - [\(category._key)] - \(fileString) > \(message)") - - } -} diff --git a/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 95bd1c4..0000000 --- a/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "pre-rendered" : true - } -} diff --git a/Example/Resources/Assets.xcassets/Contents.json b/Example/Resources/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/Example/Resources/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Example/Resources/Base.lproj/LaunchScreen.storyboard b/Example/Resources/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index bfa3612..0000000 --- a/Example/Resources/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Resources/Info.plist b/Example/Resources/Info.plist deleted file mode 100644 index c3a8ed8..0000000 --- a/Example/Resources/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - LoggingKit - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 2.0.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Example/ViewController.swift b/Example/ViewController.swift deleted file mode 100644 index 3bf4468..0000000 --- a/Example/ViewController.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// ViewController.swift -// Example -// -// Created by Alexander WeiรŸ on 25. Apr 2020. -// Copyright ยฉ 2020 LoggingKit. All rights reserved. -// - -import UIKit -import Combine -import LoggingKit - -// Helper error -enum NumberError: Error { - case numberTooHigh -} - -// MARK: - ViewController - -/// The ViewController -class ViewController: UIViewController { - - // MARK: Properties - private var sub: AnyCancellable? = nil - - /// The Label - lazy var label: UILabel = { - let label = UILabel() - label.text = "๐Ÿš€\nLoggingKit\nExample" - label.font = .systemFont(ofSize: 25, weight: .semibold) - label.numberOfLines = 0 - label.lineBreakMode = .byWordWrapping - label.textAlignment = .center - - return label - }() - - // MARK: View-Lifecycle - - /// View did load - override func viewDidLoad() { - super.viewDidLoad() - self.view.backgroundColor = .white - - // Traditional methods - LogService.shared.debug("Hello Debug", logCategory: \.viewControllers) - LogService.shared.verbose("Hello Verbose", logCategory: \.viewControllers) - LogService.shared.info("Hello Info", logCategory: \.viewControllers) - LogService.shared.warning("Hello Warning", logCategory: \.viewControllers) - LogService.shared.error("Hello Error", logCategory: \.viewControllers) - - - // Combine publishers - sub = Result.Publisher(5) - .logValue(logType: .info, logCategory: \.combine) { - "My Value is \($0)" - } - .tryMap { (number:Int) in - throw NumberError.numberTooHigh - } - .logError(logCategory: \.combine) { - "My Error is \($0)" - } - .sink(receiveCompletion: { _ in }, receiveValue: {_ in}) - } - - /// LoadView - override func loadView() { - self.view = self.label - } - -} diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 8cff5ba..0000000 --- a/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source 'https://rubygems.org' do - gem 'fastlane', "2.137.0" - gem 'cocoapods', "1.8.4" - gem 'jazzy' , "0.13.0" -end diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 99ba1be..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,239 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.2) - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) - algoliasearch (1.27.1) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - atomos (0.1.3) - babosa (1.0.3) - claide (1.0.3) - cocoapods (1.8.4) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.8.4) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.2.2, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.6.6) - nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.11.1, < 2.0) - cocoapods-core (1.8.4) - activesupport (>= 4.0.2, < 6) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.3.0) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.1.0) - cocoapods-trunk (1.4.1) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.2.0) - colored (1.2) - colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - concurrent-ruby (1.1.6) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.5.1) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.5) - emoji_regex (1.0.1) - escape (0.0.4) - excon (0.73.0) - faraday (0.17.3) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) - http-cookie (~> 1.0.0) - faraday_middleware (0.13.1) - faraday (>= 0.7.4, < 1.0) - fastimage (2.1.7) - fastlane (2.137.0) - CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) - babosa (>= 1.0.2, < 2.0.0) - bundler (>= 1.12.0, < 3.0.0) - colored - commander-fastlane (>= 4.4.6, < 5.0.0) - dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 2.0) - excon (>= 0.45.0, < 1.0.0) - faraday (~> 0.17) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.13.1) - fastimage (>= 2.1.0, < 3.0.0) - gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.21.2, < 0.24.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) - json (< 3.0.0) - jwt (~> 2.1.0) - mini_magick (>= 4.9.4, < 5.0.0) - multi_xml (~> 0.5) - multipart-post (~> 2.0.0) - plist (>= 3.1.0, < 4.0.0) - public_suffix (~> 2.0.0) - rubyzip (>= 1.3.0, < 2.0.0) - security (= 0.1.3) - simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) - terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) - tty-screen (>= 0.6.3, < 1.0.0) - tty-spinner (>= 0.8.0, < 1.0.0) - word_wrap (~> 1.0.0) - xcodeproj (>= 1.8.1, < 2.0.0) - xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) - ffi (1.12.2) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - google-api-client (0.23.9) - addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.5, < 0.7.0) - httpclient (>= 2.8.1, < 3.0) - mime-types (~> 3.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.9) - google-cloud-core (1.5.0) - google-cloud-env (~> 1.0) - google-cloud-errors (~> 1.0) - google-cloud-env (1.3.1) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.0.0) - google-cloud-storage (1.16.0) - digest-crc (~> 0.4) - google-api-client (~> 0.23) - google-cloud-core (~> 1.2) - googleauth (>= 0.6.2, < 0.10.0) - googleauth (0.6.7) - faraday (~> 0.12) - jwt (>= 1.4, < 3.0) - memoist (~> 0.16) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (~> 0.7) - highline (1.7.10) - http-cookie (1.0.3) - domain_name (~> 0.5) - httpclient (2.8.3) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jazzy (0.13.0) - cocoapods (~> 1.5) - mustache (~> 1.1) - open4 - redcarpet (~> 3.4) - rouge (>= 2.0.6, < 4.0) - sassc (~> 2.1) - sqlite3 (~> 1.3) - xcinvoke (~> 0.3.0) - json (2.3.0) - jwt (2.1.0) - liferaft (0.0.6) - memoist (0.16.2) - mime-types (3.3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2019.1009) - mini_magick (4.10.1) - minitest (5.14.0) - molinillo (0.6.6) - multi_json (1.14.1) - multi_xml (0.6.0) - multipart-post (2.0.0) - mustache (1.1.1) - nanaimo (0.2.6) - nap (1.1.0) - naturally (2.2.0) - netrc (0.11.0) - open4 (1.3.4) - os (1.1.0) - plist (3.5.0) - public_suffix (2.0.5) - redcarpet (3.5.0) - representable (3.0.4) - declarative (< 0.1.0) - declarative-option (< 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) - rouge (2.0.7) - ruby-macho (1.4.0) - rubyzip (1.3.0) - sassc (2.3.0) - ffi (~> 1.9) - security (0.1.3) - signet (0.14.0) - addressable (~> 2.3) - faraday (>= 0.17.3, < 2.0) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) - simctl (1.6.8) - CFPropertyList - naturally - slack-notifier (2.3.2) - sqlite3 (1.4.2) - terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - tty-cursor (0.7.1) - tty-screen (0.7.1) - tty-spinner (0.9.3) - tty-cursor (~> 0.7) - tzinfo (1.2.7) - thread_safe (~> 0.1) - uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - word_wrap (1.0.0) - xcinvoke (0.3.0) - liferaft (~> 0.0.6) - xcodeproj (1.16.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.2.6) - xcpretty (0.3.0) - rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) - xcpretty (~> 0.2, >= 0.0.7) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (= 1.8.4)! - fastlane (= 2.137.0)! - jazzy (= 0.13.0)! - -BUNDLED WITH - 2.0.2 diff --git a/LICENSE b/LICENSE index 46f0157..83ecfe8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2020 Alexander WeiรŸ +Copyright (c) 2020-2026 Alexander WeiรŸ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/LoggingKit.xcodeproj/project.pbxproj b/LoggingKit.xcodeproj/project.pbxproj deleted file mode 100644 index 816f5e8..0000000 --- a/LoggingKit.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1514 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 3D9C42F62274604A000A6585 /* LoggingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D9C429022745894000A6585 /* LoggingKit.framework */; }; - 3D9C42FC22746078000A6585 /* LoggingKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9C42D722745CDE000A6585 /* LoggingKitTests.swift */; }; - 3D9C43062274611B000A6585 /* LoggingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D9C42A92274599D000A6585 /* LoggingKit.framework */; }; - 3D9C430C22746131000A6585 /* LoggingKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9C42D722745CDE000A6585 /* LoggingKitTests.swift */; }; - 3D9C431C227461AF000A6585 /* LoggingKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9C42D722745CDE000A6585 /* LoggingKitTests.swift */; }; - 3D9C43242274629B000A6585 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9C43232274629B000A6585 /* AppDelegate.swift */; }; - 3D9C43262274629B000A6585 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D9C43252274629B000A6585 /* ViewController.swift */; }; - 3D9C432B2274629C000A6585 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3D9C432A2274629C000A6585 /* Assets.xcassets */; }; - 3D9C432E2274629C000A6585 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3D9C432C2274629C000A6585 /* LaunchScreen.storyboard */; }; - 3D9C433422746323000A6585 /* LoggingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D9C429022745894000A6585 /* LoggingKit.framework */; }; - 3D9C433522746323000A6585 /* LoggingKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3D9C429022745894000A6585 /* LoggingKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - C27A62F524950D5500115EDF /* LogService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EE24950D5400115EDF /* LogService.swift */; }; - C27A62F624950D5500115EDF /* LogCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EF24950D5500115EDF /* LogCategory.swift */; }; - C27A62F724950D5500115EDF /* Combine+LoggingKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */; }; - C27A62F824950D5500115EDF /* LogType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F224950D5500115EDF /* LogType.swift */; }; - C27A62F924950D5500115EDF /* OSLogProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F424950D5500115EDF /* OSLogProvider.swift */; }; - C27A62FC24950ECF00115EDF /* OSLogProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62FA24950ECB00115EDF /* OSLogProviderTests.swift */; }; - C27A62FD24950ECF00115EDF /* OSLogProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62FA24950ECB00115EDF /* OSLogProviderTests.swift */; }; - C27A62FE24950ED000115EDF /* OSLogProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62FA24950ECB00115EDF /* OSLogProviderTests.swift */; }; - C27A6300249514ED00115EDF /* LoggingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D9C42C522745A07000A6585 /* LoggingKit.framework */; }; - C27A63012495150E00115EDF /* LogCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EF24950D5500115EDF /* LogCategory.swift */; }; - C27A63022495150F00115EDF /* LogCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EF24950D5500115EDF /* LogCategory.swift */; }; - C27A63032495151000115EDF /* LogCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EF24950D5500115EDF /* LogCategory.swift */; }; - C27A63042495151200115EDF /* Combine+LoggingKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */; }; - C27A63052495151200115EDF /* Combine+LoggingKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */; }; - C27A63062495151300115EDF /* Combine+LoggingKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */; }; - C27A63072495151600115EDF /* LogService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EE24950D5400115EDF /* LogService.swift */; }; - C27A63082495151600115EDF /* LogService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EE24950D5400115EDF /* LogService.swift */; }; - C27A63092495151600115EDF /* LogService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62EE24950D5400115EDF /* LogService.swift */; }; - C27A630A2495151A00115EDF /* LogType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F224950D5500115EDF /* LogType.swift */; }; - C27A630B2495151A00115EDF /* LogType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F224950D5500115EDF /* LogType.swift */; }; - C27A630C2495151B00115EDF /* LogType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F224950D5500115EDF /* LogType.swift */; }; - C27A630D2495151E00115EDF /* OSLogProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F424950D5500115EDF /* OSLogProvider.swift */; }; - C27A630E2495151E00115EDF /* OSLogProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F424950D5500115EDF /* OSLogProvider.swift */; }; - C27A630F2495151E00115EDF /* OSLogProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A62F424950D5500115EDF /* OSLogProvider.swift */; }; - C27A631124954DC600115EDF /* MyTestLogProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C27A631024954DC600115EDF /* MyTestLogProvider.swift */; }; - C2818B9824542BA700F1C17D /* Logging+LogCategories.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2818B9724542BA700F1C17D /* Logging+LogCategories.swift */; }; - C2818BB224543BE100F1C17D /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = C2818BB124543BE100F1C17D /* .swiftlint.yml */; }; - C2818BB424543BEE00F1C17D /* Gemfile in Resources */ = {isa = PBXBuildFile; fileRef = C2818BB324543BEE00F1C17D /* Gemfile */; }; - C2818BB624543BFC00F1C17D /* main.yml in Resources */ = {isa = PBXBuildFile; fileRef = C2818BB524543BFC00F1C17D /* main.yml */; }; - C2818BBA24543C1100F1C17D /* .jazzy.yaml in Resources */ = {isa = PBXBuildFile; fileRef = C2818BB924543C1100F1C17D /* .jazzy.yaml */; }; - C2818BBC24543C2A00F1C17D /* Fastfile in Resources */ = {isa = PBXBuildFile; fileRef = C2818BBB24543C2A00F1C17D /* Fastfile */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3D9C42F72274604A000A6585 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3D9C428722745894000A6585 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3D9C428F22745894000A6585; - remoteInfo = "LoggingKit-iOS"; - }; - 3D9C43072274611B000A6585 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3D9C428722745894000A6585 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3D9C42A82274599D000A6585; - remoteInfo = "LoggingKit-tvOS"; - }; - 3D9C431722746198000A6585 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3D9C428722745894000A6585 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3D9C42C422745A07000A6585; - remoteInfo = "LoggingKit-macOS"; - }; - 3D9C433622746323000A6585 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3D9C428722745894000A6585 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3D9C428F22745894000A6585; - remoteInfo = "LoggingKit-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 3D9C433822746323000A6585 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3D9C433522746323000A6585 /* LoggingKit.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3D9C429022745894000A6585 /* LoggingKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoggingKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C429C227458E8000A6585 /* LoggingKit.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = LoggingKit.plist; sourceTree = ""; }; - 3D9C429D227458E8000A6585 /* LoggingKitTests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = LoggingKitTests.plist; sourceTree = ""; }; - 3D9C42A92274599D000A6585 /* LoggingKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoggingKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C42B7227459D6000A6585 /* LoggingKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoggingKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C42C522745A07000A6585 /* LoggingKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LoggingKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C42D222745B48000A6585 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; }; - 3D9C42D522745B48000A6585 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; - 3D9C42D722745CDE000A6585 /* LoggingKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingKitTests.swift; sourceTree = ""; }; - 3D9C42DB22745DB0000A6585 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = SOURCE_ROOT; }; - 3D9C42EC22745FDA000A6585 /* LinuxMain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinuxMain.swift; sourceTree = ""; }; - 3D9C42F12274604A000A6585 /* LoggingKit-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "LoggingKit-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C43012274611B000A6585 /* LoggingKit-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "LoggingKit-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C431122746198000A6585 /* LoggingKit-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "LoggingKit-macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C43212274629B000A6585 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D9C43232274629B000A6585 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 3D9C43252274629B000A6585 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 3D9C432A2274629C000A6585 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 3D9C432D2274629C000A6585 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 3D9C432F2274629C000A6585 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C27A62EE24950D5400115EDF /* LogService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogService.swift; sourceTree = ""; }; - C27A62EF24950D5500115EDF /* LogCategory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogCategory.swift; sourceTree = ""; }; - C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Combine+LoggingKit.swift"; sourceTree = ""; }; - C27A62F224950D5500115EDF /* LogType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogType.swift; sourceTree = ""; }; - C27A62F424950D5500115EDF /* OSLogProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLogProvider.swift; sourceTree = ""; }; - C27A62FA24950ECB00115EDF /* OSLogProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSLogProviderTests.swift; sourceTree = ""; }; - C27A631024954DC600115EDF /* MyTestLogProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyTestLogProvider.swift; sourceTree = ""; }; - C2818B9724542BA700F1C17D /* Logging+LogCategories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logging+LogCategories.swift"; sourceTree = ""; }; - C2818BA524543AB600F1C17D /* Mintfile */ = {isa = PBXFileReference; lastKnownFileType = text; name = Mintfile; path = "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Mintfile"; sourceTree = ""; }; - C2818BB124543BE100F1C17D /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = SOURCE_ROOT; }; - C2818BB324543BEE00F1C17D /* Gemfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Gemfile; sourceTree = SOURCE_ROOT; }; - C2818BB524543BFC00F1C17D /* main.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; name = main.yml; path = .github/workflows/main.yml; sourceTree = SOURCE_ROOT; }; - C2818BB724543C0900F1C17D /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = SOURCE_ROOT; }; - C2818BB924543C1100F1C17D /* .jazzy.yaml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .jazzy.yaml; sourceTree = SOURCE_ROOT; }; - C2818BBB24543C2A00F1C17D /* Fastfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Fastfile; path = fastlane/Fastfile; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3D9C428D22745894000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42A62274599D000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42B4227459D6000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42C222745A07000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42EE2274604A000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C42F62274604A000A6585 /* LoggingKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42FE2274611B000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C43062274611B000A6585 /* LoggingKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C430E22746198000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - C27A6300249514ED00115EDF /* LoggingKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C431E2274629B000A6585 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C433422746323000A6585 /* LoggingKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3D9C428622745894000A6585 = { - isa = PBXGroup; - children = ( - 3D9C42A0227458FA000A6585 /* Sources */, - 3D9C42A32274595F000A6585 /* Tests */, - 3D9C43222274629B000A6585 /* Example */, - 3D9C429B227458E8000A6585 /* Configs */, - 3D9C429122745894000A6585 /* Products */, - 3D9C42D222745B48000A6585 /* LICENSE */, - 3D9C42D522745B48000A6585 /* README.md */, - 3D9C42DB22745DB0000A6585 /* .gitignore */, - C27A62FF249514ED00115EDF /* Frameworks */, - ); - sourceTree = ""; - }; - 3D9C429122745894000A6585 /* Products */ = { - isa = PBXGroup; - children = ( - 3D9C429022745894000A6585 /* LoggingKit.framework */, - 3D9C42A92274599D000A6585 /* LoggingKit.framework */, - 3D9C42B7227459D6000A6585 /* LoggingKit.framework */, - 3D9C42C522745A07000A6585 /* LoggingKit.framework */, - 3D9C42F12274604A000A6585 /* LoggingKit-iOSTests.xctest */, - 3D9C43012274611B000A6585 /* LoggingKit-tvOSTests.xctest */, - 3D9C431122746198000A6585 /* LoggingKit-macOSTests.xctest */, - 3D9C43212274629B000A6585 /* Example.app */, - ); - name = Products; - sourceTree = ""; - }; - 3D9C429B227458E8000A6585 /* Configs */ = { - isa = PBXGroup; - children = ( - 3D9C429C227458E8000A6585 /* LoggingKit.plist */, - 3D9C429D227458E8000A6585 /* LoggingKitTests.plist */, - C2818BAF24543B5300F1C17D /* Mint */, - C2818BAE24543B3A00F1C17D /* swiftlint */, - C2818BAD24543B2A00F1C17D /* gems */, - C2818BAC24543B1100F1C17D /* ci */, - C2818BB024543B6D00F1C17D /* SPM */, - C2818BA924543AED00F1C17D /* jazzy */, - C2818BA724543ADE00F1C17D /* fastlane */, - ); - path = Configs; - sourceTree = ""; - }; - 3D9C42A0227458FA000A6585 /* Sources */ = { - isa = PBXGroup; - children = ( - C27A62F024950D5500115EDF /* Combine */, - C27A62EF24950D5500115EDF /* LogCategory.swift */, - C27A62EE24950D5400115EDF /* LogService.swift */, - C27A62F224950D5500115EDF /* LogType.swift */, - C27A62F324950D5500115EDF /* Providers */, - ); - path = Sources; - sourceTree = ""; - }; - 3D9C42A32274595F000A6585 /* Tests */ = { - isa = PBXGroup; - children = ( - 3D9C42EC22745FDA000A6585 /* LinuxMain.swift */, - 3D9C42D722745CDE000A6585 /* LoggingKitTests.swift */, - C27A62FA24950ECB00115EDF /* OSLogProviderTests.swift */, - ); - path = Tests; - sourceTree = ""; - }; - 3D9C43222274629B000A6585 /* Example */ = { - isa = PBXGroup; - children = ( - 3D9C43232274629B000A6585 /* AppDelegate.swift */, - 3D9C43252274629B000A6585 /* ViewController.swift */, - C2818B9724542BA700F1C17D /* Logging+LogCategories.swift */, - 3D9C4333227462B9000A6585 /* Resources */, - C27A631024954DC600115EDF /* MyTestLogProvider.swift */, - ); - path = Example; - sourceTree = ""; - }; - 3D9C4333227462B9000A6585 /* Resources */ = { - isa = PBXGroup; - children = ( - 3D9C432A2274629C000A6585 /* Assets.xcassets */, - 3D9C432C2274629C000A6585 /* LaunchScreen.storyboard */, - 3D9C432F2274629C000A6585 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - C27A62F024950D5500115EDF /* Combine */ = { - isa = PBXGroup; - children = ( - C27A62F124950D5500115EDF /* Combine+LoggingKit.swift */, - ); - path = Combine; - sourceTree = ""; - }; - C27A62F324950D5500115EDF /* Providers */ = { - isa = PBXGroup; - children = ( - C27A62F424950D5500115EDF /* OSLogProvider.swift */, - ); - path = Providers; - sourceTree = ""; - }; - C27A62FF249514ED00115EDF /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - C2818BA724543ADE00F1C17D /* fastlane */ = { - isa = PBXGroup; - children = ( - C2818BBB24543C2A00F1C17D /* Fastfile */, - ); - name = fastlane; - sourceTree = ""; - }; - C2818BA924543AED00F1C17D /* jazzy */ = { - isa = PBXGroup; - children = ( - C2818BB924543C1100F1C17D /* .jazzy.yaml */, - ); - name = jazzy; - sourceTree = ""; - }; - C2818BAC24543B1100F1C17D /* ci */ = { - isa = PBXGroup; - children = ( - C2818BB524543BFC00F1C17D /* main.yml */, - ); - name = ci; - sourceTree = ""; - }; - C2818BAD24543B2A00F1C17D /* gems */ = { - isa = PBXGroup; - children = ( - C2818BB324543BEE00F1C17D /* Gemfile */, - ); - name = gems; - sourceTree = ""; - }; - C2818BAE24543B3A00F1C17D /* swiftlint */ = { - isa = PBXGroup; - children = ( - C2818BB124543BE100F1C17D /* .swiftlint.yml */, - ); - name = swiftlint; - sourceTree = ""; - }; - C2818BAF24543B5300F1C17D /* Mint */ = { - isa = PBXGroup; - children = ( - C2818BA524543AB600F1C17D /* Mintfile */, - ); - name = Mint; - sourceTree = ""; - }; - C2818BB024543B6D00F1C17D /* SPM */ = { - isa = PBXGroup; - children = ( - C2818BB724543C0900F1C17D /* Package.swift */, - ); - name = SPM; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 3D9C428B22745894000A6585 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42A42274599D000A6585 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42B2227459D6000A6585 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42C022745A07000A6585 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 3D9C428F22745894000A6585 /* LoggingKit-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C429822745894000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-iOS" */; - buildPhases = ( - 3D9C428B22745894000A6585 /* Headers */, - 3D9C428C22745894000A6585 /* Sources */, - 3D9C428D22745894000A6585 /* Frameworks */, - 3D9C428E22745894000A6585 /* Resources */, - C2818BBD245443FE00F1C17D /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "LoggingKit-iOS"; - productName = LoggingKit; - productReference = 3D9C429022745894000A6585 /* LoggingKit.framework */; - productType = "com.apple.product-type.framework"; - }; - 3D9C42A82274599D000A6585 /* LoggingKit-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C42AE2274599D000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-tvOS" */; - buildPhases = ( - 3D9C42A42274599D000A6585 /* Headers */, - 3D9C42A52274599D000A6585 /* Sources */, - 3D9C42A62274599D000A6585 /* Frameworks */, - 3D9C42A72274599D000A6585 /* Resources */, - C2818BBE2454449400F1C17D /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "LoggingKit-tvOS"; - productName = "LoggingKit-tvOS"; - productReference = 3D9C42A92274599D000A6585 /* LoggingKit.framework */; - productType = "com.apple.product-type.framework"; - }; - 3D9C42B6227459D6000A6585 /* LoggingKit-watchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C42BC227459D6000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-watchOS" */; - buildPhases = ( - 3D9C42B2227459D6000A6585 /* Headers */, - 3D9C42B3227459D6000A6585 /* Sources */, - 3D9C42B4227459D6000A6585 /* Frameworks */, - 3D9C42B5227459D6000A6585 /* Resources */, - C2818BBF2454449E00F1C17D /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "LoggingKit-watchOS"; - productName = "LoggingKit-watchOS"; - productReference = 3D9C42B7227459D6000A6585 /* LoggingKit.framework */; - productType = "com.apple.product-type.framework"; - }; - 3D9C42C422745A07000A6585 /* LoggingKit-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C42CA22745A07000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-macOS" */; - buildPhases = ( - 3D9C42C022745A07000A6585 /* Headers */, - 3D9C42C122745A07000A6585 /* Sources */, - 3D9C42C222745A07000A6585 /* Frameworks */, - 3D9C42C322745A07000A6585 /* Resources */, - C2818BC0245444A700F1C17D /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "LoggingKit-macOS"; - productName = "LoggingKit-macOS"; - productReference = 3D9C42C522745A07000A6585 /* LoggingKit.framework */; - productType = "com.apple.product-type.framework"; - }; - 3D9C42F02274604A000A6585 /* LoggingKit-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C42F92274604A000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-iOSTests" */; - buildPhases = ( - 3D9C42ED2274604A000A6585 /* Sources */, - 3D9C42EE2274604A000A6585 /* Frameworks */, - 3D9C42EF2274604A000A6585 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3D9C42F82274604A000A6585 /* PBXTargetDependency */, - ); - name = "LoggingKit-iOSTests"; - productName = "LoggingKit-iOSTests"; - productReference = 3D9C42F12274604A000A6585 /* LoggingKit-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 3D9C43002274611B000A6585 /* LoggingKit-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C43092274611B000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-tvOSTests" */; - buildPhases = ( - 3D9C42FD2274611B000A6585 /* Sources */, - 3D9C42FE2274611B000A6585 /* Frameworks */, - 3D9C42FF2274611B000A6585 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3D9C43082274611B000A6585 /* PBXTargetDependency */, - ); - name = "LoggingKit-tvOSTests"; - productName = "LoggingKit-tvOSTests"; - productReference = 3D9C43012274611B000A6585 /* LoggingKit-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 3D9C431022746198000A6585 /* LoggingKit-macOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C431922746198000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-macOSTests" */; - buildPhases = ( - 3D9C430D22746198000A6585 /* Sources */, - 3D9C430E22746198000A6585 /* Frameworks */, - 3D9C430F22746198000A6585 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3D9C431822746198000A6585 /* PBXTargetDependency */, - ); - name = "LoggingKit-macOSTests"; - productName = "LoggingKit-macOSTests"; - productReference = 3D9C431122746198000A6585 /* LoggingKit-macOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 3D9C43202274629B000A6585 /* Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D9C43302274629C000A6585 /* Build configuration list for PBXNativeTarget "Example" */; - buildPhases = ( - 3D9C431D2274629B000A6585 /* Sources */, - 3D9C431E2274629B000A6585 /* Frameworks */, - 3D9C431F2274629B000A6585 /* Resources */, - 3D9C433822746323000A6585 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 3D9C433722746323000A6585 /* PBXTargetDependency */, - ); - name = Example; - productName = Example; - productReference = 3D9C43212274629B000A6585 /* Example.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3D9C428722745894000A6585 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "Alexander WeiรŸ"; - TargetAttributes = { - 3D9C428F22745894000A6585 = { - CreatedOnToolsVersion = 10.2.1; - LastSwiftMigration = 1150; - }; - 3D9C42A82274599D000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C42B6227459D6000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C42C422745A07000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C42F02274604A000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C43002274611B000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C431022746198000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - 3D9C43202274629B000A6585 = { - CreatedOnToolsVersion = 10.2.1; - }; - }; - }; - buildConfigurationList = 3D9C428A22745894000A6585 /* Build configuration list for PBXProject "LoggingKit" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 3D9C428622745894000A6585; - productRefGroup = 3D9C429122745894000A6585 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 3D9C428F22745894000A6585 /* LoggingKit-iOS */, - 3D9C42A82274599D000A6585 /* LoggingKit-tvOS */, - 3D9C42B6227459D6000A6585 /* LoggingKit-watchOS */, - 3D9C42C422745A07000A6585 /* LoggingKit-macOS */, - 3D9C42F02274604A000A6585 /* LoggingKit-iOSTests */, - 3D9C43002274611B000A6585 /* LoggingKit-tvOSTests */, - 3D9C431022746198000A6585 /* LoggingKit-macOSTests */, - 3D9C43202274629B000A6585 /* Example */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 3D9C428E22745894000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C2818BBC24543C2A00F1C17D /* Fastfile in Resources */, - C2818BB424543BEE00F1C17D /* Gemfile in Resources */, - C2818BB224543BE100F1C17D /* .swiftlint.yml in Resources */, - C2818BBA24543C1100F1C17D /* .jazzy.yaml in Resources */, - C2818BB624543BFC00F1C17D /* main.yml in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42A72274599D000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42B5227459D6000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42C322745A07000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42EF2274604A000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42FF2274611B000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C430F22746198000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C431F2274629B000A6585 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C432E2274629C000A6585 /* LaunchScreen.storyboard in Resources */, - 3D9C432B2274629C000A6585 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - C2818BBD245443FE00F1C17D /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which mint >/dev/null; then\nmint run swiftlint\nelse\necho \"warning: Mint not installed, download from https://github.com/yonaskolb/Mint\"\nfi\n"; - }; - C2818BBE2454449400F1C17D /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which mint >/dev/null; then\nmint run swiftlint\nelse\necho \"warning: Mint not installed, download from https://github.com/yonaskolb/Mint\"\nfi\n"; - }; - C2818BBF2454449E00F1C17D /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which mint >/dev/null; then\nmint run swiftlint\nelse\necho \"warning: Mint not installed, download from https://github.com/yonaskolb/Mint\"\nfi\n"; - }; - C2818BC0245444A700F1C17D /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which mint >/dev/null; then\nmint run swiftlint\nelse\necho \"warning: Mint not installed, download from https://github.com/yonaskolb/Mint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3D9C428C22745894000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C27A62F824950D5500115EDF /* LogType.swift in Sources */, - C27A62F624950D5500115EDF /* LogCategory.swift in Sources */, - C27A62F724950D5500115EDF /* Combine+LoggingKit.swift in Sources */, - C27A62F524950D5500115EDF /* LogService.swift in Sources */, - C27A62F924950D5500115EDF /* OSLogProvider.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42A52274599D000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C27A630A2495151A00115EDF /* LogType.swift in Sources */, - C27A63042495151200115EDF /* Combine+LoggingKit.swift in Sources */, - C27A63072495151600115EDF /* LogService.swift in Sources */, - C27A63012495150E00115EDF /* LogCategory.swift in Sources */, - C27A630D2495151E00115EDF /* OSLogProvider.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42B3227459D6000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C27A630B2495151A00115EDF /* LogType.swift in Sources */, - C27A63052495151200115EDF /* Combine+LoggingKit.swift in Sources */, - C27A63082495151600115EDF /* LogService.swift in Sources */, - C27A63022495150F00115EDF /* LogCategory.swift in Sources */, - C27A630E2495151E00115EDF /* OSLogProvider.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42C122745A07000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C27A630C2495151B00115EDF /* LogType.swift in Sources */, - C27A63062495151300115EDF /* Combine+LoggingKit.swift in Sources */, - C27A63092495151600115EDF /* LogService.swift in Sources */, - C27A63032495151000115EDF /* LogCategory.swift in Sources */, - C27A630F2495151E00115EDF /* OSLogProvider.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42ED2274604A000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C42FC22746078000A6585 /* LoggingKitTests.swift in Sources */, - C27A62FC24950ECF00115EDF /* OSLogProviderTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C42FD2274611B000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C430C22746131000A6585 /* LoggingKitTests.swift in Sources */, - C27A62FD24950ECF00115EDF /* OSLogProviderTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C430D22746198000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C431C227461AF000A6585 /* LoggingKitTests.swift in Sources */, - C27A62FE24950ED000115EDF /* OSLogProviderTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3D9C431D2274629B000A6585 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9C43262274629B000A6585 /* ViewController.swift in Sources */, - C27A631124954DC600115EDF /* MyTestLogProvider.swift in Sources */, - 3D9C43242274629B000A6585 /* AppDelegate.swift in Sources */, - C2818B9824542BA700F1C17D /* Logging+LogCategories.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3D9C42F82274604A000A6585 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3D9C428F22745894000A6585 /* LoggingKit-iOS */; - targetProxy = 3D9C42F72274604A000A6585 /* PBXContainerItemProxy */; - }; - 3D9C43082274611B000A6585 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3D9C42A82274599D000A6585 /* LoggingKit-tvOS */; - targetProxy = 3D9C43072274611B000A6585 /* PBXContainerItemProxy */; - }; - 3D9C431822746198000A6585 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3D9C42C422745A07000A6585 /* LoggingKit-macOS */; - targetProxy = 3D9C431722746198000A6585 /* PBXContainerItemProxy */; - }; - 3D9C433722746323000A6585 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3D9C428F22745894000A6585 /* LoggingKit-iOS */; - targetProxy = 3D9C433622746323000A6585 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 3D9C432C2274629C000A6585 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 3D9C432D2274629C000A6585 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3D9C429622745894000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 3D9C429722745894000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 3D9C429922745894000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-iOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 3D9C429A22745894000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-iOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 3D9C42AF2274599D000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-tvOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 10.0; - }; - name = Debug; - }; - 3D9C42B02274599D000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-tvOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 10.0; - }; - name = Release; - }; - 3D9C42BD227459D6000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-watchOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Debug; - }; - 3D9C42BE227459D6000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-watchOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Release; - }; - 3D9C42CB22745A07000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Manual; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-macOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 3D9C42CC22745A07000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Manual; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = Configs/LoggingKit.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.LoggingKit-macOS"; - PRODUCT_NAME = LoggingKit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 3D9C42FA2274604A000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 10.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Debug; - }; - 3D9C42FB2274604A000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 10.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Release; - }; - 3D9C430A2274611B000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Debug; - }; - 3D9C430B2274611B000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Release; - }; - 3D9C431A22746198000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-macOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 10.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Debug; - }; - 3D9C431B22746198000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Configs/LoggingKitTests.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit.LoggingKit-macOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 10.0; - WATCHOS_DEPLOYMENT_TARGET = 3.0; - }; - name = Release; - }; - 3D9C43312274629C000A6585 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = Example/Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit-iOS.Example"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 3D9C43322274629C000A6585 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = Example/Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "dev.teabyte.loggingkit-iOS.Example"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3D9C428A22745894000A6585 /* Build configuration list for PBXProject "LoggingKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C429622745894000A6585 /* Debug */, - 3D9C429722745894000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C429822745894000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C429922745894000A6585 /* Debug */, - 3D9C429A22745894000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C42AE2274599D000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C42AF2274599D000A6585 /* Debug */, - 3D9C42B02274599D000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C42BC227459D6000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-watchOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C42BD227459D6000A6585 /* Debug */, - 3D9C42BE227459D6000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C42CA22745A07000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C42CB22745A07000A6585 /* Debug */, - 3D9C42CC22745A07000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C42F92274604A000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C42FA2274604A000A6585 /* Debug */, - 3D9C42FB2274604A000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C43092274611B000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C430A2274611B000A6585 /* Debug */, - 3D9C430B2274611B000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C431922746198000A6585 /* Build configuration list for PBXNativeTarget "LoggingKit-macOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C431A22746198000A6585 /* Debug */, - 3D9C431B22746198000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3D9C43302274629C000A6585 /* Build configuration list for PBXNativeTarget "Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D9C43312274629C000A6585 /* Debug */, - 3D9C43322274629C000A6585 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3D9C428722745894000A6585 /* Project object */; -} diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOS.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOS.xcscheme deleted file mode 100644 index c96583f..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOS.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOSTests.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOSTests.xcscheme deleted file mode 100644 index 6cb4833..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-iOSTests.xcscheme +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOS.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOS.xcscheme deleted file mode 100644 index 8899c90..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOS.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOSTests.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOSTests.xcscheme deleted file mode 100644 index 0bb0230..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-macOSTests.xcscheme +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOS.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOS.xcscheme deleted file mode 100644 index dfa6f8c..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOS.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOSTests.xcscheme b/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOSTests.xcscheme deleted file mode 100644 index 64387dd..0000000 --- a/LoggingKit.xcodeproj/xcshareddata/xcschemes/LoggingKit-tvOSTests.xcscheme +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Mintfile b/Mintfile deleted file mode 100644 index b979d68..0000000 --- a/Mintfile +++ /dev/null @@ -1 +0,0 @@ -realm/SwiftLint@0.35.0 diff --git a/Package.swift b/Package.swift index cbdf886..4914038 100644 --- a/Package.swift +++ b/Package.swift @@ -1,32 +1,44 @@ -// swift-tools-version:5.0 +// swift-tools-version:6.0 import PackageDescription let package = Package( name: "LoggingKit", platforms: [ - .iOS(.v10), - .tvOS(.v10), - .watchOS(.v3), - .macOS(.v10_12) + .iOS(.v18), + .tvOS(.v18), + .watchOS(.v11), + .macOS(.v15), ], products: [ .library( name: "LoggingKit", targets: ["LoggingKit"] - ), + ) ], dependencies: [], targets: [ .target( name: "LoggingKit", - dependencies: [], - path: "Sources" + resources: [ + .process("Resources/PrivacyInfo.xcprivacy") + ] ), .testTarget( name: "LoggingKitTests", dependencies: ["LoggingKit"], - path: "Tests" ), ] ) + +for target in package.targets { + target.swiftSettings = target.swiftSettings ?? [] + target.swiftSettings?.append(contentsOf: [ + .enableUpcomingFeature("ExistentialAny"), + .enableUpcomingFeature("ImmutableWeakCaptures"), + .enableUpcomingFeature("InferIsolatedConformances"), + .enableUpcomingFeature("InternalImportsByDefault"), + .enableUpcomingFeature("MemberImportVisibility"), + .enableUpcomingFeature("NonisolatedNonsendingByDefault"), + ]) +} diff --git a/README.md b/README.md index fbee96d..5132fe6 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,11 @@

- Swift 5.0 + Swift 6.0 SPM - - - CI -

@@ -29,9 +25,9 @@ LoggingKit is a micro framework for logging based on log providers ## Example -The example application is the best way to see `LoggingKit` in action. Simply open the `LoggingKit.xcodeproj` and run the `Example` scheme. +The example application is the best way to see `LoggingKit` in action. Open `Example/LoggingDemo` in Xcode and run the app. -After the application has started you should see several log messages in your Xcode terminal and the `Console.app` for the device you ran the app on. +After the application has started you should see several log messages in your Xcode console and the `Console.app` for the device you ran the app on. ## Installation @@ -41,98 +37,115 @@ To integrate using Apple's [Swift Package Manager](https://swift.org/package-man ```swift dependencies: [ - .package(url: "https://github.com/alexanderwe/LoggingKit.git", from: "2.0.0") + .package(url: "https://github.com/alexanderwe/LoggingKit.git", from: "3.0.0") ] ``` -Alternatively navigate to your Xcode project, select `Swift Packages` and click the `+` icon to search for `LoggingKit`. - -### Manually - -If you prefer not to use any of the aforementioned dependency managers, you can integrate LoggingKit into your project manually. Simply drag the `Sources` Folder into your Xcode project. +Alternatively navigate to your Xcode project, select `Package Dependencies` and click the `+` icon to search for `LoggingKit`. ## Usage -At first it makes sense to create an extensions on `LogCategories` to define your own categories. +### Define log categories + +Extend `LogCategories` to declare the categories for your app: ```swift import LoggingKit extension LogCategories { - public var viewControllers: LogCategory { return .init("viewControllers") } - public var networking: LogCategory { return .init("networking") } - ... + var viewControllers: LogCategory { .init("viewControllers") } + var networking: LogCategory { .init("networking") } } ``` -Then register your log providers in the `application(application:didFinishLaunchingWithOptions:)`. +### Register log providers + +Register one or more log providers at app startup: ```swift import LoggingKit -class AppDelegate: UIResponder, UIApplicationDelegate { - - ... - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - LogService.register(logProviders: LogProvider, LogProvider ...) - +@main +struct MyApp: App { + init() { + LogService.register(logProviders: OSLogProvider()) } - ... + var body: some Scene { + WindowGroup { + ContentView() + } + } } ``` -After that Simply import `LoggingKit` in the files you want to use the logging methods and use them accordingly +### Log messages ```swift import LoggingKit -LogService.shared.debug("Hello Debug", logCategory: \.viewControllers) -LogService.shared.verbose("Hello Verbose", logCategory: \.viewControllers) -LogService.shared.info("Hello Info", logCategory: \.viewControllers) -LogService.shared.warning("Hello Warning", logCategory: \.viewControllers) -LogService.shared.error("Hello Error", logCategory: \.viewControllers) - +LogService.debug("Hello Debug", logCategory: \.viewControllers) +LogService.verbose("Hello Verbose", logCategory: \.viewControllers) +LogService.info("Hello Info", logCategory: \.viewControllers) +LogService.warning("Hello Warning", logCategory: \.viewControllers) +LogService.error("Hello Error", logCategory: \.viewControllers) ``` ### Combine -If you are using combine, `LoggingKit` offers some extensions on the `Publisher` type to log `Self.Output` and `Self.Failure`. - -You can choose whichever category you want. The `\.combine` category is a custom defined one. +LoggingKit offers extensions on `Publisher` to log output and failure values inline: ```swift import LoggingKit -// logs `Self.Output` -myPublisher.logValue(logType: .info, logCategory: \.combine) { +// logs Self.Output +myPublisher.logValue(logType: .info, logCategory: \.networking) { "My Value is \($0)" } -// logs `Self.Failure` -myPublisher.logError(logCategory: \.combine) { +// logs Self.Failure +myPublisher.logError(logCategory: \.networking) { "My Error is \($0)" } -// logs `Self.Output` as well as `Self.Failure` +// logs both Self.Output and Self.Failure myPublisher.log() ``` -### Providers +### Custom providers + +Conform to `LogProvider` to route logs to any backend: + +```swift +import LoggingKit -The idea behind this small framework is, that you can extend it by writing your own log providers by conforming to the `LogProvider` protocol. These implementations then can be registered in the `LogService.register(providers:)` method. +struct MyCustomProvider: LogProvider { + func log( + _ event: LogType, + _ message: @autoclosure () -> Any?, + logCategory: KeyPath, + fileName: StaticString, + functionName: StaticString, + lineNumber: Int + ) { + guard let value = message() else { return } + // Forward to your backend + print("[\(event)] \(value)") + } +} +``` -You can find an example `LogProvider` implementation in [./Example/MyTestLogProvider.swift](./Example/MyTestLogProvider.swift) +Register it alongside the built-in provider: -#### OSLogProvider +```swift +LogService.register(logProviders: OSLogProvider(), MyCustomProvider()) +``` -LoggingKit comes with one pre-defined `OSLogProvider` . It uses `os_log` under the hood to log your messages. These messages can then be viewed in the `Console.app` application of your mac and on the console in Xcode. +### OSLogProvider -##### Console App +LoggingKit ships with `OSLogProvider`, which uses `os_log` under the hood. Messages appear in the `Console.app` on your Mac and in the Xcode console. -Open `Console.App` on your mac, select the device from which you want to view the log messages, to view the messages printed by the `OSLogProvider` +Open `Console.App`, select the target device, and filter by subsystem or category to view the messages printed by `OSLogProvider`. ![Console App Screenshot](./assets/console_screenshot.png) diff --git a/Sources/Documentation.docc/Articles/GettingStarted.md b/Sources/Documentation.docc/Articles/GettingStarted.md new file mode 100644 index 0000000..9b78334 --- /dev/null +++ b/Sources/Documentation.docc/Articles/GettingStarted.md @@ -0,0 +1,88 @@ +# Getting Started + +Learn how to integrate LoggingKit into your project. + +## Adding LoggingKit as a dependency + +```swift +let package = Package( + dependencies: [ + .package( + url: "https://github.com/alexanderwe/LoggingKit", + from: "3.0.0" + ), + ], + targets: [ + .target( + name: "", + dependencies: [ + .product( + name: "LoggingKit", + package: "LoggingKit" + ) + ] + ) + ] +) +``` + +## Define log categories + +Extend ``LogCategories`` to declare the log categories for your app: + +```swift +import LoggingKit + +extension LogCategories { + var networking: LogCategory { LogCategory("networking") } + var ui: LogCategory { LogCategory("ui") } +} +``` + +## Register a log provider + +Register one or more ``LogProvider`` instances at app startup. LoggingKit ships with ``OSLogProvider`` out of the box: + +```swift +import LoggingKit + +@main +struct MyApp: App { + init() { + LogService.register(logProviders: OSLogProvider()) + } +} +``` + +## Log messages + +Use ``LogService`` to emit categorized log messages: + +```swift +LogService.info("App launched", logCategory: \.default) +LogService.debug("Fetching data", logCategory: \.networking) +LogService.error("Request failed", logCategory: \.networking) +``` + +## Implement a custom log provider + +Conform to ``LogProvider`` to route logs to any backend (e.g. Crashlytics, a remote logging service): + +```swift +import LoggingKit + +struct MyCustomProvider: LogProvider { + func log( + _ event: LogType, + _ message: @autoclosure () -> Any?, + logCategory: KeyPath, + fileName: StaticString, + functionName: StaticString, + lineNumber: Int + ) { + guard let value = message() else { return } + // Forward to your backend + print("[\(event)] \(value)") + } +} +``` diff --git a/Sources/Documentation.docc/Frameworks/LoggingKit.md b/Sources/Documentation.docc/Frameworks/LoggingKit.md new file mode 100644 index 0000000..2d78fb4 --- /dev/null +++ b/Sources/Documentation.docc/Frameworks/LoggingKit.md @@ -0,0 +1 @@ +# ``LoggingKit`` diff --git a/Sources/Documentation.docc/Info.plist b/Sources/Documentation.docc/Info.plist new file mode 100644 index 0000000..f05dac0 --- /dev/null +++ b/Sources/Documentation.docc/Info.plist @@ -0,0 +1,42 @@ + + + + + CDAppleDefaultAvailability + + LoggingKit + + + name + watchOS + version + 11.0 + + + name + iOS + version + 18.0 + + + name + visionOS + version + 2.0 + + + name + tvOS + version + 18.0 + + + name + macOS + version + 15.0 + + + + + diff --git a/Sources/Documentation.docc/Overview.md b/Sources/Documentation.docc/Overview.md new file mode 100644 index 0000000..dd095f6 --- /dev/null +++ b/Sources/Documentation.docc/Overview.md @@ -0,0 +1,19 @@ +# LoggingKit Documentation + +@Metadata { + @TechnologyRoot +} + +## Overview + +LoggingKit is a lightweight, extensible logging framework for Apple platforms. It routes log messages through one or more ``/LoggingKit/LogProvider`` instances and supports categorized logging via ``/LoggingKit/LogCategories``. + +## Topics + +### Essentials + +- + +### Frameworks + +- ``/LoggingKit`` diff --git a/Sources/LogService.swift b/Sources/LogService.swift deleted file mode 100644 index c22333b..0000000 --- a/Sources/LogService.swift +++ /dev/null @@ -1,195 +0,0 @@ -// -// File.swift -// -// -// Created by Alexander WeiรŸ on 13.06.20. -// - -import Foundation - -public protocol LogProvider { - - /// Process the log message - /// - /// - Parameters: - /// - event: Log type - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - func log( - _ event: LogType, - _ message: @autoclosure () -> Any?, - logCategory: KeyPath, - fileName: StaticString, - functionName: StaticString, - lineNumber: Int - ) -} - -/// Log service -/// -/// Responsible for distributing the log messages to the log providers -public final class LogService { - - private static var providers = [LogProvider]() - - /// Singleton instance of the log service - public static let shared = LogService(providers: providers) - - private init(providers: [LogProvider]) { - LogService.providers = providers - } - - public static func register(logProviders: LogProvider...) { - providers.append(contentsOf: logProviders) - } - - public static func unregisterAll() { - providers.removeAll() - } - - internal func log(_ event: LogType, - _ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(event, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } - - /// Create an info type log message - /// - /// - Parameters: - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - public func info(_ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(.info, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } - - /// Create a debug type log message - /// - /// - Parameters: - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - public func debug(_ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(.debug, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } - - /// Create a verbose type log message - /// - /// - Parameters: - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - public func verbose(_ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(.verbose, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } - - /// Create a warning type log message - /// - /// - Parameters: - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - public func warning(_ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(.warning, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } - - /// Create an error type log message - /// - /// - Parameters: - /// - message: Log message to process - /// - logCategory: The category of the log message - /// - fileName: File name where the log message is created - /// - functionName: Name of the function in which the log message is created - /// - lineNumber: Line number in the file in which the log message is created - public func error(_ message: @escaping @autoclosure () -> Any?, - logCategory: KeyPath = \.default, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line - ) { - LogService.providers.forEach { - $0.log(.error, - message(), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber - ) - } - } -} diff --git a/Sources/Combine/Combine+LoggingKit.swift b/Sources/LoggingKit/Combine/Combine+LoggingKit.swift similarity index 65% rename from Sources/Combine/Combine+LoggingKit.swift rename to Sources/LoggingKit/Combine/Combine+LoggingKit.swift index 1dd6cfb..6741989 100644 --- a/Sources/Combine/Combine+LoggingKit.swift +++ b/Sources/LoggingKit/Combine/Combine+LoggingKit.swift @@ -7,12 +7,10 @@ // #if canImport(Combine) -@_exported import Combine -@_exported import os.log +public import Combine @available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) extension Publisher { - /// Publisher which logs the failure value of the preceding publisher /// /// - Parameters: @@ -29,10 +27,9 @@ extension Publisher { lineNumber: Int = #line, _ message: @escaping (Self.Failure) -> Any? = { (output: Self.Failure) in return output } ) -> AnyPublisher { - return self .mapError { - LogService.shared.error( + LogService.error( message($0), logCategory: logCategory, fileName: fileName, @@ -40,10 +37,10 @@ extension Publisher { lineNumber: lineNumber ) return $0 - } - .eraseToAnyPublisher() + } + .eraseToAnyPublisher() } - + /// Publisher which logs the ouput value of the preceding publisher /// /// - Parameters: @@ -54,28 +51,29 @@ extension Publisher { /// - lineNumber: Line number in which the message is logged /// - message: Message to log /// - Returns: Returns an AnyPublisher with `AnyPublisher` - public func logValue(logType: LogType = .verbose, - logCategory: KeyPath = \.default, - functionName: StaticString = #function, - fileName: StaticString = #file, - lineNumber: Int = #line, - _ message: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output } + public func logValue( + logType: LogType = .verbose, + logCategory: KeyPath = \.default, + functionName: StaticString = #function, + fileName: StaticString = #file, + lineNumber: Int = #line, + _ message: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output } ) -> AnyPublisher { - return self .map { - LogService.shared.log(logType, - message($0), - logCategory: logCategory, - fileName: fileName, - functionName: functionName, - lineNumber: lineNumber + LogService.shared.log( + logType, + message($0), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber ) return $0 - } - .eraseToAnyPublisher() + } + .eraseToAnyPublisher() } - + /// Publisher which both logs the Self.Failure value and the Self.Output value of the preceding publisher /// - Parameters: /// - messageValue: Self.Output message to log @@ -93,24 +91,27 @@ extension Publisher { logCategory: KeyPath = \.default, functionName: StaticString = #function, fileName: StaticString = #file, - lineNumber: Int = #line) - -> AnyPublisher { - - return self - .logValue(logType: valuelogType, - logCategory: logCategory, - functionName: functionName, - fileName: fileName, - lineNumber: lineNumber, - messageValue + lineNumber: Int = #line + ) + -> AnyPublisher + { + return self + .logValue( + logType: valuelogType, + logCategory: logCategory, + functionName: functionName, + fileName: fileName, + lineNumber: lineNumber, + messageValue ) - .logError(logCategory: logCategory, - functionName: functionName, - fileName: fileName, - lineNumber: lineNumber, - messageError + .logError( + logCategory: logCategory, + functionName: functionName, + fileName: fileName, + lineNumber: lineNumber, + messageError ) - .eraseToAnyPublisher() + .eraseToAnyPublisher() } } #endif diff --git a/Sources/LogCategory.swift b/Sources/LoggingKit/LogCategory.swift similarity index 60% rename from Sources/LogCategory.swift rename to Sources/LoggingKit/LogCategory.swift index fe41a34..a887bf0 100644 --- a/Sources/LogCategory.swift +++ b/Sources/LoggingKit/LogCategory.swift @@ -6,41 +6,42 @@ // Copyright ยฉ 2020 Alexander WeiรŸ. All rights reserved. // -@_exported import Foundation -@_exported import os.log +import Foundation +import os.log // MARK: - LogCategories -//swiftlint:disable identifier_name +// swiftlint:disable identifier_name // Default log categories container -public var LoggingCategories = LogCategories() -//swiftlint:enable identifier_name +public let LoggingCategories = LogCategories() +// swiftlint:enable identifier_name /// Container for holding different log categories -public struct LogCategories { - +public nonisolated struct LogCategories: Sendable { public subscript(keyPath: KeyPath) -> LogCategory { - return self[keyPath: keyPath] + return self[keyPath: keyPath] } } // MARK: Default log categories extension LogCategories { - public var `default`: LogCategory { return .init("default") } + public var `default`: LogCategory { + return LogCategory("default") + } } // MARK: - LogCategory /// A representation of a log category -public struct LogCategory { - //swiftlint:disable identifier_name +public nonisolated struct LogCategory: Sendable { + // swiftlint:disable identifier_name public let _key: String - //swiftlint:enable identifier_name - + // swiftlint:enable identifier_name + var logger: OSLog { return OSLog(subsystem: Bundle.main.bundleIdentifier ?? "dev.teabyte.loggingkit", category: _key) } - + public init(_ key: String) { self._key = key } diff --git a/Sources/LoggingKit/LogProvider.swift b/Sources/LoggingKit/LogProvider.swift new file mode 100644 index 0000000..097ccf2 --- /dev/null +++ b/Sources/LoggingKit/LogProvider.swift @@ -0,0 +1,26 @@ +// +// LogProvider.swift +// LoggingKit +// +// Created by Alexander WeiรŸ on 05.07.26. +// + +public protocol LogProvider: Sendable { + /// Process the log message + /// + /// - Parameters: + /// - event: Log type + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + func log( + _ event: LogType, + _ message: @autoclosure () -> Any?, + logCategory: KeyPath, + fileName: StaticString, + functionName: StaticString, + lineNumber: Int + ) +} diff --git a/Sources/LoggingKit/LogService.swift b/Sources/LoggingKit/LogService.swift new file mode 100644 index 0000000..2735bf0 --- /dev/null +++ b/Sources/LoggingKit/LogService.swift @@ -0,0 +1,202 @@ +// +// LogService.swift +// +// +// Created by Alexander WeiรŸ on 13.06.20. +// + +import Foundation +import Synchronization + +/// Log service +/// +/// Responsible for distributing the log messages to the log providers +public final nonisolated class LogService: Sendable { + private let providers: Mutex<[any LogProvider]> + + /// Singleton instance of the log service + public static let shared = LogService(providers: []) + + private init(providers: [any LogProvider]) { + self.providers = Mutex<[any LogProvider]>(providers) + } + + public static func register(logProviders: any LogProvider...) { + shared.providers.withLock { + $0.append(contentsOf: logProviders) + } + } + + public static func unregisterAll() { + shared.providers.withLock { + $0.removeAll() + } + } + + func log( + _ event: LogType, + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + providers.withLock { + $0.forEach { provider in + provider.log( + event, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } + + /// Create an info type log message + /// + /// - Parameters: + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + public static func info( + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + shared.providers.withLock { providers in + providers.forEach { provider in + provider.log( + .info, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } + + /// Create a debug type log message + /// + /// - Parameters: + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + public static func debug( + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + shared.providers.withLock { providers in + providers.forEach { provider in + provider.log( + .debug, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } + + /// Create a verbose type log message + /// + /// - Parameters: + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + public static func verbose( + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + shared.providers.withLock { providers in + providers.forEach { provider in + provider.log( + .verbose, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } + + /// Create a warning type log message + /// + /// - Parameters: + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + public static func warning( + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + shared.providers.withLock { providers in + providers.forEach { provider in + provider.log( + .warning, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } + + /// Create an error type log message + /// + /// - Parameters: + /// - message: Log message to process + /// - logCategory: The category of the log message + /// - fileName: File name where the log message is created + /// - functionName: Name of the function in which the log message is created + /// - lineNumber: Line number in the file in which the log message is created + public static func error( + _ message: @escaping @autoclosure () -> Any?, + logCategory: KeyPath = \.default, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line + ) { + shared.providers.withLock { providers in + providers.forEach { provider in + provider.log( + .error, + message(), + logCategory: logCategory, + fileName: fileName, + functionName: functionName, + lineNumber: lineNumber + ) + } + } + } +} diff --git a/Sources/LogType.swift b/Sources/LoggingKit/LogType.swift similarity index 70% rename from Sources/LogType.swift rename to Sources/LoggingKit/LogType.swift index 8379892..0bfbe2c 100644 --- a/Sources/LogType.swift +++ b/Sources/LoggingKit/LogType.swift @@ -1,6 +1,6 @@ // -// File.swift -// +// LogType.swift +// // // Created by Alexander WeiรŸ on 13.06.20. // @@ -14,12 +14,12 @@ import Foundation /// * verbose: Debugging message with a lot more information /// * "warning": Warning, but not fatal message /// * error: Fatal message -public enum LogType: String { +public nonisolated enum LogType: String { case info = "โ„น๏ธ(info)" - case debug = "๐Ÿ“(debug)" - case verbose = "๐Ÿ“ฃ(verbose)" - case warning = "โš ๏ธ(warning)" - case error = "โ€ผ๏ธ(error)" + case debug = "๐Ÿ“(debug)" + case verbose = "๐Ÿ“ฃ(verbose)" + case warning = "โš ๏ธ(warning)" + case error = "โ€ผ๏ธ(error)" } extension LogType: CustomStringConvertible { diff --git a/Sources/Providers/OSLogProvider.swift b/Sources/LoggingKit/Providers/OSLogProvider.swift similarity index 61% rename from Sources/Providers/OSLogProvider.swift rename to Sources/LoggingKit/Providers/OSLogProvider.swift index 5a5469e..febe0bc 100644 --- a/Sources/Providers/OSLogProvider.swift +++ b/Sources/LoggingKit/Providers/OSLogProvider.swift @@ -1,11 +1,11 @@ // -// File.swift -// +// OSLogProvider.swift +// // // Created by Alexander WeiรŸ on 13.06.20. // -import Foundation +public import Foundation import os.log // MARK: - OSLog Conversion @@ -31,30 +31,30 @@ extension OSLogType { /// - seeAlso: /// - [Apple Logging Documentation](https://developer.apple.com/documentation/os/logging#1682416) /// - [Based on https://github.com/mono0926/mono-kit/blob/master/Lib/Logger.swift](https://github.com/mono0926/mono-kit/blob/master/Lib/Logger.swift) -public struct OSLogProvider: LogProvider { - +public nonisolated struct OSLogProvider: Sendable, LogProvider { public init() {} - - public func log(_ event: LogType, - _ message: @autoclosure () -> Any?, - logCategory: KeyPath, - fileName: StaticString = #file, - functionName: StaticString = #function, - lineNumber: Int = #line + + public func log( + _ event: LogType, + _ message: @autoclosure () -> Any?, + logCategory: KeyPath, + fileName: StaticString = #file, + functionName: StaticString = #function, + lineNumber: Int = #line ) { - self.doLog(message(), - logType: event, - logCategory: logCategory, - functionName: functionName, - fileName: fileName, - lineNumber: lineNumber + self.doLog( + message(), + logType: event, + logCategory: logCategory, + functionName: functionName, + fileName: fileName, + lineNumber: lineNumber ) } } // MARK: - Producing the log output extension OSLogProvider { - /// Acutally loggs the message using `os_log` /// /// - Parameters: @@ -63,12 +63,13 @@ extension OSLogProvider { /// - functionName: Name of the function in which the message is logged /// - fileName: Name of the file in which the message is logged /// - lineNumber: Line number in which the message is logged - private func doLog( _ message: @autoclosure () -> Any?, - logType: LogType, - logCategory: KeyPath = \.default, - functionName: StaticString, - fileName: StaticString, - lineNumber: Int + private func doLog( + _ message: @autoclosure () -> Any?, + logType: LogType, + logCategory: KeyPath = \.default, + functionName: StaticString, + fileName: StaticString, + lineNumber: Int ) { let osLogType = OSLogType(from: logType) let staticSelf = type(of: self) @@ -76,15 +77,17 @@ extension OSLogProvider { guard log.isEnabled(type: osLogType) else { return } - guard let output = staticSelf.buildOutput(message(), - logType: logType, - functionName: functionName, - fileName: fileName, - lineNumber: lineNumber) else { return } - + guard let output = staticSelf.buildOutput( + message(), + logType: logType, + functionName: functionName, + fileName: fileName, + lineNumber: lineNumber + ) else { return } + os_log("%@", log: log, type: osLogType, output) } - + /// Produces the log output /// /// - Parameters: @@ -94,17 +97,20 @@ extension OSLogProvider { /// - fileName: Name of the file in which the message is logged /// - lineNumber: Line number in which the message is logged /// - Returns: A formatted log message - internal static func buildOutput(_ message: @autoclosure () -> Any?, - logType: LogType, - functionName: StaticString, - fileName: StaticString, - lineNumber: Int) -> String? { + static func buildOutput( + _ message: @autoclosure () -> Any?, + logType: LogType, + functionName: StaticString, + fileName: StaticString, + lineNumber: Int, + threadName: String = OSLogProvider.threadName + ) -> String? { guard let message = message() else { return nil } return "[\(logType)] [\(threadName)] [\((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber)] \(functionName) > \(message)" } - + /// Extracts the current thread name private static var threadName: String { if Thread.isMainThread { @@ -118,12 +124,12 @@ extension OSLogProvider { } return String(format: "[%p] ", Thread.current) } - } extension DispatchQueue { public static var currentQueueLabel: String? { - return String(validatingUTF8: __dispatch_queue_get_label(nil)) + return String(validatingCString: __dispatch_queue_get_label(nil)) } } + // swiftlint:enable type_contents_order diff --git a/Sources/LoggingKit/Resources/PrivacyInfo.xcprivacy b/Sources/LoggingKit/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..b1cd27f --- /dev/null +++ b/Sources/LoggingKit/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + \ No newline at end of file diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift deleted file mode 100644 index aef7a00..0000000 --- a/Tests/LinuxMain.swift +++ /dev/null @@ -1,7 +0,0 @@ -import XCTest -@testable import LoggingKitTests - -XCTMain([ - testCase(LoggingKitTests.allTests), - testCase(OSLogProviderTests.allTests), -]) diff --git a/Tests/LoggingKitTests.swift b/Tests/LoggingKitTests.swift deleted file mode 100644 index f320b40..0000000 --- a/Tests/LoggingKitTests.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// LoggingKitTests.swift -// LoggingKitTests -// -// Created by Alexander WeiรŸ on 25. Apr 2020. -// Copyright ยฉ 2020 LoggingKit. All rights reserved. -// - -@testable import LoggingKit -import XCTest - -extension LogCategories { - public var combine: LogCategory { return .init("combine") } -} - -// Helper error -enum NumberError: Error { - case numberTooHigh -} - -class LoggingKitTests: XCTestCase { - - static var allTests = [ - ("testProviderRegistration", testProviderRegistration), - ] - - func testProviderRegistration() { - LogService.register(logProviders: OSLogProvider()) - LogService.unregisterAll() - } -} diff --git a/Tests/LoggingKitTests/LoggingKitTests.swift b/Tests/LoggingKitTests/LoggingKitTests.swift new file mode 100644 index 0000000..7b846fb --- /dev/null +++ b/Tests/LoggingKitTests/LoggingKitTests.swift @@ -0,0 +1,19 @@ +// +// LoggingKitTests.swift +// LoggingKitTests +// +// Created by Alexander WeiรŸ on 25. Apr 2020. +// Copyright ยฉ 2020 LoggingKit. All rights reserved. +// + +import Testing +@testable import LoggingKit + +@Suite("LogService Tests") +struct LoggingKitTests { + @Test + func providerRegistration() { + LogService.register(logProviders: OSLogProvider()) + LogService.unregisterAll() + } +} diff --git a/Tests/LoggingKitTests/OSLogProviderTests.swift b/Tests/LoggingKitTests/OSLogProviderTests.swift new file mode 100644 index 0000000..b211f66 --- /dev/null +++ b/Tests/LoggingKitTests/OSLogProviderTests.swift @@ -0,0 +1,142 @@ +// +// OSLogProviderTests.swift +// LoggingKit-iOS +// +// Created by Alexander WeiรŸ on 13.06.20. +// Copyright ยฉ 2020 Alexander WeiรŸ. All rights reserved. +// + +import Combine +import Testing +@testable import LoggingKit + +/// Helper error +enum NumberError: Error { + case numberTooHigh +} + +@Suite("OSLogProvider Tests") +struct OSLogProviderTests { + @Test + func verboseMessageBuilding() { + let message = OSLogProvider.buildOutput( + "Debug message", + logType: .verbose, + functionName: "testMethod()", + fileName: "TestFile.swift", + lineNumber: 42, + threadName: "main" + ) + + #expect(message == + "[๐Ÿ“ฃ(verbose)] [main] [TestFile.swift:42] testMethod() > Debug message") + } + + @Test + func debugMessageBuilding() { + let message = OSLogProvider.buildOutput( + "Debug message", + logType: .debug, + functionName: "testMethod()", + fileName: "TestFile.swift", + lineNumber: 42, + threadName: "main" + ) + + #expect(message == + "[๐Ÿ“(debug)] [main] [TestFile.swift:42] testMethod() > Debug message") + } + + @Test + func infoMessageBuilding() { + let message = OSLogProvider.buildOutput( + "Debug message", + logType: .info, + functionName: "testMethod()", + fileName: "TestFile.swift", + lineNumber: 42, + threadName: "main" + ) + + #expect(message == + "[โ„น๏ธ(info)] [main] [TestFile.swift:42] testMethod() > Debug message") + } + + @Test + func warningMessageBuilding() { + let message = OSLogProvider.buildOutput( + "Debug message", + logType: .warning, + functionName: "testMethod()", + fileName: "TestFile.swift", + lineNumber: 42, + threadName: "main" + ) + + #expect(message == + "[โš ๏ธ(warning)] [main] [TestFile.swift:42] testMethod() > Debug message") + } + + @Test + func errorMessageBuilding() { + let message = OSLogProvider.buildOutput( + "Debug message", + logType: .error, + functionName: "testMethod()", + fileName: "TestFile.swift", + lineNumber: 42, + threadName: "main" + ) + + #expect(message == + "[โ€ผ๏ธ(error)] [main] [TestFile.swift:42] testMethod() > Debug message") + } + + @Test + func logging() { + let provider = OSLogProvider() + provider.log(.debug, "Hello Debug", logCategory: \.default) + provider.log(.info, "Hello Info", logCategory: \.default) + provider.log(.warning, "Hello Warning", logCategory: \.default) + provider.log(.error, "Hello Error", logCategory: \.default) + provider.log(.verbose, "Hello Verbose", logCategory: \.default) + } + + func testOsLogProvider() { + let provider = OSLogProvider() + provider.log(.debug, "Hello Debug", logCategory: \.default) + provider.log(.info, "Hello Info", logCategory: \.default) + provider.log(.warning, "Hello Warning", logCategory: \.default) + provider.log(.error, "Hello Error", logCategory: \.default) + provider.log(.verbose, "Hello Verbose", logCategory: \.default) + } + + @Test + func combine() async { + var cancellable: Set = [] + + await confirmation { confirmation in + Result.Publisher(5) + .logValue(logType: .info, logCategory: \.combine) { + "My Value is \($0)" + } + .tryMap { (_: Int) in + throw NumberError.numberTooHigh + } + .logError(logCategory: \.combine) { + "My error is \($0)" + } + .sink(receiveCompletion: { + _ in confirmation.confirm() + }, receiveValue: { _ in }) + .store(in: &cancellable) + } + } +} + +// MARK: - Helpers +extension LogCategories { + var combine: LogCategory { + return LogCategory("combine") + } +} diff --git a/Tests/OSLogProviderTests.swift b/Tests/OSLogProviderTests.swift deleted file mode 100644 index 5e5c7f3..0000000 --- a/Tests/OSLogProviderTests.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// OSLogProviderTests.swift -// LoggingKit-iOS -// -// Created by Alexander WeiรŸ on 13.06.20. -// Copyright ยฉ 2020 Alexander WeiรŸ. All rights reserved. -// - -@testable import LoggingKit -import XCTest -import Combine - -class OSLogProviderTests: XCTestCase { - - static var allTests = [ - ("testOSLogproviderMessageBuilding", testOSLogproviderMessageBuilding), - ("testOsLogProvider", testOsLogProvider), - ("testCombineLogging", testCombineLogging), - ] - - private var sub: AnyCancellable? = nil - - func testOSLogproviderMessageBuilding() { - XCTAssertEqual( - - OSLogProvider.buildOutput("Debug message", logType: .verbose, functionName: "testMethod()", fileName: "TestFile.swift", lineNumber: 42), - "[๐Ÿ“ฃ(verbose)] [main] [TestFile.swift:42] testMethod() > Debug message" - ) - - XCTAssertEqual( - OSLogProvider.buildOutput("Debug message", logType: .debug, functionName: "testMethod()", fileName: "TestFile.swift", lineNumber: 42), - "[๐Ÿ“(debug)] [main] [TestFile.swift:42] testMethod() > Debug message" - ) - - XCTAssertEqual( - OSLogProvider.buildOutput("Debug message", logType: .info, functionName: "testMethod()", fileName: "TestFile.swift", lineNumber: 42), - "[โ„น๏ธ(info)] [main] [TestFile.swift:42] testMethod() > Debug message" - ) - - XCTAssertEqual( - OSLogProvider.buildOutput("Debug message", logType: .warning, functionName: "testMethod()", fileName: "TestFile.swift", lineNumber: 42), - "[โš ๏ธ(warning)] [main] [TestFile.swift:42] testMethod() > Debug message" - ) - - XCTAssertEqual( - OSLogProvider.buildOutput("Debug message", logType: .error, functionName: "testMethod()", fileName: "TestFile.swift", lineNumber: 42), - "[โ€ผ๏ธ(error)] [main] [TestFile.swift:42] testMethod() > Debug message" - ) - } - - func testOsLogProvider() { - let provider = OSLogProvider() - provider.log(.debug, "Hello Debug", logCategory: \.default) - provider.log(.info, "Hello Info", logCategory: \.default) - provider.log(.warning, "Hello Warning", logCategory: \.default) - provider.log(.error, "Hello Error", logCategory: \.default) - provider.log(.verbose, "Hello Verbose", logCategory: \.default) - - } - - func testCombineLogging() { - sub = Result.Publisher(5) - .logValue(logType: .info, logCategory: \.combine) { - "My Value is \($0)" - } - .tryMap { (number:Int) in - throw NumberError.numberTooHigh - } - .logError(logCategory: \.combine) { - "My error is \($0)" - } - .sink(receiveCompletion: { _ in }, receiveValue: {_ in}) - } - - -} diff --git a/docs/Classes.html b/docs/Classes.html deleted file mode 100644 index 57e85d4..0000000 --- a/docs/Classes.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - Classes Reference - - - - - - - - - - -

-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Classes

-

The following classes are available globally.

- -
-
-
-
    -
  • -
    - - - - LogService - -
    -
    -
    -
    -
    -
    -

    Log service

    - -

    Responsible for distributing the log messages to the log providers

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public final class LogService
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Classes/LogService.html b/docs/Classes/LogService.html deleted file mode 100644 index 5014f74..0000000 --- a/docs/Classes/LogService.html +++ /dev/null @@ -1,698 +0,0 @@ - - - - LogService Class Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogService

-
-
-
public final class LogService
- -
-
-

Log service

- -

Responsible for distributing the log messages to the log providers

- -
-
-
-
    -
  • -
    - - - - shared - -
    -
    -
    -
    -
    -
    -

    Singleton instance of the log service

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static let shared: LogService
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static func register(logProviders: LogProvider...)
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - unregisterAll() - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static func unregisterAll()
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create an info type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func info(_ message: @escaping @autoclosure () -> Any?,
    -                 logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                 fileName: StaticString = #file,
    -                 functionName: StaticString = #function,
    -                 lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a debug type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func debug(_ message: @escaping @autoclosure () -> Any?,
    -                  logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                  fileName: StaticString = #file,
    -                  functionName: StaticString = #function,
    -                  lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a verbose type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func verbose(_ message: @escaping @autoclosure () -> Any?,
    -                    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                    fileName: StaticString = #file,
    -                    functionName: StaticString = #function,
    -                    lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a warning type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func warning(_ message: @escaping @autoclosure () -> Any?,
    -                    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                    fileName: StaticString = #file,
    -                    functionName: StaticString = #function,
    -                    lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create an error type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func error(_ message: @escaping @autoclosure () -> Any?,
    -                  logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                  fileName: StaticString = #file,
    -                  functionName: StaticString = #function,
    -                  lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Enums.html b/docs/Enums.html deleted file mode 100644 index 6d500f5..0000000 --- a/docs/Enums.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - Enumerations Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Enumerations

-

The following enumerations are available globally.

- -
-
-
-
    -
  • -
    - - - - LogType - -
    -
    -
    -
    -
    -
    -

    Different log types

    - -
      -
    • info: Some informative message
    • -
    • debug: Debugging purpose message
    • -
    • verbose: Debugging message with a lot more information
    • -
    • “warning”: Warning, but not fatal message
    • -
    • error: Fatal message
    • -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum LogType : String
    -
    extension LogType: CustomStringConvertible
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Enums/LogType.html b/docs/Enums/LogType.html deleted file mode 100644 index a6d8861..0000000 --- a/docs/Enums/LogType.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - LogType Enumeration Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogType

-
-
-
public enum LogType : String
-
extension LogType: CustomStringConvertible
- -
-
-

Different log types

- -
    -
  • info: Some informative message
  • -
  • debug: Debugging purpose message
  • -
  • verbose: Debugging message with a lot more information
  • -
  • “warning”: Warning, but not fatal message
  • -
  • error: Fatal message
  • -
- -
-
-
-
    -
  • -
    - - - - info - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case info = "โ„น๏ธ(info)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - debug - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case debug = "๐Ÿ“(debug)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - verbose - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case verbose = "๐Ÿ“ฃ(verbose)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - warning - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case warning = "โš ๏ธ(warning)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - error - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case error = "โ€ผ๏ธ(error)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - description - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var description: String { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Extensions.html b/docs/Extensions.html deleted file mode 100644 index df61b5a..0000000 --- a/docs/Extensions.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - Extensions Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Extensions

-

The following extensions are available globally.

- -
-
-
-
    -
  • -
    - - - - Publisher - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension Publisher
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

OSLog Conversion

-

-
-
-
    -
  • -
    - - - - OSLogType - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension OSLogType
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

Producing the log output

-

-
-
-
    -
  • -
    - - - - DispatchQueue - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension DispatchQueue
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Extensions/DispatchQueue.html b/docs/Extensions/DispatchQueue.html deleted file mode 100644 index aa4487c..0000000 --- a/docs/Extensions/DispatchQueue.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - DispatchQueue Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

DispatchQueue

-
-
-
extension DispatchQueue
- -
-
- -
-
-
-
    -
  • -
    - - - - currentQueueLabel - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static var currentQueueLabel: String? { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Extensions/OSLogType.html b/docs/Extensions/OSLogType.html deleted file mode 100644 index fff149a..0000000 --- a/docs/Extensions/OSLogType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - OSLogType Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

OSLogType

-
-
-
extension OSLogType
- -
-
- -
-
-
-
    -
  • -
    - - - - init(from:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    init(from: LogType)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Extensions/Publisher.html b/docs/Extensions/Publisher.html deleted file mode 100644 index 3781f39..0000000 --- a/docs/Extensions/Publisher.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - Publisher Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Publisher

-
-
-
extension Publisher
- -
-
- -
-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Publisher which logs the failure value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func logError(
    -    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -    functionName: StaticString = #function,
    -    fileName: StaticString = #file,
    -    lineNumber: Int = #line,
    -    _ message: @escaping (Self.Failure) -> Any? = { (output: Self.Failure) in return output }
    -) -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - logCategory - - -
    -

    Category of the log message

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    - - message - - -
    -

    Message to log

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Publisher which logs the ouput value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func logValue(logType: LogType = .verbose,
    -                     logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                     functionName: StaticString = #function,
    -                     fileName: StaticString = #file,
    -                     lineNumber: Int = #line,
    -                     _ message: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output }
    -) -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - logType - - -
    -

    Type of the value log message

    -
    -
    - - logCategory - - -
    -

    Category of the log message

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    - - message - - -
    -

    Message to log

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Publisher which both logs the Self.Failure value and the Self.Output value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func log(
    -    messageValue: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output },
    -    messageError: @escaping (Self.Failure) -> Any? = { (output: Self.Failure) in return output },
    -    valuelogType: LogType = .verbose,
    -    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -    functionName: StaticString = #function,
    -    fileName: StaticString = #file,
    -    lineNumber: Int = #line)
    -    -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - messageValue - - -
    -

    Self.Output message to log

    -
    -
    - - messageError - - -
    -

    Self.Failure message to log

    -
    -
    - - valuelogType - - -
    -

    Type of the Self.Output log message

    -
    -
    - - logCategory - - -
    -

    Category of the both log messages

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Global Variables.html b/docs/Global Variables.html deleted file mode 100644 index b11bd0d..0000000 --- a/docs/Global Variables.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - Global Variables Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Global Variables

-

The following global variables are available globally.

- -
-
-
-
- - -
- -

LogCategories

-

-
-
-
    -
  • -
    - - - - LoggingCategories - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var LoggingCategories: LogCategories
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Protocols.html b/docs/Protocols.html deleted file mode 100644 index 03cda7f..0000000 --- a/docs/Protocols.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - Protocols Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Protocols

-

The following protocols are available globally.

- -
-
-
-
    -
  • -
    - - - - LogProvider - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public protocol LogProvider
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Protocols/LogProvider.html b/docs/Protocols/LogProvider.html deleted file mode 100644 index 984b7d7..0000000 --- a/docs/Protocols/LogProvider.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - LogProvider Protocol Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogProvider

-
-
-
public protocol LogProvider
- -
-
-

Undocumented

- -
-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Process the log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    func log(_ event: LogType, _ message: @autoclosure () -> Any?, logCategory: KeyPath<LogCategories, LogCategory>, fileName: StaticString, functionName: StaticString, lineNumber: Int)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - event - - -
    -

    Log type

    -
    -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Structs.html b/docs/Structs.html deleted file mode 100644 index bfec6d8..0000000 --- a/docs/Structs.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - Structures Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Structures

-

The following structures are available globally.

- -
-
-
-
- - -
- -

LogCategories

-

-
-
-
    -
  • -
    - - - - LogCategories - -
    -
    -
    -
    -
    -
    -

    Container for holding different log categories

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public struct LogCategories
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

LogCategory

-

-
-
-
    -
  • -
    - - - - LogCategory - -
    -
    -
    -
    -
    -
    -

    A representation of a log category

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public struct LogCategory
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

OSLog Conversion

-

-
-
- -
-
-
- -
-
- - - diff --git a/docs/Structs/LogCategories.html b/docs/Structs/LogCategories.html deleted file mode 100644 index 0baf426..0000000 --- a/docs/Structs/LogCategories.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - LogCategories Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogCategories

-
-
-
public struct LogCategories
- -
-
-

Container for holding different log categories

- -
-
-
-
    -
  • -
    - - - - subscript(_:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public subscript(keyPath: KeyPath<LogCategories, LogCategory>) -> LogCategory { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

Default log categories

-

-
-
-
    -
  • -
    - - - - default - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var `default`: LogCategory { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Structs/LogCategory.html b/docs/Structs/LogCategory.html deleted file mode 100644 index 57095c3..0000000 --- a/docs/Structs/LogCategory.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - LogCategory Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogCategory

-
-
-
public struct LogCategory
- -
-
-

A representation of a log category

- -
-
-
-
    -
  • -
    - - - - _key - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _key: String
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - init(_:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init(_ key: String)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Structs/OSLogProvider.html b/docs/Structs/OSLogProvider.html deleted file mode 100644 index a0a061c..0000000 --- a/docs/Structs/OSLogProvider.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - OSLogProvider Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

OSLogProvider

-
-
-
public struct OSLogProvider : LogProvider
- -
-
-

Simple log provider which uses Apple’s Unified Logging System via os_log

- - -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func log(_ event: LogType,
    -                _ message: @autoclosure () -> Any?,
    -                logCategory: KeyPath<LogCategories, LogCategory>,
    -                fileName: StaticString = #file,
    -                functionName: StaticString = #function,
    -                lineNumber: Int = #line
    -)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/badge.svg b/docs/badge.svg deleted file mode 100644 index c14a762..0000000 --- a/docs/badge.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - documentation - - - documentation - - - 55% - - - 55% - - - diff --git a/docs/css/highlight.css b/docs/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css deleted file mode 100644 index 2d5656d..0000000 --- a/docs/css/jazzy.css +++ /dev/null @@ -1,372 +0,0 @@ -html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { - background: transparent; - border: 0; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; } - -body { - background-color: #f2f2f2; - font-family: Helvetica, freesans, Arial, sans-serif; - font-size: 14px; - -webkit-font-smoothing: subpixel-antialiased; - word-wrap: break-word; } - -h1, h2, h3 { - margin-top: 0.8em; - margin-bottom: 0.3em; - font-weight: 100; - color: black; } - -h1 { - font-size: 2.5em; } - -h2 { - font-size: 2em; - border-bottom: 1px solid #e2e2e2; } - -h4 { - font-size: 13px; - line-height: 1.5; - margin-top: 21px; } - -h5 { - font-size: 1.1em; } - -h6 { - font-size: 1.1em; - color: #777; } - -.section-name { - color: gray; - display: block; - font-family: Helvetica; - font-size: 22px; - font-weight: 100; - margin-bottom: 15px; } - -pre, code { - font: 0.95em Menlo, monospace; - color: #777; - word-wrap: normal; } - -p code, li code { - background-color: #eee; - padding: 2px 4px; - border-radius: 4px; } - -a { - color: #0088cc; - text-decoration: none; } - -ul { - padding-left: 15px; } - -li { - line-height: 1.8em; } - -img { - max-width: 100%; } - -blockquote { - margin-left: 0; - padding: 0 10px; - border-left: 4px solid #ccc; } - -.content-wrapper { - margin: 0 auto; - width: 980px; } - -header { - font-size: 0.85em; - line-height: 26px; - background-color: #414141; - position: fixed; - width: 100%; - z-index: 2; } - header img { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - header a { - color: #fff; } - header p { - float: left; - color: #999; } - header .header-right { - float: right; - margin-left: 16px; } - -#breadcrumbs { - background-color: #f2f2f2; - height: 27px; - padding-top: 17px; - position: fixed; - width: 100%; - z-index: 2; - margin-top: 26px; } - #breadcrumbs #carat { - height: 10px; - margin: 0 5px; } - -.sidebar { - background-color: #f9f9f9; - border: 1px solid #e2e2e2; - overflow-y: auto; - overflow-x: hidden; - position: fixed; - top: 70px; - bottom: 0; - width: 230px; - word-wrap: normal; } - -.nav-groups { - list-style-type: none; - background: #fff; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #e2e2e2; - font-size: 1.1em; - font-weight: 100; - padding: 15px 0 15px 20px; } - .nav-group-name > a { - color: #333; } - -.nav-group-tasks { - margin-top: 5px; } - -.nav-group-task { - font-size: 0.9em; - list-style-type: none; - white-space: nowrap; } - .nav-group-task a { - color: #888; } - -.main-content { - background-color: #fff; - border: 1px solid #e2e2e2; - margin-left: 246px; - position: absolute; - overflow: hidden; - padding-bottom: 20px; - top: 70px; - width: 734px; } - .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { - margin-bottom: 1em; } - .main-content p { - line-height: 1.8em; } - .main-content section .section:first-child { - margin-top: 0; - padding-top: 0; } - .main-content section .task-group-section .task-group:first-of-type { - padding-top: 10px; } - .main-content section .task-group-section .task-group:first-of-type .section-name { - padding-top: 15px; } - .main-content section .heading:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .main-content .section-name p { - margin-bottom: inherit; - line-height: inherit; } - .main-content .section-name code { - background-color: inherit; - padding: inherit; - color: inherit; } - -.section { - padding: 0 25px; } - -.highlight { - background-color: #eee; - padding: 10px 12px; - border: 1px solid #e2e2e2; - border-radius: 4px; - overflow-x: auto; } - -.declaration .highlight { - overflow-x: initial; - padding: 0 40px 40px 0; - margin-bottom: -25px; - background-color: transparent; - border: none; } - -.section-name { - margin: 0; - margin-left: 18px; } - -.task-group-section { - padding-left: 6px; - border-top: 1px solid #e2e2e2; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - -.section-name-container { - position: relative; - display: inline-block; } - .section-name-container .section-name-link { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - margin-bottom: 0; } - .section-name-container .section-name { - position: relative; - pointer-events: none; - z-index: 1; } - .section-name-container .section-name a { - pointer-events: auto; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .item code { - background-color: transparent; - padding: 0; } - .item .token, .item .direct-link { - padding-left: 3px; - margin-left: 15px; - font-size: 11.9px; - transition: all 300ms; } - .item .token-open { - margin-left: 0px; } - .item .discouraged { - text-decoration: line-through; } - .item .declaration-note { - font-size: .85em; - color: gray; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #e2e2e2; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - background: #f9f9f9; - border-left: 1px solid #e2e2e2; - border-top: 1px solid #e2e2e2; - height: 12px; - left: 21px; - top: -7px; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - position: absolute; - width: 12px; } - -.height-container { - display: none; - left: -25px; - padding: 0 25px; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #f9f9f9; - border-bottom: 1px solid #e2e2e2; - left: -25px; - position: relative; - width: 100%; - padding-top: 10px; - padding-bottom: 5px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4b8afb; } - -.aside-warning, .aside-deprecated, .aside-unavailable { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #e2e2e2; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -#footer { - position: relative; - top: 10px; - bottom: 0px; - margin-left: 25px; } - #footer p { - margin: 0; - color: #aaa; - font-size: 0.8em; } - -html.dash header, html.dash #breadcrumbs, html.dash .sidebar { - display: none; } - -html.dash .main-content { - width: 980px; - margin-left: 0; - border: none; - width: 100%; - top: 0; - padding-bottom: 0; } - -html.dash .height-container { - display: block; } - -html.dash .item .token { - margin-left: 0; } - -html.dash .content-wrapper { - width: auto; } - -html.dash #footer { - position: static; } diff --git a/docs/docsets/.docset/Contents/Info.plist b/docs/docsets/.docset/Contents/Info.plist deleted file mode 100644 index 61863ec..0000000 --- a/docs/docsets/.docset/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleIdentifier - com.jazzy. - CFBundleName - - DocSetPlatformFamily - - isDashDocset - - dashIndexFilePath - index.html - isJavaScriptEnabled - - DashDocSetFamily - dashtoc - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html deleted file mode 100644 index 57e85d4..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - Classes Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Classes

-

The following classes are available globally.

- -
-
-
-
    -
  • -
    - - - - LogService - -
    -
    -
    -
    -
    -
    -

    Log service

    - -

    Responsible for distributing the log messages to the log providers

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public final class LogService
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/LogService.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/LogService.html deleted file mode 100644 index 5014f74..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/LogService.html +++ /dev/null @@ -1,698 +0,0 @@ - - - - LogService Class Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogService

-
-
-
public final class LogService
- -
-
-

Log service

- -

Responsible for distributing the log messages to the log providers

- -
-
-
-
    -
  • -
    - - - - shared - -
    -
    -
    -
    -
    -
    -

    Singleton instance of the log service

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static let shared: LogService
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static func register(logProviders: LogProvider...)
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - unregisterAll() - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static func unregisterAll()
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create an info type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func info(_ message: @escaping @autoclosure () -> Any?,
    -                 logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                 fileName: StaticString = #file,
    -                 functionName: StaticString = #function,
    -                 lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a debug type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func debug(_ message: @escaping @autoclosure () -> Any?,
    -                  logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                  fileName: StaticString = #file,
    -                  functionName: StaticString = #function,
    -                  lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a verbose type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func verbose(_ message: @escaping @autoclosure () -> Any?,
    -                    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                    fileName: StaticString = #file,
    -                    functionName: StaticString = #function,
    -                    lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create a warning type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func warning(_ message: @escaping @autoclosure () -> Any?,
    -                    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                    fileName: StaticString = #file,
    -                    functionName: StaticString = #function,
    -                    lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Create an error type log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func error(_ message: @escaping @autoclosure () -> Any?,
    -                  logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                  fileName: StaticString = #file,
    -                  functionName: StaticString = #function,
    -                  lineNumber: Int = #line
    -)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums.html deleted file mode 100644 index 6d500f5..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - Enumerations Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Enumerations

-

The following enumerations are available globally.

- -
-
-
-
    -
  • -
    - - - - LogType - -
    -
    -
    -
    -
    -
    -

    Different log types

    - -
      -
    • info: Some informative message
    • -
    • debug: Debugging purpose message
    • -
    • verbose: Debugging message with a lot more information
    • -
    • “warning”: Warning, but not fatal message
    • -
    • error: Fatal message
    • -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum LogType : String
    -
    extension LogType: CustomStringConvertible
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums/LogType.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums/LogType.html deleted file mode 100644 index a6d8861..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums/LogType.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - LogType Enumeration Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogType

-
-
-
public enum LogType : String
-
extension LogType: CustomStringConvertible
- -
-
-

Different log types

- -
    -
  • info: Some informative message
  • -
  • debug: Debugging purpose message
  • -
  • verbose: Debugging message with a lot more information
  • -
  • “warning”: Warning, but not fatal message
  • -
  • error: Fatal message
  • -
- -
-
-
-
    -
  • -
    - - - - info - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case info = "โ„น๏ธ(info)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - debug - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case debug = "๐Ÿ“(debug)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - verbose - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case verbose = "๐Ÿ“ฃ(verbose)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - warning - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case warning = "โš ๏ธ(warning)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - error - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case error = "โ€ผ๏ธ(error)"
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - description - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var description: String { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html deleted file mode 100644 index df61b5a..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - Extensions Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Extensions

-

The following extensions are available globally.

- -
-
-
-
    -
  • -
    - - - - Publisher - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension Publisher
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

OSLog Conversion

-

-
-
-
    -
  • -
    - - - - OSLogType - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension OSLogType
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

Producing the log output

-

-
-
-
    -
  • -
    - - - - DispatchQueue - -
    -
    -
    -
    -
    -
    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    extension DispatchQueue
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html deleted file mode 100644 index aa4487c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - DispatchQueue Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

DispatchQueue

-
-
-
extension DispatchQueue
- -
-
- -
-
-
-
    -
  • -
    - - - - currentQueueLabel - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static var currentQueueLabel: String? { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/OSLogType.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/OSLogType.html deleted file mode 100644 index fff149a..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/OSLogType.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - OSLogType Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

OSLogType

-
-
-
extension OSLogType
- -
-
- -
-
-
-
    -
  • -
    - - - - init(from:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    init(from: LogType)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html deleted file mode 100644 index 3781f39..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html +++ /dev/null @@ -1,469 +0,0 @@ - - - - Publisher Extension Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Publisher

-
-
-
extension Publisher
- -
-
- -
-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Publisher which logs the failure value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func logError(
    -    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -    functionName: StaticString = #function,
    -    fileName: StaticString = #file,
    -    lineNumber: Int = #line,
    -    _ message: @escaping (Self.Failure) -> Any? = { (output: Self.Failure) in return output }
    -) -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - logCategory - - -
    -

    Category of the log message

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    - - message - - -
    -

    Message to log

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Publisher which logs the ouput value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func logValue(logType: LogType = .verbose,
    -                     logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -                     functionName: StaticString = #function,
    -                     fileName: StaticString = #file,
    -                     lineNumber: Int = #line,
    -                     _ message: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output }
    -) -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - logType - - -
    -

    Type of the value log message

    -
    -
    - - logCategory - - -
    -

    Category of the log message

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    - - message - - -
    -

    Message to log

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Publisher which both logs the Self.Failure value and the Self.Output value of the preceding publisher

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func log(
    -    messageValue: @escaping (Self.Output) -> Any? = { (output: Self.Output) in return output },
    -    messageError: @escaping (Self.Failure) -> Any? = { (output: Self.Failure) in return output },
    -    valuelogType: LogType = .verbose,
    -    logCategory: KeyPath<LogCategories, LogCategory> = \.default,
    -    functionName: StaticString = #function,
    -    fileName: StaticString = #file,
    -    lineNumber: Int = #line)
    -    -> AnyPublisher<Self.Output, Self.Failure>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - messageValue - - -
    -

    Self.Output message to log

    -
    -
    - - messageError - - -
    -

    Self.Failure message to log

    -
    -
    - - valuelogType - - -
    -

    Type of the Self.Output log message

    -
    -
    - - logCategory - - -
    -

    Category of the both log messages

    -
    -
    - - functionName - - -
    -

    Name of the function in which the message is logged

    -
    -
    - - fileName - - -
    -

    Name of the file in which the message is logged

    -
    -
    - - lineNumber - - -
    -

    Line number in which the message is logged

    -
    -
    -
    -
    -

    Return Value

    -

    Returns an AnyPublisher with AnyPublisher<Self.Output, Self.Failure>

    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html b/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html deleted file mode 100644 index b11bd0d..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - Global Variables Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Global Variables

-

The following global variables are available globally.

- -
-
-
-
- - -
- -

LogCategories

-

-
-
-
    -
  • -
    - - - - LoggingCategories - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var LoggingCategories: LogCategories
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html deleted file mode 100644 index 03cda7f..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - Protocols Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Protocols

-

The following protocols are available globally.

- -
-
-
-
    -
  • -
    - - - - LogProvider - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public protocol LogProvider
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/LogProvider.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/LogProvider.html deleted file mode 100644 index 984b7d7..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/LogProvider.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - LogProvider Protocol Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogProvider

-
-
-
public protocol LogProvider
- -
-
-

Undocumented

- -
-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Process the log message

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    func log(_ event: LogType, _ message: @autoclosure () -> Any?, logCategory: KeyPath<LogCategories, LogCategory>, fileName: StaticString, functionName: StaticString, lineNumber: Int)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - event - - -
    -

    Log type

    -
    -
    - - message - - -
    -

    Log message to process

    -
    -
    - - logCategory - - -
    -

    The category of the log message

    -
    -
    - - fileName - - -
    -

    File name where the log message is created

    -
    -
    - - functionName - - -
    -

    Name of the function in which the log message is created

    -
    -
    - - lineNumber - - -
    -

    Line number in the file in which the log message is created

    -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs.html deleted file mode 100644 index bfec6d8..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - Structures Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

Structures

-

The following structures are available globally.

- -
-
-
-
- - -
- -

LogCategories

-

-
-
-
    -
  • -
    - - - - LogCategories - -
    -
    -
    -
    -
    -
    -

    Container for holding different log categories

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public struct LogCategories
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

LogCategory

-

-
-
-
    -
  • -
    - - - - LogCategory - -
    -
    -
    -
    -
    -
    -

    A representation of a log category

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public struct LogCategory
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

OSLog Conversion

-

-
-
- -
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategories.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategories.html deleted file mode 100644 index 0baf426..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategories.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - LogCategories Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogCategories

-
-
-
public struct LogCategories
- -
-
-

Container for holding different log categories

- -
-
-
-
    -
  • -
    - - - - subscript(_:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public subscript(keyPath: KeyPath<LogCategories, LogCategory>) -> LogCategory { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- - -
- -

Default log categories

-

-
-
-
    -
  • -
    - - - - default - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var `default`: LogCategory { get }
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategory.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategory.html deleted file mode 100644 index 57095c3..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/LogCategory.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - LogCategory Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

LogCategory

-
-
-
public struct LogCategory
- -
-
-

A representation of a log category

- -
-
-
-
    -
  • -
    - - - - _key - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _key: String
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - init(_:) - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init(_ key: String)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/OSLogProvider.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/OSLogProvider.html deleted file mode 100644 index a0a061c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/OSLogProvider.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - OSLogProvider Structure Reference - - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
-

OSLogProvider

-
-
-
public struct OSLogProvider : LogProvider
- -
-
-

Simple log provider which uses Apple’s Unified Logging System via os_log

- - -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    -

    Undocumented

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func log(_ event: LogType,
    -                _ message: @autoclosure () -> Any?,
    -                logCategory: KeyPath<LogCategories, LogCategory>,
    -                fileName: StaticString = #file,
    -                functionName: StaticString = #function,
    -                lineNumber: Int = #line
    -)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css deleted file mode 100644 index 2d5656d..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css +++ /dev/null @@ -1,372 +0,0 @@ -html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { - background: transparent; - border: 0; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; } - -body { - background-color: #f2f2f2; - font-family: Helvetica, freesans, Arial, sans-serif; - font-size: 14px; - -webkit-font-smoothing: subpixel-antialiased; - word-wrap: break-word; } - -h1, h2, h3 { - margin-top: 0.8em; - margin-bottom: 0.3em; - font-weight: 100; - color: black; } - -h1 { - font-size: 2.5em; } - -h2 { - font-size: 2em; - border-bottom: 1px solid #e2e2e2; } - -h4 { - font-size: 13px; - line-height: 1.5; - margin-top: 21px; } - -h5 { - font-size: 1.1em; } - -h6 { - font-size: 1.1em; - color: #777; } - -.section-name { - color: gray; - display: block; - font-family: Helvetica; - font-size: 22px; - font-weight: 100; - margin-bottom: 15px; } - -pre, code { - font: 0.95em Menlo, monospace; - color: #777; - word-wrap: normal; } - -p code, li code { - background-color: #eee; - padding: 2px 4px; - border-radius: 4px; } - -a { - color: #0088cc; - text-decoration: none; } - -ul { - padding-left: 15px; } - -li { - line-height: 1.8em; } - -img { - max-width: 100%; } - -blockquote { - margin-left: 0; - padding: 0 10px; - border-left: 4px solid #ccc; } - -.content-wrapper { - margin: 0 auto; - width: 980px; } - -header { - font-size: 0.85em; - line-height: 26px; - background-color: #414141; - position: fixed; - width: 100%; - z-index: 2; } - header img { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - header a { - color: #fff; } - header p { - float: left; - color: #999; } - header .header-right { - float: right; - margin-left: 16px; } - -#breadcrumbs { - background-color: #f2f2f2; - height: 27px; - padding-top: 17px; - position: fixed; - width: 100%; - z-index: 2; - margin-top: 26px; } - #breadcrumbs #carat { - height: 10px; - margin: 0 5px; } - -.sidebar { - background-color: #f9f9f9; - border: 1px solid #e2e2e2; - overflow-y: auto; - overflow-x: hidden; - position: fixed; - top: 70px; - bottom: 0; - width: 230px; - word-wrap: normal; } - -.nav-groups { - list-style-type: none; - background: #fff; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #e2e2e2; - font-size: 1.1em; - font-weight: 100; - padding: 15px 0 15px 20px; } - .nav-group-name > a { - color: #333; } - -.nav-group-tasks { - margin-top: 5px; } - -.nav-group-task { - font-size: 0.9em; - list-style-type: none; - white-space: nowrap; } - .nav-group-task a { - color: #888; } - -.main-content { - background-color: #fff; - border: 1px solid #e2e2e2; - margin-left: 246px; - position: absolute; - overflow: hidden; - padding-bottom: 20px; - top: 70px; - width: 734px; } - .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { - margin-bottom: 1em; } - .main-content p { - line-height: 1.8em; } - .main-content section .section:first-child { - margin-top: 0; - padding-top: 0; } - .main-content section .task-group-section .task-group:first-of-type { - padding-top: 10px; } - .main-content section .task-group-section .task-group:first-of-type .section-name { - padding-top: 15px; } - .main-content section .heading:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .main-content .section-name p { - margin-bottom: inherit; - line-height: inherit; } - .main-content .section-name code { - background-color: inherit; - padding: inherit; - color: inherit; } - -.section { - padding: 0 25px; } - -.highlight { - background-color: #eee; - padding: 10px 12px; - border: 1px solid #e2e2e2; - border-radius: 4px; - overflow-x: auto; } - -.declaration .highlight { - overflow-x: initial; - padding: 0 40px 40px 0; - margin-bottom: -25px; - background-color: transparent; - border: none; } - -.section-name { - margin: 0; - margin-left: 18px; } - -.task-group-section { - padding-left: 6px; - border-top: 1px solid #e2e2e2; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - -.section-name-container { - position: relative; - display: inline-block; } - .section-name-container .section-name-link { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - margin-bottom: 0; } - .section-name-container .section-name { - position: relative; - pointer-events: none; - z-index: 1; } - .section-name-container .section-name a { - pointer-events: auto; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .item code { - background-color: transparent; - padding: 0; } - .item .token, .item .direct-link { - padding-left: 3px; - margin-left: 15px; - font-size: 11.9px; - transition: all 300ms; } - .item .token-open { - margin-left: 0px; } - .item .discouraged { - text-decoration: line-through; } - .item .declaration-note { - font-size: .85em; - color: gray; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #e2e2e2; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - background: #f9f9f9; - border-left: 1px solid #e2e2e2; - border-top: 1px solid #e2e2e2; - height: 12px; - left: 21px; - top: -7px; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - position: absolute; - width: 12px; } - -.height-container { - display: none; - left: -25px; - padding: 0 25px; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #f9f9f9; - border-bottom: 1px solid #e2e2e2; - left: -25px; - position: relative; - width: 100%; - padding-top: 10px; - padding-bottom: 5px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4b8afb; } - -.aside-warning, .aside-deprecated, .aside-unavailable { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #e2e2e2; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -#footer { - position: relative; - top: 10px; - bottom: 0px; - margin-left: 25px; } - #footer p { - margin: 0; - color: #aaa; - font-size: 0.8em; } - -html.dash header, html.dash #breadcrumbs, html.dash .sidebar { - display: none; } - -html.dash .main-content { - width: 980px; - margin-left: 0; - border: none; - width: 100%; - top: 0; - padding-bottom: 0; } - -html.dash .height-container { - display: block; } - -html.dash .item .token { - margin-left: 0; } - -html.dash .content-wrapper { - width: auto; } - -html.dash #footer { - position: static; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png deleted file mode 100755 index 29d2f7f..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png deleted file mode 100755 index 6f694c7..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png deleted file mode 100755 index 628da97..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/index.html b/docs/docsets/.docset/Contents/Resources/Documents/index.html deleted file mode 100644 index d73b0a1..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/index.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - Reference - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
- -

LoggingKit

- -

- - Swift 5.0 - - - Carthage Compatible - - - SPM - - - - CI - -

- -

-LoggingKit is a micro framework for logging based on log providers -

-

Features

- -
    -
  • [x] Define your own log providers
  • -
  • [x] Combine ready
  • -
  • [x] Comes with pre-defined OSLogProvider which uses os_log under the hood
  • -
-

Example

- -

The example application is the best way to see LoggingKit in action. Simply open the LoggingKit.xcodeproj and run the Example scheme.

- -

After the application has started you should see several log messages in your Xcode terminal and the Console.app for the device you ran the app on.

-

Installation

-

Carthage

- -

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

- -

To integrate LoggingKit into your Xcode project using Carthage, specify it in your Cartfile:

-
github "alexanderwe/LoggingKit"
-
- -

Run carthage update to build the framework and drag the built LoggingKit.framework into your Xcode project.

- -

On your application targetsโ€™ โ€œBuild Phasesโ€ settings tab, click the โ€œ+โ€ icon and choose โ€œNew Run Script Phaseโ€ and add the Framework path as mentioned in Carthage Getting started Step 4, 5 and 6

-

Swift Package Manager

- -

To integrate using Apple’s Swift Package Manager, add the following as a dependency to your Package.swift:

-
dependencies: [
-    .package(url: "https://github.com/alexanderwe/LoggingKit.git", from: "1.0.0")
-]
-
- -

Alternatively navigate to your Xcode project, select Swift Packages and click the + icon to search for LoggingKit.

-

Manually

- -

If you prefer not to use any of the aforementioned dependency managers, you can integrate LoggingKit into your project manually. Simply drag the Sources Folder into your Xcode project.

-

Usage

- -

At first it makes sense to create an extensions on LogCategories to define your own categories.

-
import LoggingKit
-
-extension LogCategories {
-    public var viewControllers: LogCategory { return .init("viewControllers") }
-    public var networking: LogCategory { return .init("networking") }
-    ...
-}
-
- -

Then register your log providers in the application(application:didFinishLaunchingWithOptions:).

-
import LoggingKit
-
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
-    ...
-
-    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
-
-        LogService.register(logProviders: LogProvider, LogProvider ...)
-
-    }
-
-    ...
-}
-
- -

After that Simply import LoggingKit in the files you want to use the logging methods and use them accordingly

-
import LoggingKit
-
-LogService.shared.debug("Hello Debug", logCategory: \.viewControllers)
-LogService.shared.verbose("Hello Verbose", logCategory: \.viewControllers)
-LogService.shared.info("Hello Info", logCategory: \.viewControllers)
-LogService.shared.warning("Hello Warning", logCategory: \.viewControllers)
-LogService.shared.error("Hello Error", logCategory: \.viewControllers)
-
-
-

Combine

- -

If you are using combine, LoggingKit offers some extensions on the Publisher type to log Self.Output and Self.Failure.

- -

You can choose whichever category you want. The \.combine category is a custom defined one.

-
import LoggingKit
-
-// logs `Self.Output`
-myPublisher.logValue(logType: .info, logCategory: \.combine) {
-    "My Value is \($0)"
-}
-
-// logs `Self.Failure`
-myPublisher.logError(logCategory: \.combine) {
-    "My Error is \($0)"
-}
-
-// logs `Self.Output` as well as `Self.Failure`
-myPublisher.log()
-
-

Providers

- -

The idea behind this small framework is, that you can extend it by writing your own log providers by conforming to the LogProvider protocol. These implementations then can be registered in the LogService.register(providers:) method.

- -

You can find an example LogProvider implementation in ./Example/MyTestLogProvider.swift

-

OSLogProvider

- -

LoggingKit comes with one pre-defined OSLogProvider . It uses os_log under the hood to log your messages. These messages can then be viewed in the Console.app application of your mac and on the console in Xcode.

-
Console App
- -

Open Console.App on your mac, select the device from which you want to view the log messages, to view the messages printed by the OSLogProvider

- -

Console App Screenshot

-

Contributing

- -

Contributions are very welcome ๐Ÿ™Œ

-

License

-
LoggingKit
-Copyright (c) 2020 Alexander WeiรŸ
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
- -
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js deleted file mode 100755 index c31dc05..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js +++ /dev/null @@ -1,59 +0,0 @@ -window.jazzy = {'docset': false} -if (typeof window.dash != 'undefined') { - document.documentElement.className += ' dash' - window.jazzy.docset = true -} -if (navigator.userAgent.match(/xcode/i)) { - document.documentElement.className += ' xcode' - window.jazzy.docset = true -} - -function toggleItem($link, $content) { - var animationDuration = 300; - $link.toggleClass('token-open'); - $content.slideToggle(animationDuration); -} - -function itemLinkToContent($link) { - return $link.parent().parent().next(); -} - -// On doc load + hash-change, open any targetted item -function openCurrentItemIfClosed() { - if (window.jazzy.docset) { - return; - } - var $link = $(`.token[href="${location.hash}"]`); - $content = itemLinkToContent($link); - if ($content.is(':hidden')) { - toggleItem($link, $content); - } -} - -$(openCurrentItemIfClosed); -$(window).on('hashchange', openCurrentItemIfClosed); - -// On item link ('token') click, toggle its discussion -$('.token').on('click', function(event) { - if (window.jazzy.docset) { - return; - } - var $link = $(this); - toggleItem($link, itemLinkToContent($link)); - - // Keeps the document from jumping to the hash. - var href = $link.attr('href'); - if (history.pushState) { - history.pushState({}, '', href); - } else { - location.hash = href; - } - event.preventDefault(); -}); - -// Clicks on links to the current, closed, item need to open the item -$("a:not('.token')").on('click', function() { - if (location == this.href) { - openCurrentItemIfClosed(); - } -}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js deleted file mode 100644 index a1c07fd..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0Undocumented

","parent_name":"OSLogProvider"},"Structs/OSLogProvider.html#/s:10LoggingKit11LogProviderP3log__0E8Category8fileName08functionH010lineNumberyAA0C4TypeO_ypSgyXKs7KeyPathCyAA0C10CategoriesVAA0cF0VGs12StaticStringVATSitF":{"name":"log(_:_:logCategory:fileName:functionName:lineNumber:)","parent_name":"OSLogProvider"},"Structs/LogCategory.html#/s:10LoggingKit11LogCategoryV4_keySSvp":{"name":"_key","abstract":"

Undocumented

","parent_name":"LogCategory"},"Structs/LogCategory.html#/s:10LoggingKit11LogCategoryVyACSScfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"LogCategory"},"Structs/LogCategories.html#/s:10LoggingKit13LogCategoriesVyAA0C8CategoryVs7KeyPathCyAcEGcip":{"name":"subscript(_:)","abstract":"

Undocumented

","parent_name":"LogCategories"},"Structs/LogCategories.html#/s:10LoggingKit13LogCategoriesV7defaultAA0C8CategoryVvp":{"name":"default","abstract":"

Undocumented

","parent_name":"LogCategories"},"Structs/LogCategories.html":{"name":"LogCategories","abstract":"

Container for holding different log categories

"},"Structs/LogCategory.html":{"name":"LogCategory","abstract":"

A representation of a log category

"},"Structs/OSLogProvider.html":{"name":"OSLogProvider","abstract":"

Simple log provider which uses Apple’s Unified Logging System via os_log

"},"Protocols/LogProvider.html#/s:10LoggingKit11LogProviderP3log__0E8Category8fileName08functionH010lineNumberyAA0C4TypeO_ypSgyXKs7KeyPathCyAA0C10CategoriesVAA0cF0VGs12StaticStringVATSitF":{"name":"log(_:_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Process the log message

","parent_name":"LogProvider"},"Protocols/LogProvider.html":{"name":"LogProvider","abstract":"

Undocumented

"},"Extensions/DispatchQueue.html#/s:So17OS_dispatch_queueC10LoggingKitE17currentQueueLabelSSSgvpZ":{"name":"currentQueueLabel","abstract":"

Undocumented

","parent_name":"DispatchQueue"},"Extensions/OSLogType.html#/s:So13os_log_type_ta10LoggingKitE4fromAbC7LogTypeO_tcfc":{"name":"init(from:)","abstract":"

Undocumented

","parent_name":"OSLogType"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE8logError0E8Category12functionName04fileI010lineNumber_AA03AnyB0Vy6OutputQz7FailureQzGs7KeyPathCyAD13LogCategoriesVAD0rG0VG_s12StaticStringVAYSiypSgAOctF":{"name":"logError(logCategory:functionName:fileName:lineNumber:_:)","abstract":"

Publisher which logs the failure value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE8logValue0E4Type0E8Category12functionName04fileJ010lineNumber_AA03AnyB0Vy6OutputQz7FailureQzGAD03LogG0O_s7KeyPathCyAD0Q10CategoriesVAD0qH0VGs12StaticStringVA0_SiypSgANctF":{"name":"logValue(logType:logCategory:functionName:fileName:lineNumber:_:)","abstract":"

Publisher which logs the ouput value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE3log12messageValue0F5Error12valuelogType0E8Category12functionName04fileM010lineNumberAA03AnyB0Vy6OutputQz7FailureQzGypSgAPc_AtRcAD03LogJ0Os7KeyPathCyAD0T10CategoriesVAD0tK0VGs12StaticStringVA3_SitF":{"name":"log(messageValue:messageError:valuelogType:logCategory:functionName:fileName:lineNumber:)","abstract":"

Publisher which both logs the Self.Failure value and the Self.Output value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html":{"name":"Publisher"},"Extensions/OSLogType.html":{"name":"OSLogType"},"Extensions/DispatchQueue.html":{"name":"DispatchQueue"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO4infoyA2CmF":{"name":"info","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO5debugyA2CmF":{"name":"debug","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO7verboseyA2CmF":{"name":"verbose","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO7warningyA2CmF":{"name":"warning","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO5erroryA2CmF":{"name":"error","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"LogType"},"Enums/LogType.html":{"name":"LogType","abstract":"

Different log types

"},"Global%20Variables.html#/s:10LoggingKit0A10CategoriesAA03LogC0Vvp":{"name":"LoggingCategories","abstract":"

Undocumented

"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC6sharedACvpZ":{"name":"shared","abstract":"

Singleton instance of the log service

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC8register12logProvidersyAA0C8Provider_pd_tFZ":{"name":"register(logProviders:)","abstract":"

Undocumented

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC13unregisterAllyyFZ":{"name":"unregisterAll()","abstract":"

Undocumented

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC4info_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"info(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create an info type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC5debug_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"debug(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a debug type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC7verbose_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"verbose(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a verbose type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC7warning_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"warning(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a warning type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC5error_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"error(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create an error type log message

","parent_name":"LogService"},"Classes/LogService.html":{"name":"LogService","abstract":"

Log service

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/docsets/.docset/Contents/Resources/docSet.dsidx b/docs/docsets/.docset/Contents/Resources/docSet.dsidx deleted file mode 100644 index 29647b1..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/docSet.dsidx and /dev/null differ diff --git a/docs/docsets/.tgz b/docs/docsets/.tgz deleted file mode 100644 index 88e7fee..0000000 Binary files a/docs/docsets/.tgz and /dev/null differ diff --git a/docs/img/carat.png b/docs/img/carat.png deleted file mode 100755 index 29d2f7f..0000000 Binary files a/docs/img/carat.png and /dev/null differ diff --git a/docs/img/dash.png b/docs/img/dash.png deleted file mode 100755 index 6f694c7..0000000 Binary files a/docs/img/dash.png and /dev/null differ diff --git a/docs/img/gh.png b/docs/img/gh.png deleted file mode 100755 index 628da97..0000000 Binary files a/docs/img/gh.png and /dev/null differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index d73b0a1..0000000 --- a/docs/index.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - Reference - - - - - - - - - -
-
-

Docs (55% documented)

-
-
-
- -
-
- -
-
-
- -

LoggingKit

- -

- - Swift 5.0 - - - Carthage Compatible - - - SPM - - - - CI - -

- -

-LoggingKit is a micro framework for logging based on log providers -

-

Features

- -
    -
  • [x] Define your own log providers
  • -
  • [x] Combine ready
  • -
  • [x] Comes with pre-defined OSLogProvider which uses os_log under the hood
  • -
-

Example

- -

The example application is the best way to see LoggingKit in action. Simply open the LoggingKit.xcodeproj and run the Example scheme.

- -

After the application has started you should see several log messages in your Xcode terminal and the Console.app for the device you ran the app on.

-

Installation

-

Carthage

- -

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

- -

To integrate LoggingKit into your Xcode project using Carthage, specify it in your Cartfile:

-
github "alexanderwe/LoggingKit"
-
- -

Run carthage update to build the framework and drag the built LoggingKit.framework into your Xcode project.

- -

On your application targetsโ€™ โ€œBuild Phasesโ€ settings tab, click the โ€œ+โ€ icon and choose โ€œNew Run Script Phaseโ€ and add the Framework path as mentioned in Carthage Getting started Step 4, 5 and 6

-

Swift Package Manager

- -

To integrate using Apple’s Swift Package Manager, add the following as a dependency to your Package.swift:

-
dependencies: [
-    .package(url: "https://github.com/alexanderwe/LoggingKit.git", from: "1.0.0")
-]
-
- -

Alternatively navigate to your Xcode project, select Swift Packages and click the + icon to search for LoggingKit.

-

Manually

- -

If you prefer not to use any of the aforementioned dependency managers, you can integrate LoggingKit into your project manually. Simply drag the Sources Folder into your Xcode project.

-

Usage

- -

At first it makes sense to create an extensions on LogCategories to define your own categories.

-
import LoggingKit
-
-extension LogCategories {
-    public var viewControllers: LogCategory { return .init("viewControllers") }
-    public var networking: LogCategory { return .init("networking") }
-    ...
-}
-
- -

Then register your log providers in the application(application:didFinishLaunchingWithOptions:).

-
import LoggingKit
-
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
-    ...
-
-    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
-
-        LogService.register(logProviders: LogProvider, LogProvider ...)
-
-    }
-
-    ...
-}
-
- -

After that Simply import LoggingKit in the files you want to use the logging methods and use them accordingly

-
import LoggingKit
-
-LogService.shared.debug("Hello Debug", logCategory: \.viewControllers)
-LogService.shared.verbose("Hello Verbose", logCategory: \.viewControllers)
-LogService.shared.info("Hello Info", logCategory: \.viewControllers)
-LogService.shared.warning("Hello Warning", logCategory: \.viewControllers)
-LogService.shared.error("Hello Error", logCategory: \.viewControllers)
-
-
-

Combine

- -

If you are using combine, LoggingKit offers some extensions on the Publisher type to log Self.Output and Self.Failure.

- -

You can choose whichever category you want. The \.combine category is a custom defined one.

-
import LoggingKit
-
-// logs `Self.Output`
-myPublisher.logValue(logType: .info, logCategory: \.combine) {
-    "My Value is \($0)"
-}
-
-// logs `Self.Failure`
-myPublisher.logError(logCategory: \.combine) {
-    "My Error is \($0)"
-}
-
-// logs `Self.Output` as well as `Self.Failure`
-myPublisher.log()
-
-

Providers

- -

The idea behind this small framework is, that you can extend it by writing your own log providers by conforming to the LogProvider protocol. These implementations then can be registered in the LogService.register(providers:) method.

- -

You can find an example LogProvider implementation in ./Example/MyTestLogProvider.swift

-

OSLogProvider

- -

LoggingKit comes with one pre-defined OSLogProvider . It uses os_log under the hood to log your messages. These messages can then be viewed in the Console.app application of your mac and on the console in Xcode.

-
Console App
- -

Open Console.App on your mac, select the device from which you want to view the log messages, to view the messages printed by the OSLogProvider

- -

Console App Screenshot

-

Contributing

- -

Contributions are very welcome ๐Ÿ™Œ

-

License

-
LoggingKit
-Copyright (c) 2020 Alexander WeiรŸ
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
- -
-
- -
-
- - - diff --git a/docs/js/jazzy.js b/docs/js/jazzy.js deleted file mode 100755 index c31dc05..0000000 --- a/docs/js/jazzy.js +++ /dev/null @@ -1,59 +0,0 @@ -window.jazzy = {'docset': false} -if (typeof window.dash != 'undefined') { - document.documentElement.className += ' dash' - window.jazzy.docset = true -} -if (navigator.userAgent.match(/xcode/i)) { - document.documentElement.className += ' xcode' - window.jazzy.docset = true -} - -function toggleItem($link, $content) { - var animationDuration = 300; - $link.toggleClass('token-open'); - $content.slideToggle(animationDuration); -} - -function itemLinkToContent($link) { - return $link.parent().parent().next(); -} - -// On doc load + hash-change, open any targetted item -function openCurrentItemIfClosed() { - if (window.jazzy.docset) { - return; - } - var $link = $(`.token[href="${location.hash}"]`); - $content = itemLinkToContent($link); - if ($content.is(':hidden')) { - toggleItem($link, $content); - } -} - -$(openCurrentItemIfClosed); -$(window).on('hashchange', openCurrentItemIfClosed); - -// On item link ('token') click, toggle its discussion -$('.token').on('click', function(event) { - if (window.jazzy.docset) { - return; - } - var $link = $(this); - toggleItem($link, itemLinkToContent($link)); - - // Keeps the document from jumping to the hash. - var href = $link.attr('href'); - if (history.pushState) { - history.pushState({}, '', href); - } else { - location.hash = href; - } - event.preventDefault(); -}); - -// Clicks on links to the current, closed, item need to open the item -$("a:not('.token')").on('click', function() { - if (location == this.href) { - openCurrentItemIfClosed(); - } -}); diff --git a/docs/js/jquery.min.js b/docs/js/jquery.min.js deleted file mode 100644 index a1c07fd..0000000 --- a/docs/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0Undocumented

","parent_name":"OSLogProvider"},"Structs/OSLogProvider.html#/s:10LoggingKit11LogProviderP3log__0E8Category8fileName08functionH010lineNumberyAA0C4TypeO_ypSgyXKs7KeyPathCyAA0C10CategoriesVAA0cF0VGs12StaticStringVATSitF":{"name":"log(_:_:logCategory:fileName:functionName:lineNumber:)","parent_name":"OSLogProvider"},"Structs/LogCategory.html#/s:10LoggingKit11LogCategoryV4_keySSvp":{"name":"_key","abstract":"

Undocumented

","parent_name":"LogCategory"},"Structs/LogCategory.html#/s:10LoggingKit11LogCategoryVyACSScfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"LogCategory"},"Structs/LogCategories.html#/s:10LoggingKit13LogCategoriesVyAA0C8CategoryVs7KeyPathCyAcEGcip":{"name":"subscript(_:)","abstract":"

Undocumented

","parent_name":"LogCategories"},"Structs/LogCategories.html#/s:10LoggingKit13LogCategoriesV7defaultAA0C8CategoryVvp":{"name":"default","abstract":"

Undocumented

","parent_name":"LogCategories"},"Structs/LogCategories.html":{"name":"LogCategories","abstract":"

Container for holding different log categories

"},"Structs/LogCategory.html":{"name":"LogCategory","abstract":"

A representation of a log category

"},"Structs/OSLogProvider.html":{"name":"OSLogProvider","abstract":"

Simple log provider which uses Apple’s Unified Logging System via os_log

"},"Protocols/LogProvider.html#/s:10LoggingKit11LogProviderP3log__0E8Category8fileName08functionH010lineNumberyAA0C4TypeO_ypSgyXKs7KeyPathCyAA0C10CategoriesVAA0cF0VGs12StaticStringVATSitF":{"name":"log(_:_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Process the log message

","parent_name":"LogProvider"},"Protocols/LogProvider.html":{"name":"LogProvider","abstract":"

Undocumented

"},"Extensions/DispatchQueue.html#/s:So17OS_dispatch_queueC10LoggingKitE17currentQueueLabelSSSgvpZ":{"name":"currentQueueLabel","abstract":"

Undocumented

","parent_name":"DispatchQueue"},"Extensions/OSLogType.html#/s:So13os_log_type_ta10LoggingKitE4fromAbC7LogTypeO_tcfc":{"name":"init(from:)","abstract":"

Undocumented

","parent_name":"OSLogType"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE8logError0E8Category12functionName04fileI010lineNumber_AA03AnyB0Vy6OutputQz7FailureQzGs7KeyPathCyAD13LogCategoriesVAD0rG0VG_s12StaticStringVAYSiypSgAOctF":{"name":"logError(logCategory:functionName:fileName:lineNumber:_:)","abstract":"

Publisher which logs the failure value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE8logValue0E4Type0E8Category12functionName04fileJ010lineNumber_AA03AnyB0Vy6OutputQz7FailureQzGAD03LogG0O_s7KeyPathCyAD0Q10CategoriesVAD0qH0VGs12StaticStringVA0_SiypSgANctF":{"name":"logValue(logType:logCategory:functionName:fileName:lineNumber:_:)","abstract":"

Publisher which logs the ouput value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP10LoggingKitE3log12messageValue0F5Error12valuelogType0E8Category12functionName04fileM010lineNumberAA03AnyB0Vy6OutputQz7FailureQzGypSgAPc_AtRcAD03LogJ0Os7KeyPathCyAD0T10CategoriesVAD0tK0VGs12StaticStringVA3_SitF":{"name":"log(messageValue:messageError:valuelogType:logCategory:functionName:fileName:lineNumber:)","abstract":"

Publisher which both logs the Self.Failure value and the Self.Output value of the preceding publisher

","parent_name":"Publisher"},"Extensions/Publisher.html":{"name":"Publisher"},"Extensions/OSLogType.html":{"name":"OSLogType"},"Extensions/DispatchQueue.html":{"name":"DispatchQueue"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO4infoyA2CmF":{"name":"info","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO5debugyA2CmF":{"name":"debug","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO7verboseyA2CmF":{"name":"verbose","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO7warningyA2CmF":{"name":"warning","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:10LoggingKit7LogTypeO5erroryA2CmF":{"name":"error","abstract":"

Undocumented

","parent_name":"LogType"},"Enums/LogType.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"LogType"},"Enums/LogType.html":{"name":"LogType","abstract":"

Different log types

"},"Global%20Variables.html#/s:10LoggingKit0A10CategoriesAA03LogC0Vvp":{"name":"LoggingCategories","abstract":"

Undocumented

"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC6sharedACvpZ":{"name":"shared","abstract":"

Singleton instance of the log service

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC8register12logProvidersyAA0C8Provider_pd_tFZ":{"name":"register(logProviders:)","abstract":"

Undocumented

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC13unregisterAllyyFZ":{"name":"unregisterAll()","abstract":"

Undocumented

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC4info_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"info(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create an info type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC5debug_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"debug(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a debug type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC7verbose_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"verbose(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a verbose type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC7warning_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"warning(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create a warning type log message

","parent_name":"LogService"},"Classes/LogService.html#/s:10LoggingKit10LogServiceC5error_11logCategory8fileName08functionI010lineNumberyypSgyXA_s7KeyPathCyAA0C10CategoriesVAA0cG0VGs12StaticStringVARSitF":{"name":"error(_:logCategory:fileName:functionName:lineNumber:)","abstract":"

Create an error type log message

","parent_name":"LogService"},"Classes/LogService.html":{"name":"LogService","abstract":"

Log service

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json deleted file mode 100644 index b3ced75..0000000 --- a/docs/undocumented.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "warnings": [ - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogCategory.swift", - "line": 16, - "symbol": "LoggingCategories", - "symbol_kind": "source.lang.swift.decl.var.global", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogCategory.swift", - "line": 22, - "symbol": "LogCategories.subscript(_:)", - "symbol_kind": "source.lang.swift.decl.function.subscript", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogCategory.swift", - "line": 29, - "symbol": "LogCategories.default", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogCategory.swift", - "line": 37, - "symbol": "LogCategory._key", - "symbol_kind": "source.lang.swift.decl.var.instance", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogCategory.swift", - "line": 44, - "symbol": "LogCategory.init(_:)", - "symbol_kind": "source.lang.swift.decl.function.method.instance", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogService.swift", - "line": 10, - "symbol": "LogProvider", - "symbol_kind": "source.lang.swift.decl.protocol", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogService.swift", - "line": 45, - "symbol": "LogService.register(logProviders:)", - "symbol_kind": "source.lang.swift.decl.function.method.static", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogService.swift", - "line": 49, - "symbol": "LogService.unregisterAll()", - "symbol_kind": "source.lang.swift.decl.function.method.static", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogType.swift", - "line": 18, - "symbol": "LogType.info", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogType.swift", - "line": 19, - "symbol": "LogType.debug", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogType.swift", - "line": 20, - "symbol": "LogType.verbose", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogType.swift", - "line": 21, - "symbol": "LogType.warning", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/LogType.swift", - "line": 22, - "symbol": "LogType.error", - "symbol_kind": "source.lang.swift.decl.enumelement", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/Providers/OSLogProvider.swift", - "line": 13, - "symbol": "OSLogType.init(from:)", - "symbol_kind": "source.lang.swift.decl.function.method.instance", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/Providers/OSLogProvider.swift", - "line": 36, - "symbol": "OSLogProvider.init()", - "symbol_kind": "source.lang.swift.decl.function.method.instance", - "warning": "undocumented" - }, - { - "file": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit/Sources/Providers/OSLogProvider.swift", - "line": 125, - "symbol": "DispatchQueue.currentQueueLabel", - "symbol_kind": "source.lang.swift.decl.var.static", - "warning": "undocumented" - } - ], - "source_directory": "/Users/alexanderweiss/Documents/Programming/swift-projects/LoggingKit" -} \ No newline at end of file diff --git a/fastlane/.env b/fastlane/.env deleted file mode 100644 index 9f62141..0000000 --- a/fastlane/.env +++ /dev/null @@ -1 +0,0 @@ -FASTLANE_SKIP_UPDATE_CHECK=1 \ No newline at end of file diff --git a/fastlane/Fastfile b/fastlane/Fastfile deleted file mode 100644 index 4419aac..0000000 --- a/fastlane/Fastfile +++ /dev/null @@ -1,117 +0,0 @@ -fastlane_version "2.137.0" - -default_platform :ios - -platform :ios do - - desc "Release a new version of LoggingKit" - lane :release do |options| - # Ensure Git status is clean - ensure_git_status_clean - # Ensure Git branch is master - ensure_git_branch(branch: 'master') - # Perform Dependency-Manager compatibility tests - compatibilityTests - # Perform Tests - tests - # Retrieve Version from options - version = options[:version] - # Increment Version - increment(version: version) - # Add Git Tag - add_git_tag(tag: version) - # Push Git Tag - push_git_tags() - # Push Git commit - push_to_git_remote() - # Pod push / Pod trunk - # pod_push() - end - - desc "Increment Version" - lane :increment do |options| - # Retrieve Version from options - version = options[:version] - # Set Podspec version - #version_bump_podspec( - # path: "LoggingKit.podspec", - # version_number: version - #) - # Set Framework plist version - set_info_plist_value( - path: "Configs/LoggingKit.plist", - key: "CFBundleShortVersionString", - value: version - ) - # Set Framework Tests plist version - set_info_plist_value( - path: "Configs/LoggingKitTests.plist", - key: "CFBundleShortVersionString", - value: version - ) - # Set Example plist version - set_info_plist_value( - path: "Example/Resources/Info.plist", - key: "CFBundleShortVersionString", - value: version - ) - # Commit modified files - git_commit( - path: [ - "Configs/LoggingKit.plist", - "Configs/LoggingKitTests.plist", - "Example/Resources/Info.plist" - ], - message: "chore: LoggingKit Version #{version} ๐Ÿš€" - ) - end - - desc "Runs tests" - lane :tests do - # Perform iOS Tests - scan( - project: "LoggingKit.xcodeproj", - scheme: "LoggingKit-iOS", - clean: true, - destination: "platform=iOS Simulator,name=iPhone 11,OS=14.2" - ) - # Perform tvOS Tests - scan( - project: "LoggingKit.xcodeproj", - scheme: "LoggingKit-tvOS", - clean: true, - destination: "platform=tvOS Simulator,name=Apple TV,OS=14.2" - ) - # Perform macOS Tests - scan( - project: "LoggingKit.xcodeproj", - scheme: "LoggingKit-macOS", - clean: true, - destination: "platform=OS X,arch=x86_64" - ) - end - - desc "Run Dependency-Manager compatibility tests" - lane :compatibilityTests do - # Carthage build to ensure Carthage compatibility - # carthage( - # command: "build", - # no_skip_current: true, - # cache_builds: true - #) - # Pod lib lint to ensure CocoaPods compatibility - # pod_lib_lint(allow_warnings: true) - # SPM Build to ensure Swift Package Manager compatibility - spm(command: "build") - # Delete SPM build artifacts - spm(command: "clean") - end - - lane :documentation do - jazzy - end - -end - - - diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..4091fee --- /dev/null +++ b/mise.toml @@ -0,0 +1,8 @@ +[tools] +swiftformat = "0.61.1" +swiftlint = "0.65.0" +xcbeautify = "3.2.1" + +[settings] # project-local settings +# Lock file enabled +lockfile = true