COMMIT TEST
3
.gitignore
vendored
|
|
@ -42,7 +42,7 @@ CHANGELOG.md
|
||||||
.env.local
|
.env.local
|
||||||
android/
|
android/
|
||||||
HEATING_OPTIMIZATIONS.md
|
HEATING_OPTIMIZATIONS.md
|
||||||
ios
|
|
||||||
android
|
android
|
||||||
sliderreadme.md
|
sliderreadme.md
|
||||||
.cursor/mcp.json
|
.cursor/mcp.json
|
||||||
|
|
@ -53,3 +53,4 @@ hackintosh-emulator-fix.sh
|
||||||
/ota-builds
|
/ota-builds
|
||||||
src/screens/xavio.md
|
src/screens/xavio.md
|
||||||
/nuvio-providers
|
/nuvio-providers
|
||||||
|
/KSPlayer
|
||||||
46
assets/bootsplash/ios/BootSplash.storyboard
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
|
||||||
|
<capability name="Named colors" minToolsVersion="9.0"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--View Controller-->
|
||||||
|
<scene sceneID="EHf-IW-A2E">
|
||||||
|
<objects>
|
||||||
|
<viewController modalTransitionStyle="crossDissolve" id="01J-lp-oVM" sceneMemberID="viewController">
|
||||||
|
<view key="view" autoresizesSubviews="NO" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView autoresizesSubviews="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" image="BootSplashLogo-7d142f" translatesAutoresizingMaskIntoConstraints="NO" id="3lX-Ut-9ad">
|
||||||
|
<rect key="frame" x="127.5" y="273.5" width="120" height="120"/>
|
||||||
|
<accessibility key="accessibilityConfiguration">
|
||||||
|
<accessibilityTraits key="traits" image="YES" notEnabled="YES"/>
|
||||||
|
</accessibility>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||||
|
<color key="backgroundColor" name="BootSplashBackground-7d142f"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="3lX-Ut-9ad" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="Fh9-Fy-1nT"/>
|
||||||
|
<constraint firstItem="3lX-Ut-9ad" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="nvB-Ic-PnI"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="0.0" y="0.0"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<image name="BootSplashLogo-7d142f" width="120" height="120"/>
|
||||||
|
<namedColor name="BootSplashBackground-7d142f">
|
||||||
|
<color red="0.00784313725490196" green="0.0156862745098039" blue="0.0156862745098039" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</namedColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"colors": [
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"color": {
|
||||||
|
"color-space": "srgb",
|
||||||
|
"components": {
|
||||||
|
"blue": "0.0156862745098039",
|
||||||
|
"green": "0.0156862745098039",
|
||||||
|
"red": "0.00784313725490196",
|
||||||
|
"alpha": "1.000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"author": "xcode",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
23
assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "logo-7d142f.png",
|
||||||
|
"scale": "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "logo-7d142f@2x.png",
|
||||||
|
"scale": "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "logo-7d142f@3x.png",
|
||||||
|
"scale": "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"author": "xcode",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f.png
vendored
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 13 KiB |
2
ios/.bundle/config
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
---
|
||||||
|
BUNDLE_PATH: "vendor/bundle"
|
||||||
30
ios/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
.xcode.env.local
|
||||||
|
|
||||||
|
# Bundle artifacts
|
||||||
|
*.jsbundle
|
||||||
|
|
||||||
|
# CocoaPods
|
||||||
|
/Pods/
|
||||||
11
ios/.xcode.env
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# This `.xcode.env` file is versioned and is used to source the environment
|
||||||
|
# used when running script phases inside Xcode.
|
||||||
|
# To customize your local environment, you can create an `.xcode.env.local`
|
||||||
|
# file that is not versioned.
|
||||||
|
|
||||||
|
# NODE_BINARY variable contains the PATH to the node executable.
|
||||||
|
#
|
||||||
|
# Customize the NODE_BINARY variable here.
|
||||||
|
# For example, to use nvm with brew, add the following line
|
||||||
|
# . "$(brew --prefix nvm)/nvm.sh" --no-use
|
||||||
|
export NODE_BINARY=$(command -v node)
|
||||||
3
ios/Gemfile
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'xcodeproj', '~> 1.24'
|
||||||
30
ios/Gemfile.lock
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
CFPropertyList (3.0.7)
|
||||||
|
base64
|
||||||
|
nkf
|
||||||
|
rexml
|
||||||
|
atomos (0.1.3)
|
||||||
|
base64 (0.3.0)
|
||||||
|
claide (1.1.0)
|
||||||
|
colored2 (3.1.2)
|
||||||
|
nanaimo (0.4.0)
|
||||||
|
nkf (0.2.0)
|
||||||
|
rexml (3.4.4)
|
||||||
|
xcodeproj (1.27.0)
|
||||||
|
CFPropertyList (>= 2.3.3, < 4.0)
|
||||||
|
atomos (~> 0.1.3)
|
||||||
|
claide (>= 1.0.2, < 2.0)
|
||||||
|
colored2 (~> 3.1)
|
||||||
|
nanaimo (~> 0.4.0)
|
||||||
|
rexml (>= 3.3.6, < 4.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
xcodeproj (~> 1.24)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.17.2
|
||||||
609
ios/Nuvio.xcodeproj/project.pbxproj
Normal file
|
|
@ -0,0 +1,609 @@
|
||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 46;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
||||||
|
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
|
||||||
|
4A452C8AF8F8464E8F6C4499 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F4D4C2B75D490FA484DF2F /* noop-file.swift */; };
|
||||||
|
53A1AFA19BDA4A9CEC2C0758 /* KSPlayerViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */; };
|
||||||
|
554BC3EE7AB3699FD2A5F6A6 /* KSPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */; };
|
||||||
|
6A3072369CBE46F6A5531727 /* KSPlayerModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1859BB4D441C265493A728B0 /* KSPlayerModule.swift */; };
|
||||||
|
96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */; };
|
||||||
|
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
|
||||||
|
B1EEE41563DBC5313A090C06 /* KSPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 677190A93C7E1E59AC68D165 /* KSPlayerManager.m */; };
|
||||||
|
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
|
||||||
|
C7F40B0D74A68CE28765494D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
02F4D4C2B75D490FA484DF2F /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Nuvio/noop-file.swift"; sourceTree = "<group>"; };
|
||||||
|
13B07F961A680F5B00A75B9A /* Nuvio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Nuvio.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Nuvio/AppDelegate.h; sourceTree = "<group>"; };
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Nuvio/AppDelegate.mm; sourceTree = "<group>"; };
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Nuvio/Images.xcassets; sourceTree = "<group>"; };
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Nuvio/Info.plist; sourceTree = "<group>"; };
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Nuvio/main.m; sourceTree = "<group>"; };
|
||||||
|
1859BB4D441C265493A728B0 /* KSPlayerModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerModule.swift; path = Nuvio/KSPlayerModule.swift; sourceTree = "<group>"; };
|
||||||
|
1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerViewManager.swift; path = Nuvio/KSPlayerViewManager.swift; sourceTree = "<group>"; };
|
||||||
|
1F4096E3944543A28521AEEE /* Nuvio-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "Nuvio-Bridging-Header.h"; path = "Nuvio/Nuvio-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
677190A93C7E1E59AC68D165 /* KSPlayerManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KSPlayerManager.m; path = Nuvio/KSPlayerManager.m; sourceTree = "<group>"; };
|
||||||
|
6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.debug.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.release.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||||
|
94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerView.swift; path = Nuvio/KSPlayerView.swift; sourceTree = "<group>"; };
|
||||||
|
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Nuvio/SplashScreen.storyboard; sourceTree = "<group>"; };
|
||||||
|
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
|
||||||
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
||||||
|
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
13B07FAE1A68108700A75B9A /* Nuvio */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
BB2F792B24A3F905000567C9 /* Supporting */,
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.mm */,
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */,
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */,
|
||||||
|
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
|
||||||
|
02F4D4C2B75D490FA484DF2F /* noop-file.swift */,
|
||||||
|
1F4096E3944543A28521AEEE /* Nuvio-Bridging-Header.h */,
|
||||||
|
88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */,
|
||||||
|
94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */,
|
||||||
|
1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */,
|
||||||
|
677190A93C7E1E59AC68D165 /* KSPlayerManager.m */,
|
||||||
|
1859BB4D441C265493A728B0 /* KSPlayerModule.swift */,
|
||||||
|
);
|
||||||
|
name = Nuvio;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
||||||
|
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
);
|
||||||
|
name = Libraries;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
83CBB9F61A601CBA00E9B192 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07FAE1A68108700A75B9A /* Nuvio */,
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */,
|
||||||
|
2D16E6871FA4F8E400B85C8A /* Frameworks */,
|
||||||
|
D65327D7A22EEC0BE12398D9 /* Pods */,
|
||||||
|
D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */,
|
||||||
|
);
|
||||||
|
indentWidth = 2;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
tabWidth = 2;
|
||||||
|
usesTabs = 0;
|
||||||
|
};
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07F961A680F5B00A75B9A /* Nuvio.app */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
92DBD88DE9BF7D494EA9DA96 /* Nuvio */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */,
|
||||||
|
);
|
||||||
|
name = Nuvio;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
BB2F792B24A3F905000567C9 /* Supporting */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
BB2F792C24A3F905000567C9 /* Expo.plist */,
|
||||||
|
);
|
||||||
|
name = Supporting;
|
||||||
|
path = Nuvio/Supporting;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D65327D7A22EEC0BE12398D9 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */,
|
||||||
|
7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
92DBD88DE9BF7D494EA9DA96 /* Nuvio */,
|
||||||
|
);
|
||||||
|
name = ExpoModulesProviders;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
13B07F861A680F5B00A75B9A /* Nuvio */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Nuvio" */;
|
||||||
|
buildPhases = (
|
||||||
|
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
|
||||||
|
1AF4057A2E2F0FE927F61E3C /* [Expo] Configure project */,
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */,
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||||
|
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
|
||||||
|
3F8163D8C03947BCA4B429B4 /* Upload Debug Symbols to Sentry */,
|
||||||
|
183E75605458C347967551DC /* [CP] Embed Pods Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = Nuvio;
|
||||||
|
productName = Nuvio;
|
||||||
|
productReference = 13B07F961A680F5B00A75B9A /* Nuvio.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 1130;
|
||||||
|
TargetAttributes = {
|
||||||
|
13B07F861A680F5B00A75B9A = {
|
||||||
|
DevelopmentTeam = NLXTHANK2N;
|
||||||
|
LastSwiftMigration = 1250;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Nuvio" */;
|
||||||
|
compatibilityVersion = "Xcode 3.2";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 83CBB9F61A601CBA00E9B192;
|
||||||
|
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
13B07F861A680F5B00A75B9A /* Nuvio */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
||||||
|
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
|
||||||
|
C7F40B0D74A68CE28765494D /* PrivacyInfo.xcprivacy in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Bundle React Native code and images";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n/bin/sh `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"` `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
|
||||||
|
};
|
||||||
|
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Nuvio-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
183E75605458C347967551DC /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh",
|
||||||
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/MobileVLCKit/MobileVLCKit.framework/MobileVLCKit",
|
||||||
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MobileVLCKit.framework",
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
1AF4057A2E2F0FE927F61E3C /* [Expo] Configure project */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "[Expo] Configure project";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Nuvio/expo-configure-project.sh\"\n";
|
||||||
|
};
|
||||||
|
3F8163D8C03947BCA4B429B4 /* Upload Debug Symbols to Sentry */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Upload Debug Symbols to Sentry";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "/bin/sh `${NODE_BINARY:-node} --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode-debug-files.sh'\"`";
|
||||||
|
};
|
||||||
|
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-resources.sh",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoLocalization/ExpoLocalization_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/KSPlayer/KSPlayer_KSPlayer.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/LottiePrivacyInfo.bundle",
|
||||||
|
"${PODS_CONFIGURATION_BUILD_DIR}/lottie-react-native/Lottie_React_Native_Privacy.bundle",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoLocalization_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/KSPlayer_KSPlayer.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/LottiePrivacyInfo.bundle",
|
||||||
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Lottie_React_Native_Privacy.bundle",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
||||||
|
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
|
||||||
|
4A452C8AF8F8464E8F6C4499 /* noop-file.swift in Sources */,
|
||||||
|
554BC3EE7AB3699FD2A5F6A6 /* KSPlayerView.swift in Sources */,
|
||||||
|
53A1AFA19BDA4A9CEC2C0758 /* KSPlayerViewManager.swift in Sources */,
|
||||||
|
B1EEE41563DBC5313A090C06 /* KSPlayerManager.m in Sources */,
|
||||||
|
6A3072369CBE46F6A5531727 /* KSPlayerModule.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = NLXTHANK2N;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"FB_SONARKIT_ENABLED=1",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = Nuvio/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
|
||||||
|
PRODUCT_NAME = Nuvio;
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = NLXTHANK2N;
|
||||||
|
INFOPLIST_FILE = Nuvio/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
|
||||||
|
PRODUCT_NAME = Nuvio;
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||||
|
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 = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
||||||
|
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
" ",
|
||||||
|
);
|
||||||
|
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
||||||
|
USE_HERMES = true;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = YES;
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
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 = 15.1;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
||||||
|
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"$(inherited)",
|
||||||
|
" ",
|
||||||
|
);
|
||||||
|
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
USE_HERMES = true;
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Nuvio" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */,
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Nuvio" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */,
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
}
|
||||||
88
ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1130"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "Nuvio.app"
|
||||||
|
BlueprintName = "Nuvio"
|
||||||
|
ReferencedContainer = "container:Nuvio.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
|
||||||
|
BuildableName = "NuvioTests.xctest"
|
||||||
|
BlueprintName = "NuvioTests"
|
||||||
|
ReferencedContainer = "container:Nuvio.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "Nuvio.app"
|
||||||
|
BlueprintName = "Nuvio"
|
||||||
|
ReferencedContainer = "container:Nuvio.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "Nuvio.app"
|
||||||
|
BlueprintName = "Nuvio"
|
||||||
|
ReferencedContainer = "container:Nuvio.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
10
ios/Nuvio.xcworkspace/contents.xcworkspacedata
generated
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:Nuvio.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
7
ios/Nuvio/AppDelegate.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#import <RCTAppDelegate.h>
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import <Expo/Expo.h>
|
||||||
|
|
||||||
|
@interface AppDelegate : EXAppDelegateWrapper
|
||||||
|
|
||||||
|
@end
|
||||||
62
ios/Nuvio/AppDelegate.mm
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
#import <React/RCTBundleURLProvider.h>
|
||||||
|
#import <React/RCTLinkingManager.h>
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
|
||||||
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||||
|
{
|
||||||
|
self.moduleName = @"main";
|
||||||
|
|
||||||
|
// You can add your custom initial props in the dictionary below.
|
||||||
|
// They will be passed down to the ViewController used by React Native.
|
||||||
|
self.initialProps = @{};
|
||||||
|
|
||||||
|
return [super application:application didFinishLaunchingWithOptions:launchOptions];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
||||||
|
{
|
||||||
|
return [self bundleURL];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *)bundleURL
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
|
||||||
|
#else
|
||||||
|
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linking API
|
||||||
|
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
|
||||||
|
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Universal Links
|
||||||
|
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
|
||||||
|
BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
|
||||||
|
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
|
||||||
|
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
||||||
|
{
|
||||||
|
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
|
||||||
|
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
||||||
|
{
|
||||||
|
return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
|
||||||
|
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
|
||||||
|
{
|
||||||
|
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
After Width: | Height: | Size: 216 KiB |
14
ios/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"filename": "App-Icon-1024x1024@1x.png",
|
||||||
|
"idiom": "universal",
|
||||||
|
"platform": "ios",
|
||||||
|
"size": "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"version": 1,
|
||||||
|
"author": "expo"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
ios/Nuvio/Images.xcassets/Contents.json
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "expo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"colors": [
|
||||||
|
{
|
||||||
|
"color": {
|
||||||
|
"components": {
|
||||||
|
"alpha": "1.000",
|
||||||
|
"blue": "0.0156862745098039",
|
||||||
|
"green": "0.0156862745098039",
|
||||||
|
"red": "0.00784313725490196"
|
||||||
|
},
|
||||||
|
"color-space": "srgb"
|
||||||
|
},
|
||||||
|
"idiom": "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"version": 1,
|
||||||
|
"author": "expo"
|
||||||
|
}
|
||||||
|
}
|
||||||
23
ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "image.png",
|
||||||
|
"scale": "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "image@2x.png",
|
||||||
|
"scale": "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "image@3x.png",
|
||||||
|
"scale": "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"version": 1,
|
||||||
|
"author": "expo"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png
vendored
Normal file
|
After Width: | Height: | Size: 263 KiB |
BIN
ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 263 KiB |
BIN
ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 263 KiB |
99
ios/Nuvio/Info.plist
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
<true/>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>Nuvio</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>stremioexpo</string>
|
||||||
|
<string>com.nuvio.app</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>exp+nuvio</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>12</string>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>12.0</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>NSBonjourServices</key>
|
||||||
|
<array>
|
||||||
|
<string>_http._tcp</string>
|
||||||
|
</array>
|
||||||
|
<key>NSLocalNetworkUsageDescription</key>
|
||||||
|
<string>App uses the local network to discover and connect to devices.</string>
|
||||||
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
|
<string>This app does not require microphone access.</string>
|
||||||
|
<key>RCTRootViewBackgroundColor</key>
|
||||||
|
<integer>4278322180</integer>
|
||||||
|
<key>UIBackgroundModes</key>
|
||||||
|
<array>
|
||||||
|
<string>audio</string>
|
||||||
|
</array>
|
||||||
|
<key>UIFileSharingEnabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>SplashScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
</array>
|
||||||
|
<key>UIRequiresFullScreen</key>
|
||||||
|
<false/>
|
||||||
|
<key>UIStatusBarStyle</key>
|
||||||
|
<string>UIStatusBarStyleDefault</string>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UIUserInterfaceStyle</key>
|
||||||
|
<string>Dark</string>
|
||||||
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
41
ios/Nuvio/KSPlayerManager.m
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
//
|
||||||
|
// KSPlayerManager.m
|
||||||
|
// Nuvio
|
||||||
|
//
|
||||||
|
// Created by KSPlayer integration
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <React/RCTViewManager.h>
|
||||||
|
#import <React/RCTBridgeModule.h>
|
||||||
|
#import <React/RCTEventEmitter.h>
|
||||||
|
|
||||||
|
@interface RCT_EXTERN_MODULE(KSPlayerViewManager, RCTViewManager)
|
||||||
|
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(source, NSDictionary)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(paused, BOOL)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(volume, NSNumber)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(audioTrack, NSNumber)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(textTrack, NSNumber)
|
||||||
|
|
||||||
|
// Event properties
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onLoad, RCTDirectEventBlock)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onProgress, RCTDirectEventBlock)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onBuffering, RCTDirectEventBlock)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onEnd, RCTDirectEventBlock)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(onBufferingProgress, RCTDirectEventBlock)
|
||||||
|
|
||||||
|
RCT_EXTERN_METHOD(seek:(nonnull NSNumber *)node toTime:(nonnull NSNumber *)time)
|
||||||
|
RCT_EXTERN_METHOD(setSource:(nonnull NSNumber *)node source:(nonnull NSDictionary *)source)
|
||||||
|
RCT_EXTERN_METHOD(setPaused:(nonnull NSNumber *)node paused:(BOOL)paused)
|
||||||
|
RCT_EXTERN_METHOD(setVolume:(nonnull NSNumber *)node volume:(nonnull NSNumber *)volume)
|
||||||
|
RCT_EXTERN_METHOD(setAudioTrack:(nonnull NSNumber *)node trackId:(nonnull NSNumber *)trackId)
|
||||||
|
RCT_EXTERN_METHOD(setTextTrack:(nonnull NSNumber *)node trackId:(nonnull NSNumber *)trackId)
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface RCT_EXTERN_MODULE(KSPlayerModule, RCTEventEmitter)
|
||||||
|
|
||||||
|
RCT_EXTERN_METHOD(getTracks:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
||||||
|
|
||||||
|
@end
|
||||||
36
ios/Nuvio/KSPlayerModule.swift
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
//
|
||||||
|
// KSPlayerModule.swift
|
||||||
|
// Nuvio
|
||||||
|
//
|
||||||
|
// Created by KSPlayer integration
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import KSPlayer
|
||||||
|
import React
|
||||||
|
|
||||||
|
@objc(KSPlayerModule)
|
||||||
|
class KSPlayerModule: RCTEventEmitter {
|
||||||
|
override static func requiresMainQueueSetup() -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override func supportedEvents() -> [String]! {
|
||||||
|
return [
|
||||||
|
"KSPlayer-onLoad",
|
||||||
|
"KSPlayer-onProgress",
|
||||||
|
"KSPlayer-onBuffering",
|
||||||
|
"KSPlayer-onEnd",
|
||||||
|
"KSPlayer-onError"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func getTracks(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
||||||
|
// This method can be expanded to get track information
|
||||||
|
// For now, return empty tracks
|
||||||
|
resolve([
|
||||||
|
"audioTracks": [],
|
||||||
|
"textTracks": []
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
281
ios/Nuvio/KSPlayerView.swift
Normal file
|
|
@ -0,0 +1,281 @@
|
||||||
|
//
|
||||||
|
// KSPlayerView.swift
|
||||||
|
// Nuvio
|
||||||
|
//
|
||||||
|
// Created by KSPlayer integration
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import KSPlayer
|
||||||
|
import React
|
||||||
|
|
||||||
|
@objc(KSPlayerView)
|
||||||
|
class KSPlayerView: UIView {
|
||||||
|
private var playerView: IOSVideoPlayerView!
|
||||||
|
private var currentSource: NSDictionary?
|
||||||
|
private var isPaused = false
|
||||||
|
private var currentVolume: Float = 1.0
|
||||||
|
weak var viewManager: KSPlayerViewManager?
|
||||||
|
|
||||||
|
// Event blocks for Fabric
|
||||||
|
@objc var onLoad: RCTDirectEventBlock?
|
||||||
|
@objc var onProgress: RCTDirectEventBlock?
|
||||||
|
@objc var onBuffering: RCTDirectEventBlock?
|
||||||
|
@objc var onEnd: RCTDirectEventBlock?
|
||||||
|
@objc var onError: RCTDirectEventBlock?
|
||||||
|
@objc var onBufferingProgress: RCTDirectEventBlock?
|
||||||
|
|
||||||
|
// Property setters that React Native will call
|
||||||
|
@objc var source: NSDictionary? {
|
||||||
|
didSet {
|
||||||
|
if let source = source {
|
||||||
|
setSource(source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc var paused: Bool = false {
|
||||||
|
didSet {
|
||||||
|
setPaused(paused)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc var volume: NSNumber = 1.0 {
|
||||||
|
didSet {
|
||||||
|
setVolume(volume.floatValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc var audioTrack: NSNumber = -1 {
|
||||||
|
didSet {
|
||||||
|
setAudioTrack(audioTrack.intValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc var textTrack: NSNumber = -1 {
|
||||||
|
didSet {
|
||||||
|
setTextTrack(textTrack.intValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
setupPlayerView()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
setupPlayerView()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupPlayerView() {
|
||||||
|
playerView = IOSVideoPlayerView()
|
||||||
|
playerView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
addSubview(playerView)
|
||||||
|
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
playerView.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
playerView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
||||||
|
playerView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
|
playerView.bottomAnchor.constraint(equalTo: bottomAnchor)
|
||||||
|
])
|
||||||
|
|
||||||
|
// Set up player delegates and callbacks
|
||||||
|
setupPlayerCallbacks()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupPlayerCallbacks() {
|
||||||
|
// Set up the player layer delegate
|
||||||
|
playerView.playerLayer?.delegate = self
|
||||||
|
|
||||||
|
// Configure KSOptions (use static defaults where required)
|
||||||
|
KSOptions.isAutoPlay = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSource(_ source: NSDictionary) {
|
||||||
|
currentSource = source
|
||||||
|
|
||||||
|
guard let uri = source["uri"] as? String else {
|
||||||
|
print("KSPlayerView: No URI provided")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var headers: [String: String] = [:]
|
||||||
|
if let headersDict = source["headers"] as? [String: String] {
|
||||||
|
headers = headersDict
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create KSPlayerResource
|
||||||
|
let url = URL(string: uri)!
|
||||||
|
let resource = KSPlayerResource(url: url, options: createOptions(with: headers), name: "Video")
|
||||||
|
|
||||||
|
print("KSPlayerView: Setting source: \(uri)")
|
||||||
|
playerView.set(resource: resource)
|
||||||
|
|
||||||
|
// Apply current state
|
||||||
|
if isPaused {
|
||||||
|
playerView.pause()
|
||||||
|
} else {
|
||||||
|
playerView.play()
|
||||||
|
}
|
||||||
|
|
||||||
|
setVolume(currentVolume)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func createOptions(with headers: [String: String]) -> KSOptions {
|
||||||
|
let options = KSOptions()
|
||||||
|
options.hardwareDecode = KSOptions.hardwareDecode
|
||||||
|
if !headers.isEmpty {
|
||||||
|
options.appendHeader(headers)
|
||||||
|
if let referer = headers["Referer"] ?? headers["referer"] {
|
||||||
|
options.referer = referer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
|
func setPaused(_ paused: Bool) {
|
||||||
|
isPaused = paused
|
||||||
|
if paused {
|
||||||
|
playerView.pause()
|
||||||
|
} else {
|
||||||
|
playerView.play()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setVolume(_ volume: Float) {
|
||||||
|
currentVolume = volume
|
||||||
|
playerView.playerLayer?.player.playbackVolume = volume
|
||||||
|
}
|
||||||
|
|
||||||
|
func seek(to time: TimeInterval) {
|
||||||
|
playerView.seek(time: time) { _ in }
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAudioTrack(_ trackId: Int) {
|
||||||
|
if let player = playerView.playerLayer?.player {
|
||||||
|
let audioTracks = player.tracks(mediaType: .audio)
|
||||||
|
if trackId >= 0 && trackId < audioTracks.count {
|
||||||
|
// Enable only the selected track
|
||||||
|
for (index, track) in audioTracks.enumerated() {
|
||||||
|
track.isEnabled = (index == trackId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setTextTrack(_ trackId: Int) {
|
||||||
|
if let player = playerView.playerLayer?.player {
|
||||||
|
let textTracks = player.tracks(mediaType: .subtitle)
|
||||||
|
if trackId >= 0 && trackId < textTracks.count {
|
||||||
|
for (index, track) in textTracks.enumerated() {
|
||||||
|
track.isEnabled = (index == trackId)
|
||||||
|
}
|
||||||
|
} else if trackId == -1 {
|
||||||
|
// Disable all subtitles
|
||||||
|
for track in textTracks { track.isEnabled = false }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current player state for React Native
|
||||||
|
func getCurrentState() -> [String: Any] {
|
||||||
|
guard let player = playerView.playerLayer?.player else {
|
||||||
|
return [:]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
"currentTime": player.currentPlaybackTime,
|
||||||
|
"duration": player.duration,
|
||||||
|
"buffered": player.playableTime,
|
||||||
|
"isPlaying": !isPaused,
|
||||||
|
"volume": currentVolume
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension KSPlayerView: KSPlayerLayerDelegate {
|
||||||
|
func player(layer: KSPlayerLayer, state: KSPlayerState) {
|
||||||
|
switch state {
|
||||||
|
case .readyToPlay:
|
||||||
|
// Send onLoad event to React Native
|
||||||
|
let p = layer.player
|
||||||
|
sendEvent("onLoad", [
|
||||||
|
"duration": p.duration,
|
||||||
|
"currentTime": p.currentPlaybackTime,
|
||||||
|
"naturalSize": [
|
||||||
|
"width": p.naturalSize.width,
|
||||||
|
"height": p.naturalSize.height
|
||||||
|
]
|
||||||
|
])
|
||||||
|
case .buffering:
|
||||||
|
sendEvent("onBuffering", ["isBuffering": true])
|
||||||
|
case .bufferFinished:
|
||||||
|
sendEvent("onBuffering", ["isBuffering": false])
|
||||||
|
case .playedToTheEnd:
|
||||||
|
sendEvent("onEnd", [:])
|
||||||
|
case .error:
|
||||||
|
// Error will be handled by the finish delegate method
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func player(layer: KSPlayerLayer, currentTime: TimeInterval, totalTime: TimeInterval) {
|
||||||
|
let p = layer.player
|
||||||
|
sendEvent("onProgress", [
|
||||||
|
"currentTime": currentTime,
|
||||||
|
"duration": totalTime,
|
||||||
|
"bufferTime": p.playableTime
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
func player(layer: KSPlayerLayer, finish error: Error?) {
|
||||||
|
if let error = error {
|
||||||
|
sendEvent("onError", ["error": error.localizedDescription])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func player(layer: KSPlayerLayer, bufferedCount: Int, consumeTime: TimeInterval) {
|
||||||
|
// Handle buffering progress if needed
|
||||||
|
sendEvent("onBufferingProgress", [
|
||||||
|
"bufferedCount": bufferedCount,
|
||||||
|
"consumeTime": consumeTime
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension KSPlayerView {
|
||||||
|
private func sendEvent(_ eventName: String, _ body: [String: Any]) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
switch eventName {
|
||||||
|
case "onLoad":
|
||||||
|
self.onLoad?(body)
|
||||||
|
case "onProgress":
|
||||||
|
self.onProgress?(body)
|
||||||
|
case "onBuffering":
|
||||||
|
self.onBuffering?(body)
|
||||||
|
case "onEnd":
|
||||||
|
self.onEnd?([:])
|
||||||
|
case "onError":
|
||||||
|
self.onError?(body)
|
||||||
|
case "onBufferingProgress":
|
||||||
|
self.onBufferingProgress?(body)
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Renamed to avoid clashing with React's UIView category method
|
||||||
|
private func findHostViewController() -> UIViewController? {
|
||||||
|
var responder: UIResponder? = self
|
||||||
|
while let nextResponder = responder?.next {
|
||||||
|
if let viewController = nextResponder as? UIViewController {
|
||||||
|
return viewController
|
||||||
|
}
|
||||||
|
responder = nextResponder
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
88
ios/Nuvio/KSPlayerViewManager.swift
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
//
|
||||||
|
// KSPlayerViewManager.swift
|
||||||
|
// Nuvio
|
||||||
|
//
|
||||||
|
// Created by KSPlayer integration
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import KSPlayer
|
||||||
|
import React
|
||||||
|
|
||||||
|
@objc(KSPlayerViewManager)
|
||||||
|
class KSPlayerViewManager: RCTViewManager {
|
||||||
|
|
||||||
|
// Not needed for RCTViewManager-based views; events are exported via RCT_EXPORT_VIEW_PROPERTY
|
||||||
|
override func view() -> UIView! {
|
||||||
|
let view = KSPlayerView()
|
||||||
|
view.viewManager = self
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
override static func requiresMainQueueSetup() -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override func constantsToExport() -> [AnyHashable : Any]! {
|
||||||
|
return [
|
||||||
|
"EventTypes": [
|
||||||
|
"onLoad": "onLoad",
|
||||||
|
"onProgress": "onProgress",
|
||||||
|
"onBuffering": "onBuffering",
|
||||||
|
"onEnd": "onEnd",
|
||||||
|
"onError": "onError",
|
||||||
|
"onBufferingProgress": "onBufferingProgress"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// No-op: events are sent via direct event blocks on the view
|
||||||
|
|
||||||
|
@objc func seek(_ node: NSNumber, toTime time: NSNumber) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.seek(to: TimeInterval(truncating: time))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func setSource(_ node: NSNumber, source: NSDictionary) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.setSource(source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func setPaused(_ node: NSNumber, paused: Bool) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.setPaused(paused)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func setVolume(_ node: NSNumber, volume: NSNumber) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.setVolume(Float(truncating: volume))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func setAudioTrack(_ node: NSNumber, trackId: NSNumber) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.setAudioTrack(Int(truncating: trackId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func setTextTrack(_ node: NSNumber, trackId: NSNumber) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
|
||||||
|
view.setTextTrack(Int(truncating: trackId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
ios/Nuvio/Nuvio-Bridging-Header.h
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
//
|
||||||
|
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||||
|
//
|
||||||
|
|
||||||
|
// React Native imports for bridge
|
||||||
|
#import <React/RCTBridgeModule.h>
|
||||||
|
#import <React/RCTViewManager.h>
|
||||||
|
#import <React/RCTEventEmitter.h>
|
||||||
|
#import <React/RCTUtils.h>
|
||||||
|
#import <React/RCTConvert.h>
|
||||||
|
// Avoid importing deprecated/private headers that can break module maps
|
||||||
10
ios/Nuvio/Nuvio.entitlements
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>aps-environment</key>
|
||||||
|
<string>development</string>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
48
ios/Nuvio/PrivacyInfo.xcprivacy
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
<string>0A2A.1</string>
|
||||||
|
<string>3B52.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>35F9.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>E174.1</string>
|
||||||
|
<string>85F4.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
44
ios/Nuvio/SplashScreen.storyboard
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EXPO-VIEWCONTROLLER-1">
|
||||||
|
<device id="retina6_12" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
|
||||||
|
<capability name="Named colors" minToolsVersion="9.0"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<scene sceneID="EXPO-SCENE-1">
|
||||||
|
<objects>
|
||||||
|
<viewController storyboardIdentifier="SplashScreenViewController" id="EXPO-VIEWCONTROLLER-1" sceneMemberID="viewController">
|
||||||
|
<view key="view" userInteractionEnabled="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="EXPO-ContainerView" userLabel="ContainerView">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView id="EXPO-SplashScreen" userLabel="SplashScreenLogo" image="SplashScreenLogo" contentMode="scaleAspectFit" clipsSubviews="true" userInteractionEnabled="false" translatesAutoresizingMaskIntoConstraints="false">
|
||||||
|
<rect key="frame" x="0" y="0" width="414" height="736"/>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<viewLayoutGuide key="safeArea" id="Rmq-lb-GrQ"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="EXPO-SplashScreen" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="83fcb9b545b870ba44c24f0feeb116490c499c52"/>
|
||||||
|
<constraint firstItem="EXPO-SplashScreen" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="61d16215e44b98e39d0a2c74fdbfaaa22601b12c"/>
|
||||||
|
<constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="f934da460e9ab5acae3ad9987d5b676a108796c1"/>
|
||||||
|
<constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="d6a0be88096b36fb132659aa90203d39139deda9"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="backgroundColor" name="SplashScreenBackground"/>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="EXPO-PLACEHOLDER-1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="0.0" y="0.0"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<image name="SplashScreenLogo" width="414" height="736"/>
|
||||||
|
<namedColor name="SplashScreenBackground">
|
||||||
|
<color alpha="1.000" blue="0.0156862745098039" green="0.0156862745098039" red="0.00784313725490196" customColorSpace="sRGB" colorSpace="custom"/>
|
||||||
|
</namedColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
16
ios/Nuvio/Supporting/Expo.plist
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>EXUpdatesCheckOnLaunch</key>
|
||||||
|
<string>ERROR_RECOVERY_ONLY</string>
|
||||||
|
<key>EXUpdatesEnabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>EXUpdatesLaunchWaitMs</key>
|
||||||
|
<integer>30000</integer>
|
||||||
|
<key>EXUpdatesRuntimeVersion</key>
|
||||||
|
<string>1.0.0</string>
|
||||||
|
<key>EXUpdatesURL</key>
|
||||||
|
<string>https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
10
ios/Nuvio/main.m
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
@autoreleasepool {
|
||||||
|
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
4
ios/Nuvio/noop-file.swift
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
//
|
||||||
|
// @generated
|
||||||
|
// A blank Swift file must be created for native modules with Swift files to work correctly.
|
||||||
|
//
|
||||||
72
ios/Podfile
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
|
||||||
|
require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
|
||||||
|
|
||||||
|
require 'json'
|
||||||
|
podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
|
||||||
|
|
||||||
|
ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
|
||||||
|
ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
|
||||||
|
|
||||||
|
platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
|
||||||
|
install! 'cocoapods',
|
||||||
|
:deterministic_uuids => false
|
||||||
|
|
||||||
|
prepare_react_native_project!
|
||||||
|
|
||||||
|
target 'Nuvio' do
|
||||||
|
use_expo_modules!
|
||||||
|
|
||||||
|
if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1'
|
||||||
|
config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
|
||||||
|
else
|
||||||
|
config_command = [
|
||||||
|
'node',
|
||||||
|
'--no-warnings',
|
||||||
|
'--eval',
|
||||||
|
'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
|
||||||
|
'react-native-config',
|
||||||
|
'--json',
|
||||||
|
'--platform',
|
||||||
|
'ios'
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
config = use_native_modules!(config_command)
|
||||||
|
|
||||||
|
use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
|
||||||
|
use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS']
|
||||||
|
|
||||||
|
use_react_native!(
|
||||||
|
:path => config[:reactNativePath],
|
||||||
|
:hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes',
|
||||||
|
# An absolute path to your application root.
|
||||||
|
:app_path => "#{Pod::Config.instance.installation_root}/..",
|
||||||
|
:privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false',
|
||||||
|
)
|
||||||
|
|
||||||
|
# KSPlayer dependencies
|
||||||
|
pod 'KSPlayer',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
|
||||||
|
pod 'DisplayCriteria',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
|
||||||
|
pod 'FFmpegKit',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
|
||||||
|
pod 'Libass',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
react_native_post_install(
|
||||||
|
installer,
|
||||||
|
config[:reactNativePath],
|
||||||
|
:mac_catalyst_enabled => false,
|
||||||
|
:ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true',
|
||||||
|
)
|
||||||
|
|
||||||
|
# This is necessary for Xcode 14, because it signs resource bundles by default
|
||||||
|
# when building for devices.
|
||||||
|
installer.target_installation_results.pod_target_installation_results
|
||||||
|
.each do |pod_name, target_installation_result|
|
||||||
|
target_installation_result.resource_bundle_targets.each do |resource_bundle_target|
|
||||||
|
resource_bundle_target.build_configurations.each do |config|
|
||||||
|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
2957
ios/Podfile.lock
Normal file
5
ios/Podfile.properties.json
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"expo.jsEngine": "hermes",
|
||||||
|
"EX_DEV_CLIENT_NETWORK_INSPECTOR": "true",
|
||||||
|
"newArchEnabled": "true"
|
||||||
|
}
|
||||||
43
ios/scripts/add_ksplayer_bridge.rb
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
require 'xcodeproj'
|
||||||
|
require 'fileutils'
|
||||||
|
|
||||||
|
project_path = File.expand_path('../Nuvio.xcodeproj', __dir__)
|
||||||
|
project = Xcodeproj::Project.open(project_path)
|
||||||
|
|
||||||
|
app_dir = File.expand_path('..', __dir__)
|
||||||
|
|
||||||
|
target_name = 'Nuvio'
|
||||||
|
bridge_files = [
|
||||||
|
File.expand_path('Nuvio/KSPlayerView.swift', app_dir),
|
||||||
|
File.expand_path('Nuvio/KSPlayerViewManager.swift', app_dir),
|
||||||
|
File.expand_path('Nuvio/KSPlayerManager.m', app_dir),
|
||||||
|
File.expand_path('Nuvio/KSPlayerModule.swift', app_dir),
|
||||||
|
]
|
||||||
|
|
||||||
|
missing = bridge_files.reject { |p| File.exist?(p) }
|
||||||
|
if missing.any?
|
||||||
|
abort "Missing files: \n#{missing.join("\n")}"
|
||||||
|
end
|
||||||
|
|
||||||
|
target = project.targets.find { |t| t.name == target_name }
|
||||||
|
abort "Target '#{target_name}' not found" unless target
|
||||||
|
|
||||||
|
# Ensure group exists at the correct relative path
|
||||||
|
root_group = project.main_group
|
||||||
|
app_group = root_group['Nuvio'] || root_group.new_group('Nuvio', 'Nuvio')
|
||||||
|
|
||||||
|
added_files = []
|
||||||
|
bridge_files.each do |file_path|
|
||||||
|
relative_path = Pathname.new(file_path).relative_path_from(Pathname.new(project_path).dirname).to_s
|
||||||
|
ref = project.files.find { |f| f.path == relative_path }
|
||||||
|
unless ref
|
||||||
|
ref = app_group.new_file(relative_path)
|
||||||
|
added_files << relative_path
|
||||||
|
end
|
||||||
|
unless target.source_build_phase.files_references.include?(ref)
|
||||||
|
target.add_file_references([ref])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
project.save
|
||||||
|
puts "Ensured bridge files are added to target '#{target_name}':\n - #{(added_files.empty? ? '(no new files)' : added_files.join("\n - "))}"
|
||||||
4
ios/sentry.properties
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
defaults.url=https://sentry.io/
|
||||||
|
defaults.org=tapframe
|
||||||
|
defaults.project=react-native
|
||||||
|
# Using SENTRY_AUTH_TOKEN environment variable
|
||||||
27
ios/vendor/bundle/ruby/2.6.0/bin/xcodeproj
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
#
|
||||||
|
# This file was generated by RubyGems.
|
||||||
|
#
|
||||||
|
# The application 'xcodeproj' is installed as part of a gem, and
|
||||||
|
# this file is here to facilitate running it.
|
||||||
|
#
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
|
||||||
|
version = ">= 0.a"
|
||||||
|
|
||||||
|
str = ARGV.first
|
||||||
|
if str
|
||||||
|
str = str.b[/\A_(.*)_\z/, 1]
|
||||||
|
if str and Gem::Version.correct?(str)
|
||||||
|
version = str
|
||||||
|
ARGV.shift
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if Gem.respond_to?(:activate_bin_path)
|
||||||
|
load Gem.activate_bin_path('xcodeproj', 'xcodeproj', version)
|
||||||
|
else
|
||||||
|
gem "xcodeproj", version
|
||||||
|
load Gem.bin_path("xcodeproj", "xcodeproj", version)
|
||||||
|
end
|
||||||
BIN
ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/rexml-3.4.4.gem
vendored
Normal file
BIN
ios/vendor/bundle/ruby/2.6.0/cache/xcodeproj-1.27.0.gem
vendored
Normal file
16
ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem_make.out
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
|
||||||
|
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20250917-1505-1tafywa.rb extconf.rb
|
||||||
|
creating Makefile
|
||||||
|
|
||||||
|
current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
|
||||||
|
make "DESTDIR=" clean
|
||||||
|
|
||||||
|
current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
|
||||||
|
make "DESTDIR="
|
||||||
|
compiling nkf.c
|
||||||
|
linking shared-object nkf.bundle
|
||||||
|
ld: warning: search path '/AppleInternal/Library/BuildRoots/1c8f7852-1ca9-11f0-b28b-226177e5bb69/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.Internal.sdk/usr/local/lib' not found
|
||||||
|
|
||||||
|
current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
|
||||||
|
make "DESTDIR=" install
|
||||||
|
/usr/bin/install -c -m 0755 nkf.bundle ./.gem.20250917-1505-18va8d4
|
||||||
BIN
ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/nkf.bundle
vendored
Normal file
19
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2010 Christian Kruse, <cjk@wwwtech.de>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
79
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.md
vendored
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
CFPropertyList implementation
|
||||||
|
class to read, manipulate and write both XML and binary property list
|
||||||
|
files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
|
||||||
|
for more documentation.
|
||||||
|
|
||||||
|
# Caution!
|
||||||
|
|
||||||
|
In version 3.0.0 we dropped Ruby 1.8 compatibility. If you are using
|
||||||
|
Ruby 1.8 consider to update Ruby; if you can't upgrade, don't upgrade
|
||||||
|
CFPropertyList.
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
You could either use ruby gems and install it via
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gem install CFPropertyList
|
||||||
|
```
|
||||||
|
|
||||||
|
or you could clone this repository and place it somewhere in your load path.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```ruby
|
||||||
|
require 'cfpropertylist'
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're using Rails, you can add it into your Gemfile
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
gem 'CFPropertyList'
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
|
## create a arbitrary data structure of basic data types
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
data = {
|
||||||
|
'name' => 'John Doe',
|
||||||
|
'missing' => true,
|
||||||
|
'last_seen' => Time.now,
|
||||||
|
'friends' => ['Jane Doe','Julian Doe'],
|
||||||
|
'likes' => {
|
||||||
|
'me' => false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## create CFPropertyList::List object
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
plist = CFPropertyList::List.new
|
||||||
|
```
|
||||||
|
|
||||||
|
## call CFPropertyList.guess() to create corresponding CFType values
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
plist.value = CFPropertyList.guess(data)
|
||||||
|
```
|
||||||
|
|
||||||
|
## write plist to file
|
||||||
|
```ruby
|
||||||
|
plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
|
||||||
|
```
|
||||||
|
|
||||||
|
## … later, read it again
|
||||||
|
```ruby
|
||||||
|
plist = CFPropertyList::List.new(:file => "example.plist")
|
||||||
|
data = CFPropertyList.native_types(plist.value)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Author and license
|
||||||
|
|
||||||
|
**Author:** Christian Kruse (mailto:cjk@wwwtech.de)
|
||||||
|
|
||||||
|
**Copyright:** Copyright (c) 2010
|
||||||
|
|
||||||
|
**License:** MIT License
|
||||||
|
|
||||||
43
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.rdoc
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
CFPropertyList implementation
|
||||||
|
class to read, manipulate and write both XML and binary property list
|
||||||
|
files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
|
||||||
|
for more documentation.
|
||||||
|
|
||||||
|
== Installation
|
||||||
|
|
||||||
|
You could either use ruby gems and install it via
|
||||||
|
|
||||||
|
gem install CFPropertyList
|
||||||
|
|
||||||
|
or you could clone this repository and place it somewhere in your load path.
|
||||||
|
|
||||||
|
== Example
|
||||||
|
require 'cfpropertylist'
|
||||||
|
|
||||||
|
# create a arbitrary data structure of basic data types
|
||||||
|
data = {
|
||||||
|
'name' => 'John Doe',
|
||||||
|
'missing' => true,
|
||||||
|
'last_seen' => Time.now,
|
||||||
|
'friends' => ['Jane Doe','Julian Doe'],
|
||||||
|
'likes' => {
|
||||||
|
'me' => false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# create CFPropertyList::List object
|
||||||
|
plist = CFPropertyList::List.new
|
||||||
|
|
||||||
|
# call CFPropertyList.guess() to create corresponding CFType values
|
||||||
|
plist.value = CFPropertyList.guess(data)
|
||||||
|
|
||||||
|
# write plist to file
|
||||||
|
plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
|
||||||
|
|
||||||
|
# … later, read it again
|
||||||
|
plist = CFPropertyList::List.new(:file => "example.plist")
|
||||||
|
data = CFPropertyList.native_types(plist.value)
|
||||||
|
|
||||||
|
Author:: Christian Kruse (mailto:cjk@wwwtech.de)
|
||||||
|
Copyright:: Copyright (c) 2010
|
||||||
|
License:: MIT License
|
||||||
7
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/THANKS
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
Special thanks to:
|
||||||
|
|
||||||
|
Steve Madsen for providing a lot of performance patches and bugfixes!
|
||||||
|
Have a look at his Github account: <http://github.com/sjmadsen>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
6
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist.rb
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'cfpropertylist/rbCFPropertyList'
|
||||||
|
|
||||||
|
|
||||||
|
# eof
|
||||||
594
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbBinaryCFPropertyList.rb
vendored
Normal file
|
|
@ -0,0 +1,594 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'stringio'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# Binary PList parser class
|
||||||
|
class Binary
|
||||||
|
# Read a binary plist file
|
||||||
|
def load(opts)
|
||||||
|
@unique_table = {}
|
||||||
|
@count_objects = 0
|
||||||
|
@object_refs = 0
|
||||||
|
|
||||||
|
@written_object_count = 0
|
||||||
|
@object_table = []
|
||||||
|
@object_ref_size = 0
|
||||||
|
|
||||||
|
@offsets = []
|
||||||
|
|
||||||
|
fd = nil
|
||||||
|
if(opts.has_key?(:file))
|
||||||
|
fd = File.open(opts[:file],"rb")
|
||||||
|
file = opts[:file]
|
||||||
|
else
|
||||||
|
fd = StringIO.new(opts[:data],"rb")
|
||||||
|
file = "<string>"
|
||||||
|
end
|
||||||
|
|
||||||
|
# first, we read the trailer: 32 byte from the end
|
||||||
|
fd.seek(-32,IO::SEEK_END)
|
||||||
|
buff = fd.read(32)
|
||||||
|
|
||||||
|
offset_size, object_ref_size, number_of_objects, top_object, table_offset = buff.unpack "x6CCx4Nx4Nx4N"
|
||||||
|
|
||||||
|
# after that, get the offset table
|
||||||
|
fd.seek(table_offset, IO::SEEK_SET)
|
||||||
|
coded_offset_table = fd.read(number_of_objects * offset_size)
|
||||||
|
raise CFFormatError.new("#{file}: Format error!") unless coded_offset_table.bytesize == number_of_objects * offset_size
|
||||||
|
|
||||||
|
@count_objects = number_of_objects
|
||||||
|
|
||||||
|
# decode offset table
|
||||||
|
if(offset_size != 3)
|
||||||
|
formats = ["","C*","n*","","N*"]
|
||||||
|
@offsets = coded_offset_table.unpack(formats[offset_size])
|
||||||
|
else
|
||||||
|
@offsets = coded_offset_table.unpack("C*").each_slice(3).map {
|
||||||
|
|x,y,z| (x << 16) | (y << 8) | z
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
@object_ref_size = object_ref_size
|
||||||
|
val = read_binary_object_at(file,fd,top_object)
|
||||||
|
|
||||||
|
fd.close
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
# Convert CFPropertyList to binary format; since we have to count our objects we simply unique CFDictionary and CFArray
|
||||||
|
def to_str(opts={})
|
||||||
|
@unique_table = {}
|
||||||
|
@count_objects = 0
|
||||||
|
@object_refs = 0
|
||||||
|
|
||||||
|
@written_object_count = 0
|
||||||
|
@object_table = []
|
||||||
|
|
||||||
|
@offsets = []
|
||||||
|
|
||||||
|
binary_str = "bplist00"
|
||||||
|
|
||||||
|
@object_refs = count_object_refs(opts[:root])
|
||||||
|
|
||||||
|
opts[:root].to_binary(self)
|
||||||
|
|
||||||
|
next_offset = 8
|
||||||
|
offsets = @object_table.map do |object|
|
||||||
|
offset = next_offset
|
||||||
|
next_offset += object.bytesize
|
||||||
|
offset
|
||||||
|
end
|
||||||
|
binary_str << @object_table.join
|
||||||
|
|
||||||
|
table_offset = next_offset
|
||||||
|
offset_size = Binary.bytes_needed(table_offset)
|
||||||
|
|
||||||
|
if offset_size < 8
|
||||||
|
# Fast path: encode the entire offset array at once.
|
||||||
|
binary_str << offsets.pack((%w(C n N N)[offset_size - 1]) + '*')
|
||||||
|
else
|
||||||
|
# Slow path: host may be little or big endian, must pack each offset
|
||||||
|
# separately.
|
||||||
|
offsets.each do |offset|
|
||||||
|
binary_str << "#{Binary.pack_it_with_size(offset_size,offset)}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
binary_str << [offset_size, object_ref_size(@object_refs)].pack("x6CC")
|
||||||
|
binary_str << [@object_table.size].pack("x4N")
|
||||||
|
binary_str << [0].pack("x4N")
|
||||||
|
binary_str << [table_offset].pack("x4N")
|
||||||
|
|
||||||
|
binary_str
|
||||||
|
end
|
||||||
|
|
||||||
|
def object_ref_size object_refs
|
||||||
|
Binary.bytes_needed(object_refs)
|
||||||
|
end
|
||||||
|
|
||||||
|
# read a „null” type (i.e. null byte, marker byte, bool value)
|
||||||
|
def read_binary_null_type(length)
|
||||||
|
case length
|
||||||
|
when 0 then 0 # null byte
|
||||||
|
when 8 then CFBoolean.new(false)
|
||||||
|
when 9 then CFBoolean.new(true)
|
||||||
|
when 15 then 15 # fill type
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("unknown null type: #{length}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
protected :read_binary_null_type
|
||||||
|
|
||||||
|
# read a binary int value
|
||||||
|
def read_binary_int(fname,fd,length)
|
||||||
|
if length > 4
|
||||||
|
raise CFFormatError.new("Integer greater than 16 bytes: #{length}")
|
||||||
|
end
|
||||||
|
|
||||||
|
nbytes = 1 << length
|
||||||
|
|
||||||
|
buff = fd.read(nbytes)
|
||||||
|
|
||||||
|
CFInteger.new(
|
||||||
|
case length
|
||||||
|
when 0 then buff.unpack("C")[0]
|
||||||
|
when 1 then buff.unpack("n")[0]
|
||||||
|
when 2 then buff.unpack("N")[0]
|
||||||
|
# 8 byte integers are always signed
|
||||||
|
when 3 then buff.unpack("q>")[0]
|
||||||
|
# 16 byte integers are used to represent unsigned 8 byte integers
|
||||||
|
# where the unsigned value is stored in the lower 8 bytes and the
|
||||||
|
# upper 8 bytes are unused.
|
||||||
|
when 4 then buff.unpack("Q>Q>")[1]
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
protected :read_binary_int
|
||||||
|
|
||||||
|
# read a binary real value
|
||||||
|
def read_binary_real(fname,fd,length)
|
||||||
|
raise CFFormatError.new("Real greater than 8 bytes: #{length}") if length > 3
|
||||||
|
|
||||||
|
nbytes = 1 << length
|
||||||
|
buff = fd.read(nbytes)
|
||||||
|
|
||||||
|
CFReal.new(
|
||||||
|
case length
|
||||||
|
when 0 # 1 byte float? must be an error
|
||||||
|
raise CFFormatError.new("got #{length+1} byte float, must be an error!")
|
||||||
|
when 1 # 2 byte float? must be an error
|
||||||
|
raise CFFormatError.new("got #{length+1} byte float, must be an error!")
|
||||||
|
when 2 then
|
||||||
|
buff.reverse.unpack("e")[0]
|
||||||
|
when 3 then
|
||||||
|
buff.reverse.unpack("E")[0]
|
||||||
|
else
|
||||||
|
fail "unexpected length: #{length}"
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
protected :read_binary_real
|
||||||
|
|
||||||
|
# read a binary date value
|
||||||
|
def read_binary_date(fname,fd,length)
|
||||||
|
raise CFFormatError.new("Date greater than 8 bytes: #{length}") if length > 3
|
||||||
|
|
||||||
|
nbytes = 1 << length
|
||||||
|
buff = fd.read(nbytes)
|
||||||
|
|
||||||
|
CFDate.new(
|
||||||
|
case length
|
||||||
|
when 0 then # 1 byte CFDate is an error
|
||||||
|
raise CFFormatError.new("#{length+1} byte CFDate, error")
|
||||||
|
when 1 then # 2 byte CFDate is an error
|
||||||
|
raise CFFormatError.new("#{length+1} byte CFDate, error")
|
||||||
|
when 2 then
|
||||||
|
buff.reverse.unpack("e")[0]
|
||||||
|
when 3 then
|
||||||
|
buff.reverse.unpack("E")[0]
|
||||||
|
end,
|
||||||
|
CFDate::TIMESTAMP_APPLE
|
||||||
|
)
|
||||||
|
end
|
||||||
|
protected :read_binary_date
|
||||||
|
|
||||||
|
# Read a binary data value
|
||||||
|
def read_binary_data(fname,fd,length)
|
||||||
|
CFData.new(read_fd(fd, length), CFData::DATA_RAW)
|
||||||
|
end
|
||||||
|
protected :read_binary_data
|
||||||
|
|
||||||
|
def read_fd fd, length
|
||||||
|
length > 0 ? fd.read(length) : ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Read a binary string value
|
||||||
|
def read_binary_string(fname,fd,length)
|
||||||
|
buff = read_fd fd, length
|
||||||
|
@unique_table[buff] = true unless @unique_table.has_key?(buff)
|
||||||
|
CFString.new(buff)
|
||||||
|
end
|
||||||
|
protected :read_binary_string
|
||||||
|
|
||||||
|
# Convert the given string from one charset to another
|
||||||
|
def Binary.charset_convert(str,from,to="UTF-8")
|
||||||
|
return str.dup.force_encoding(from).encode(to) if str.respond_to?("encode")
|
||||||
|
Iconv.conv(to,from,str)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Count characters considering character set
|
||||||
|
def Binary.charset_strlen(str,charset="UTF-8")
|
||||||
|
if str.respond_to?(:encode)
|
||||||
|
size = str.length
|
||||||
|
else
|
||||||
|
utf8_str = Iconv.conv("UTF-8",charset,str)
|
||||||
|
size = utf8_str.scan(/./mu).size
|
||||||
|
end
|
||||||
|
|
||||||
|
# UTF-16 code units in the range D800-DBFF are the beginning of
|
||||||
|
# a surrogate pair, and count as one additional character for
|
||||||
|
# length calculation.
|
||||||
|
if charset =~ /^UTF-16/
|
||||||
|
if str.respond_to?(:encode)
|
||||||
|
str.bytes.to_a.each_slice(2) { |pair| size += 1 if (0xd8..0xdb).include?(pair[0]) }
|
||||||
|
else
|
||||||
|
str.split('').each_slice(2) { |pair| size += 1 if ("\xd8".."\xdb").include?(pair[0]) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
size
|
||||||
|
end
|
||||||
|
|
||||||
|
# Read a unicode string value, coded as UTF-16BE
|
||||||
|
def read_binary_unicode_string(fname,fd,length)
|
||||||
|
# The problem is: we get the length of the string IN CHARACTERS;
|
||||||
|
# since a char in UTF-16 can be 16 or 32 bit long, we don't really know
|
||||||
|
# how long the string is in bytes
|
||||||
|
buff = fd.read(2*length)
|
||||||
|
|
||||||
|
@unique_table[buff] = true unless @unique_table.has_key?(buff)
|
||||||
|
CFString.new(Binary.charset_convert(buff,"UTF-16BE","UTF-8"))
|
||||||
|
end
|
||||||
|
protected :read_binary_unicode_string
|
||||||
|
|
||||||
|
def unpack_with_size(nbytes, buff)
|
||||||
|
format = ["C*", "n*", "N*", "N*"][nbytes - 1];
|
||||||
|
|
||||||
|
if nbytes == 3
|
||||||
|
buff = "\0" + buff.scan(/.{1,3}/).join("\0")
|
||||||
|
end
|
||||||
|
|
||||||
|
return buff.unpack(format)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Read an binary array value, including contained objects
|
||||||
|
def read_binary_array(fname,fd,length)
|
||||||
|
ary = []
|
||||||
|
|
||||||
|
# first: read object refs
|
||||||
|
if(length != 0)
|
||||||
|
buff = fd.read(length * @object_ref_size)
|
||||||
|
objects = unpack_with_size(@object_ref_size, buff) #buff.unpack(@object_ref_size == 1 ? "C*" : "n*")
|
||||||
|
|
||||||
|
# now: read objects
|
||||||
|
0.upto(length-1) do |i|
|
||||||
|
object = read_binary_object_at(fname,fd,objects[i])
|
||||||
|
ary.push object
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
CFArray.new(ary)
|
||||||
|
end
|
||||||
|
protected :read_binary_array
|
||||||
|
|
||||||
|
# Read a dictionary value, including contained objects
|
||||||
|
def read_binary_dict(fname,fd,length)
|
||||||
|
dict = {}
|
||||||
|
|
||||||
|
# first: read keys
|
||||||
|
if(length != 0) then
|
||||||
|
buff = fd.read(length * @object_ref_size)
|
||||||
|
keys = unpack_with_size(@object_ref_size, buff)
|
||||||
|
|
||||||
|
# second: read object refs
|
||||||
|
buff = fd.read(length * @object_ref_size)
|
||||||
|
objects = unpack_with_size(@object_ref_size, buff)
|
||||||
|
|
||||||
|
# read real keys and objects
|
||||||
|
0.upto(length-1) do |i|
|
||||||
|
key = read_binary_object_at(fname,fd,keys[i])
|
||||||
|
object = read_binary_object_at(fname,fd,objects[i])
|
||||||
|
dict[key.value] = object
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
CFDictionary.new(dict)
|
||||||
|
end
|
||||||
|
protected :read_binary_dict
|
||||||
|
|
||||||
|
# Read an object type byte, decode it and delegate to the correct
|
||||||
|
# reader function
|
||||||
|
def read_binary_object(fname,fd)
|
||||||
|
# first: read the marker byte
|
||||||
|
buff = fd.read(1)
|
||||||
|
|
||||||
|
object_length = buff.unpack("C*")
|
||||||
|
object_length = object_length[0] & 0xF
|
||||||
|
|
||||||
|
buff = buff.unpack("H*")
|
||||||
|
object_type = buff[0][0].chr
|
||||||
|
|
||||||
|
if(object_type != "0" && object_length == 15) then
|
||||||
|
object_length = read_binary_object(fname,fd)
|
||||||
|
object_length = object_length.value
|
||||||
|
end
|
||||||
|
|
||||||
|
case object_type
|
||||||
|
when '0' # null, false, true, fillbyte
|
||||||
|
read_binary_null_type(object_length)
|
||||||
|
when '1' # integer
|
||||||
|
read_binary_int(fname,fd,object_length)
|
||||||
|
when '2' # real
|
||||||
|
read_binary_real(fname,fd,object_length)
|
||||||
|
when '3' # date
|
||||||
|
read_binary_date(fname,fd,object_length)
|
||||||
|
when '4' # data
|
||||||
|
read_binary_data(fname,fd,object_length)
|
||||||
|
when '5' # byte string, usually utf8 encoded
|
||||||
|
read_binary_string(fname,fd,object_length)
|
||||||
|
when '6' # unicode string (utf16be)
|
||||||
|
read_binary_unicode_string(fname,fd,object_length)
|
||||||
|
when '8'
|
||||||
|
CFUid.new(read_binary_int(fname, fd, object_length).value)
|
||||||
|
when 'a' # array
|
||||||
|
read_binary_array(fname,fd,object_length)
|
||||||
|
when 'd' # dictionary
|
||||||
|
read_binary_dict(fname,fd,object_length)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
protected :read_binary_object
|
||||||
|
|
||||||
|
# Read an object type byte at position $pos, decode it and delegate to the correct reader function
|
||||||
|
def read_binary_object_at(fname,fd,pos)
|
||||||
|
position = @offsets[pos]
|
||||||
|
fd.seek(position,IO::SEEK_SET)
|
||||||
|
read_binary_object(fname,fd)
|
||||||
|
end
|
||||||
|
protected :read_binary_object_at
|
||||||
|
|
||||||
|
# pack an +int+ of +nbytes+ with size
|
||||||
|
def Binary.pack_it_with_size(nbytes,int)
|
||||||
|
case nbytes
|
||||||
|
when 1 then [int].pack('c')
|
||||||
|
when 2 then [int].pack('n')
|
||||||
|
when 4 then [int].pack('N')
|
||||||
|
when 8
|
||||||
|
[int >> 32, int & 0xFFFFFFFF].pack('NN')
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def Binary.pack_int_array_with_size(nbytes, array)
|
||||||
|
case nbytes
|
||||||
|
when 1 then array.pack('C*')
|
||||||
|
when 2 then array.pack('n*')
|
||||||
|
when 4 then array.pack('N*')
|
||||||
|
when 8
|
||||||
|
array.map { |int| [int >> 32, int & 0xFFFFFFFF].pack('NN') }.join
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# calculate how many bytes are needed to save +count+
|
||||||
|
def Binary.bytes_needed(count)
|
||||||
|
case
|
||||||
|
when count < 2**8 then 1
|
||||||
|
when count < 2**16 then 2
|
||||||
|
when count < 2**32 then 4
|
||||||
|
when count < 2**64 then 8
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Data size too large: #{count}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Create a type byte for binary format as defined by apple
|
||||||
|
def Binary.type_bytes(type, length)
|
||||||
|
if length < 15
|
||||||
|
[(type << 4) | length].pack('C')
|
||||||
|
else
|
||||||
|
bytes = [(type << 4) | 0xF]
|
||||||
|
if length <= 0xFF
|
||||||
|
bytes.push(0x10, length).pack('CCC') # 1 byte length
|
||||||
|
elsif length <= 0xFFFF
|
||||||
|
bytes.push(0x11, length).pack('CCn') # 2 byte length
|
||||||
|
elsif length <= 0xFFFFFFFF
|
||||||
|
bytes.push(0x12, length).pack('CCN') # 4 byte length
|
||||||
|
elsif length <= 0x7FFFFFFFFFFFFFFF
|
||||||
|
bytes.push(0x13, length >> 32, length & 0xFFFFFFFF).pack('CCNN') # 8 byte length
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Integer too large: #{int}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_object_refs(object)
|
||||||
|
case object
|
||||||
|
when CFArray
|
||||||
|
contained_refs = 0
|
||||||
|
object.value.each do |element|
|
||||||
|
if CFArray === element || CFDictionary === element
|
||||||
|
contained_refs += count_object_refs(element)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return object.value.size + contained_refs
|
||||||
|
when CFDictionary
|
||||||
|
contained_refs = 0
|
||||||
|
object.value.each_value do |value|
|
||||||
|
if CFArray === value || CFDictionary === value
|
||||||
|
contained_refs += count_object_refs(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return object.value.keys.size * 2 + contained_refs
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def Binary.ascii_string?(str)
|
||||||
|
if str.respond_to?(:ascii_only?)
|
||||||
|
str.ascii_only?
|
||||||
|
else
|
||||||
|
str !~ /[\x80-\xFF]/mn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Uniques and transforms a string value to binary format and adds it to the object table
|
||||||
|
def string_to_binary(val)
|
||||||
|
val = val.to_s
|
||||||
|
|
||||||
|
@unique_table[val] ||= begin
|
||||||
|
if !Binary.ascii_string?(val)
|
||||||
|
val = Binary.charset_convert(val,"UTF-8","UTF-16BE")
|
||||||
|
bdata = Binary.type_bytes(0b0110, Binary.charset_strlen(val,"UTF-16BE"))
|
||||||
|
|
||||||
|
val.force_encoding("ASCII-8BIT") if val.respond_to?("encode")
|
||||||
|
@object_table[@written_object_count] = bdata << val
|
||||||
|
else
|
||||||
|
bdata = Binary.type_bytes(0b0101,val.bytesize)
|
||||||
|
@object_table[@written_object_count] = bdata << val
|
||||||
|
end
|
||||||
|
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Codes an integer to binary format
|
||||||
|
def int_to_binary(value)
|
||||||
|
# Note: nbytes is actually an exponent. number of bytes = 2**nbytes.
|
||||||
|
nbytes = 0
|
||||||
|
nbytes = 1 if value > 0xFF # 1 byte unsigned integer
|
||||||
|
nbytes += 1 if value > 0xFFFF # 4 byte unsigned integer
|
||||||
|
nbytes += 1 if value > 0xFFFFFFFF # 8 byte unsigned integer
|
||||||
|
nbytes += 1 if value > 0x7FFFFFFFFFFFFFFF # 8 byte unsigned integer, stored in lower half of 16 bytes
|
||||||
|
nbytes = 3 if value < 0 # signed integers always stored in 8 bytes
|
||||||
|
|
||||||
|
Binary.type_bytes(0b0001, nbytes) <<
|
||||||
|
if nbytes < 4
|
||||||
|
[value].pack(["C", "n", "N", "q>"][nbytes])
|
||||||
|
else # nbytes == 4
|
||||||
|
[0,value].pack("Q>Q>")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Codes a real value to binary format
|
||||||
|
def real_to_binary(val)
|
||||||
|
Binary.type_bytes(0b0010,3) << [val].pack("E").reverse
|
||||||
|
end
|
||||||
|
|
||||||
|
# Converts a numeric value to binary and adds it to the object table
|
||||||
|
def num_to_binary(value)
|
||||||
|
@object_table[@written_object_count] =
|
||||||
|
if value.is_a?(CFInteger)
|
||||||
|
int_to_binary(value.value)
|
||||||
|
else
|
||||||
|
real_to_binary(value.value)
|
||||||
|
end
|
||||||
|
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def uid_to_binary(value)
|
||||||
|
nbytes = 0
|
||||||
|
nbytes = 1 if value > 0xFF # 1 byte integer
|
||||||
|
nbytes += 1 if value > 0xFFFF # 4 byte integer
|
||||||
|
nbytes += 1 if value > 0xFFFFFFFF # 8 byte integer
|
||||||
|
nbytes = 3 if value < 0 # 8 byte integer, since signed
|
||||||
|
|
||||||
|
@object_table[@written_object_count] = Binary.type_bytes(0b1000, nbytes) <<
|
||||||
|
if nbytes < 3
|
||||||
|
[value].pack(
|
||||||
|
if nbytes == 0 then "C"
|
||||||
|
elsif nbytes == 1 then "n"
|
||||||
|
else "N"
|
||||||
|
end
|
||||||
|
)
|
||||||
|
else
|
||||||
|
# 64 bit signed integer; we need the higher and the lower 32 bit of the value
|
||||||
|
high_word = value >> 32
|
||||||
|
low_word = value & 0xFFFFFFFF
|
||||||
|
[high_word,low_word].pack("NN")
|
||||||
|
end
|
||||||
|
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convert date value (apple format) to binary and adds it to the object table
|
||||||
|
def date_to_binary(val)
|
||||||
|
val = val.getutc.to_f - CFDate::DATE_DIFF_APPLE_UNIX # CFDate is a real, number of seconds since 01/01/2001 00:00:00 GMT
|
||||||
|
|
||||||
|
@object_table[@written_object_count] =
|
||||||
|
(Binary.type_bytes(0b0011, 3) << [val].pack("E").reverse)
|
||||||
|
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convert a bool value to binary and add it to the object table
|
||||||
|
def bool_to_binary(val)
|
||||||
|
|
||||||
|
@object_table[@written_object_count] = val ? "\x9" : "\x8" # 0x9 is 1001, type indicator for true; 0x8 is 1000, type indicator for false
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convert data value to binary format and add it to the object table
|
||||||
|
def data_to_binary(val)
|
||||||
|
@object_table[@written_object_count] =
|
||||||
|
(Binary.type_bytes(0b0100, val.bytesize) << val)
|
||||||
|
|
||||||
|
@written_object_count += 1
|
||||||
|
@written_object_count - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convert array to binary format and add it to the object table
|
||||||
|
def array_to_binary(val)
|
||||||
|
saved_object_count = @written_object_count
|
||||||
|
@written_object_count += 1
|
||||||
|
#@object_refs += val.value.size
|
||||||
|
|
||||||
|
values = val.value.map { |v| v.to_binary(self) }
|
||||||
|
bdata = Binary.type_bytes(0b1010, val.value.size) <<
|
||||||
|
Binary.pack_int_array_with_size(object_ref_size(@object_refs),
|
||||||
|
values)
|
||||||
|
|
||||||
|
@object_table[saved_object_count] = bdata
|
||||||
|
saved_object_count
|
||||||
|
end
|
||||||
|
|
||||||
|
# Convert dictionary to binary format and add it to the object table
|
||||||
|
def dict_to_binary(val)
|
||||||
|
saved_object_count = @written_object_count
|
||||||
|
@written_object_count += 1
|
||||||
|
|
||||||
|
#@object_refs += val.value.keys.size * 2
|
||||||
|
|
||||||
|
keys_and_values = val.value.keys.map { |k| CFString.new(k).to_binary(self) }
|
||||||
|
keys_and_values.concat(val.value.values.map { |v| v.to_binary(self) })
|
||||||
|
|
||||||
|
bdata = Binary.type_bytes(0b1101,val.value.size) <<
|
||||||
|
Binary.pack_int_array_with_size(object_ref_size(@object_refs), keys_and_values)
|
||||||
|
|
||||||
|
@object_table[saved_object_count] = bdata
|
||||||
|
return saved_object_count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
26
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPlistError.rb
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Exceptions used:
|
||||||
|
# CFPlistError:: General base exception
|
||||||
|
# CFFormatError:: Format error
|
||||||
|
# CFTypeError:: Type error
|
||||||
|
#
|
||||||
|
# Easy and simple :-)
|
||||||
|
#
|
||||||
|
# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
|
||||||
|
# Copyright:: Copyright (c) 2010
|
||||||
|
# License:: MIT License
|
||||||
|
|
||||||
|
# general plist error. All exceptions thrown are derived from this class.
|
||||||
|
class CFPlistError < StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
# Exception thrown when format errors occur
|
||||||
|
class CFFormatError < CFPlistError
|
||||||
|
end
|
||||||
|
|
||||||
|
# Exception thrown when type errors occur
|
||||||
|
class CFTypeError < CFPlistError
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
449
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb
vendored
Normal file
|
|
@ -0,0 +1,449 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'kconv'
|
||||||
|
require 'date'
|
||||||
|
require 'time'
|
||||||
|
|
||||||
|
#
|
||||||
|
# CFPropertyList implementation
|
||||||
|
#
|
||||||
|
# class to read, manipulate and write both XML and binary property list
|
||||||
|
# files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
|
||||||
|
# for more documentation.
|
||||||
|
#
|
||||||
|
# == Example
|
||||||
|
# require 'cfpropertylist'
|
||||||
|
#
|
||||||
|
# # create a arbitrary data structure of basic data types
|
||||||
|
# data = {
|
||||||
|
# 'name' => 'John Doe',
|
||||||
|
# 'missing' => true,
|
||||||
|
# 'last_seen' => Time.now,
|
||||||
|
# 'friends' => ['Jane Doe','Julian Doe'],
|
||||||
|
# 'likes' => {
|
||||||
|
# 'me' => false
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# # create CFPropertyList::List object
|
||||||
|
# plist = CFPropertyList::List.new
|
||||||
|
#
|
||||||
|
# # call CFPropertyList.guess() to create corresponding CFType values
|
||||||
|
# # pass in optional :convert_unknown_to_string => true to convert things like symbols into strings.
|
||||||
|
# plist.value = CFPropertyList.guess(data)
|
||||||
|
#
|
||||||
|
# # write plist to file
|
||||||
|
# plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
|
||||||
|
#
|
||||||
|
# # … later, read it again
|
||||||
|
# plist = CFPropertyList::List.new(:file => "example.plist")
|
||||||
|
# data = CFPropertyList.native_types(plist.value)
|
||||||
|
#
|
||||||
|
# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
|
||||||
|
# Copyright:: Copyright (c) 2010
|
||||||
|
# License:: MIT License
|
||||||
|
module CFPropertyList
|
||||||
|
class << self
|
||||||
|
attr_accessor :xml_parser_interface
|
||||||
|
end
|
||||||
|
|
||||||
|
# interface class for PList parsers
|
||||||
|
class ParserInterface
|
||||||
|
# load a plist
|
||||||
|
def load(opts={})
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert a plist to string
|
||||||
|
def to_str(opts={})
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class XMLParserInterface < ParserInterface
|
||||||
|
def new_node(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_text(val)
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_node(parent, child)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
dirname = File.dirname(__FILE__)
|
||||||
|
require dirname + '/rbCFPlistError.rb'
|
||||||
|
require dirname + '/rbCFTypes.rb'
|
||||||
|
require dirname + '/rbBinaryCFPropertyList.rb'
|
||||||
|
require dirname + '/rbPlainCFPropertyList.rb'
|
||||||
|
|
||||||
|
begin
|
||||||
|
require dirname + '/rbLibXMLParser.rb'
|
||||||
|
temp = LibXML::XML::Parser::Options::NOBLANKS # check if we have a version with parser options
|
||||||
|
temp = false # avoid a warning
|
||||||
|
try_nokogiri = false
|
||||||
|
CFPropertyList.xml_parser_interface = CFPropertyList::LibXMLParser
|
||||||
|
rescue LoadError, NameError
|
||||||
|
try_nokogiri = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if try_nokogiri then
|
||||||
|
begin
|
||||||
|
require dirname + '/rbNokogiriParser.rb'
|
||||||
|
CFPropertyList.xml_parser_interface = CFPropertyList::NokogiriXMLParser
|
||||||
|
rescue LoadError
|
||||||
|
require dirname + '/rbREXMLParser.rb'
|
||||||
|
CFPropertyList.xml_parser_interface = CFPropertyList::ReXMLParser
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# Create CFType hierarchy by guessing the correct CFType, e.g.
|
||||||
|
#
|
||||||
|
# x = {
|
||||||
|
# 'a' => ['b','c','d']
|
||||||
|
# }
|
||||||
|
# cftypes = CFPropertyList.guess(x)
|
||||||
|
#
|
||||||
|
# pass optional options hash. Only possible value actually:
|
||||||
|
# +convert_unknown_to_string+:: Convert unknown objects to string calling to_str()
|
||||||
|
# +converter_method+:: Convert unknown objects to known objects calling +method_name+
|
||||||
|
#
|
||||||
|
# cftypes = CFPropertyList.guess(x,:convert_unknown_to_string => true,:converter_method => :to_hash, :converter_with_opts => true)
|
||||||
|
def guess(object, options = {})
|
||||||
|
case object
|
||||||
|
when Integer then CFInteger.new(object)
|
||||||
|
when UidFixnum then CFUid.new(object)
|
||||||
|
when Float then CFReal.new(object)
|
||||||
|
when TrueClass, FalseClass then CFBoolean.new(object)
|
||||||
|
|
||||||
|
when Blob
|
||||||
|
CFData.new(object, CFData::DATA_RAW)
|
||||||
|
|
||||||
|
when String, Symbol
|
||||||
|
CFString.new(object.to_s)
|
||||||
|
|
||||||
|
when Time, DateTime, Date
|
||||||
|
CFDate.new(object)
|
||||||
|
|
||||||
|
when Array, Enumerator
|
||||||
|
ary = Array.new
|
||||||
|
object.each do |o|
|
||||||
|
ary.push CFPropertyList.guess(o, options)
|
||||||
|
end
|
||||||
|
CFArray.new(ary)
|
||||||
|
|
||||||
|
when Hash
|
||||||
|
hsh = Hash.new
|
||||||
|
object.each_pair do |k,v|
|
||||||
|
k = k.to_s if k.is_a?(Symbol)
|
||||||
|
hsh[k] = CFPropertyList.guess(v, options)
|
||||||
|
end
|
||||||
|
CFDictionary.new(hsh)
|
||||||
|
else
|
||||||
|
case
|
||||||
|
when Object.const_defined?('BigDecimal') && object.is_a?(BigDecimal)
|
||||||
|
CFReal.new(object)
|
||||||
|
when object.respond_to?(:read)
|
||||||
|
raw_data = object.read
|
||||||
|
# treat the data as a bytestring (ASCII-8BIT) if Ruby supports it. Do this by forcing
|
||||||
|
# the encoding, on the assumption that the bytes were read correctly, and just tagged with
|
||||||
|
# an inappropriate encoding, rather than transcoding.
|
||||||
|
raw_data.force_encoding(Encoding::ASCII_8BIT) if raw_data.respond_to?(:force_encoding)
|
||||||
|
CFData.new(raw_data, CFData::DATA_RAW)
|
||||||
|
when options[:converter_method] && object.respond_to?(options[:converter_method])
|
||||||
|
if options[:converter_with_opts]
|
||||||
|
CFPropertyList.guess(object.send(options[:converter_method],options),options)
|
||||||
|
else
|
||||||
|
CFPropertyList.guess(object.send(options[:converter_method]),options)
|
||||||
|
end
|
||||||
|
when options[:convert_unknown_to_string]
|
||||||
|
CFString.new(object.to_s)
|
||||||
|
else
|
||||||
|
raise CFTypeError.new("Unknown class #{object.class.to_s}. Try using :convert_unknown_to_string if you want to use unknown object types!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Converts a CFType hiercharchy to native Ruby types
|
||||||
|
def native_types(object,keys_as_symbols=false)
|
||||||
|
return if object.nil?
|
||||||
|
|
||||||
|
if(object.is_a?(CFDate) || object.is_a?(CFString) || object.is_a?(CFInteger) || object.is_a?(CFReal) || object.is_a?(CFBoolean)) || object.is_a?(CFUid) then
|
||||||
|
return object.value
|
||||||
|
elsif(object.is_a?(CFData)) then
|
||||||
|
return CFPropertyList::Blob.new(object.decoded_value)
|
||||||
|
elsif(object.is_a?(CFArray)) then
|
||||||
|
ary = []
|
||||||
|
object.value.each do
|
||||||
|
|v|
|
||||||
|
ary.push CFPropertyList.native_types(v)
|
||||||
|
end
|
||||||
|
|
||||||
|
return ary
|
||||||
|
elsif(object.is_a?(CFDictionary)) then
|
||||||
|
hsh = {}
|
||||||
|
object.value.each_pair do
|
||||||
|
|k,v|
|
||||||
|
k = k.to_sym if keys_as_symbols
|
||||||
|
hsh[k] = CFPropertyList.native_types(v)
|
||||||
|
end
|
||||||
|
|
||||||
|
return hsh
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module_function :guess, :native_types
|
||||||
|
|
||||||
|
# Class representing a CFPropertyList. Instantiate with #new
|
||||||
|
class List
|
||||||
|
# Format constant for binary format
|
||||||
|
FORMAT_BINARY = 1
|
||||||
|
|
||||||
|
# Format constant for XML format
|
||||||
|
FORMAT_XML = 2
|
||||||
|
|
||||||
|
# Format constant for the old plain format
|
||||||
|
FORMAT_PLAIN = 3
|
||||||
|
|
||||||
|
# Format constant for automatic format recognizing
|
||||||
|
FORMAT_AUTO = 0
|
||||||
|
|
||||||
|
@@parsers = [Binary, CFPropertyList.xml_parser_interface, PlainParser]
|
||||||
|
|
||||||
|
# Path of PropertyList
|
||||||
|
attr_accessor :filename
|
||||||
|
# the original format of the PropertyList
|
||||||
|
attr_accessor :format
|
||||||
|
# the root value in the plist file
|
||||||
|
attr_accessor :value
|
||||||
|
# default value for XML generation; if true generate formatted XML
|
||||||
|
attr_accessor :formatted
|
||||||
|
|
||||||
|
# initialize a new CFPropertyList, arguments are:
|
||||||
|
#
|
||||||
|
# :file:: Parse a file
|
||||||
|
# :format:: Format is one of FORMAT_BINARY or FORMAT_XML. Defaults to FORMAT_AUTO
|
||||||
|
# :data:: Parse a string
|
||||||
|
#
|
||||||
|
# All arguments are optional
|
||||||
|
def initialize(opts={})
|
||||||
|
@filename = opts[:file]
|
||||||
|
@format = opts[:format] || FORMAT_AUTO
|
||||||
|
@data = opts[:data]
|
||||||
|
@formatted = opts[:formatted]
|
||||||
|
|
||||||
|
load(@filename) unless @filename.nil?
|
||||||
|
load_str(@data) unless @data.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
# returns a list of registered parsers
|
||||||
|
def self.parsers
|
||||||
|
@@parsers
|
||||||
|
end
|
||||||
|
|
||||||
|
# set a list of parsers
|
||||||
|
def self.parsers=(val)
|
||||||
|
@@parsers = val
|
||||||
|
end
|
||||||
|
|
||||||
|
# Load an XML PropertyList
|
||||||
|
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
|
||||||
|
def load_xml(filename=nil)
|
||||||
|
load(filename,List::FORMAT_XML)
|
||||||
|
end
|
||||||
|
|
||||||
|
# read a binary plist file
|
||||||
|
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
|
||||||
|
def load_binary(filename=nil)
|
||||||
|
load(filename,List::FORMAT_BINARY)
|
||||||
|
end
|
||||||
|
|
||||||
|
# read a plain plist file
|
||||||
|
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
|
||||||
|
def load_plain(filename=nil)
|
||||||
|
load(filename,List::FORMAT_PLAIN)
|
||||||
|
end
|
||||||
|
|
||||||
|
# load a plist from a XML string
|
||||||
|
# str:: The string containing the plist
|
||||||
|
def load_xml_str(str=nil)
|
||||||
|
load_str(str,List::FORMAT_XML)
|
||||||
|
end
|
||||||
|
|
||||||
|
# load a plist from a binary string
|
||||||
|
# str:: The string containing the plist
|
||||||
|
def load_binary_str(str=nil)
|
||||||
|
load_str(str,List::FORMAT_BINARY)
|
||||||
|
end
|
||||||
|
|
||||||
|
# load a plist from a plain string
|
||||||
|
# str:: The string containing the plist
|
||||||
|
def load_plain_str(str=nil)
|
||||||
|
load_str(str,List::FORMAT_PLAIN)
|
||||||
|
end
|
||||||
|
|
||||||
|
# load a plist from a string
|
||||||
|
# str = nil:: The string containing the plist
|
||||||
|
# format = nil:: The format of the plist
|
||||||
|
def load_str(str=nil,format=nil)
|
||||||
|
str = @data if str.nil?
|
||||||
|
format = @format if format.nil?
|
||||||
|
|
||||||
|
@value = {}
|
||||||
|
case format
|
||||||
|
when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then
|
||||||
|
prsr = @@parsers[format-1].new
|
||||||
|
@value = prsr.load({:data => str})
|
||||||
|
|
||||||
|
when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
|
||||||
|
filetype = str[0..5]
|
||||||
|
version = str[6..7]
|
||||||
|
|
||||||
|
prsr = nil
|
||||||
|
|
||||||
|
if filetype == "bplist" then
|
||||||
|
raise CFFormatError.new("Wrong file version #{version}") unless version == "00"
|
||||||
|
prsr = Binary.new
|
||||||
|
@format = List::FORMAT_BINARY
|
||||||
|
else
|
||||||
|
if str =~ /^<(\?xml|!DOCTYPE|plist)/
|
||||||
|
prsr = CFPropertyList.xml_parser_interface.new
|
||||||
|
@format = List::FORMAT_XML
|
||||||
|
else
|
||||||
|
prsr = PlainParser.new
|
||||||
|
@format = List::FORMAT_PLAIN
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@value = prsr.load({:data => str})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Read a plist file
|
||||||
|
# file = nil:: The filename of the file to read. If nil, use +filename+ instance variable
|
||||||
|
# format = nil:: The format of the plist file. Auto-detect if nil
|
||||||
|
def load(file=nil,format=nil)
|
||||||
|
file = @filename if file.nil?
|
||||||
|
format = @format if format.nil?
|
||||||
|
@value = {}
|
||||||
|
|
||||||
|
raise IOError.new("File #{file} not readable!") unless File.readable? file
|
||||||
|
|
||||||
|
case format
|
||||||
|
when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then
|
||||||
|
prsr = @@parsers[format-1].new
|
||||||
|
@value = prsr.load({:file => file})
|
||||||
|
|
||||||
|
when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
|
||||||
|
magic_number = IO.read(file,12)
|
||||||
|
raise IOError.new("File #{file} is empty.") unless magic_number
|
||||||
|
filetype = magic_number[0..5]
|
||||||
|
version = magic_number[6..7]
|
||||||
|
|
||||||
|
prsr = nil
|
||||||
|
if filetype == "bplist" then
|
||||||
|
raise CFFormatError.new("Wrong file version #{version}") unless version == "00"
|
||||||
|
prsr = Binary.new
|
||||||
|
@format = List::FORMAT_BINARY
|
||||||
|
else
|
||||||
|
if magic_number =~ /^<(\?xml|!DOCTYPE|plist)/
|
||||||
|
prsr = CFPropertyList.xml_parser_interface.new
|
||||||
|
@format = List::FORMAT_XML
|
||||||
|
else
|
||||||
|
prsr = PlainParser.new
|
||||||
|
@format = List::FORMAT_PLAIN
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@value = prsr.load({:file => file})
|
||||||
|
end
|
||||||
|
|
||||||
|
raise CFFormatError.new("Invalid format or parser error!") if @value.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Serialize CFPropertyList object to specified format and write it to file
|
||||||
|
# file = nil:: The filename of the file to write to. Uses +filename+ instance variable if nil
|
||||||
|
# format = nil:: The format to save in. Uses +format+ instance variable if nil
|
||||||
|
def save(file=nil,format=nil,opts={})
|
||||||
|
format = @format if format.nil?
|
||||||
|
file = @filename if file.nil?
|
||||||
|
|
||||||
|
if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN
|
||||||
|
raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML")
|
||||||
|
end
|
||||||
|
|
||||||
|
if(!File.exist?(file)) then
|
||||||
|
raise IOError.new("File #{file} not writable!") unless File.writable?(File.dirname(file))
|
||||||
|
elsif(!File.writable?(file)) then
|
||||||
|
raise IOError.new("File #{file} not writable!")
|
||||||
|
end
|
||||||
|
|
||||||
|
opts[:root] = @value
|
||||||
|
opts[:formatted] = @formatted unless opts.has_key?(:formatted)
|
||||||
|
|
||||||
|
prsr = @@parsers[format-1].new
|
||||||
|
|
||||||
|
content = prsr.to_str(opts)
|
||||||
|
|
||||||
|
File.open(file, 'wb') {
|
||||||
|
|fd|
|
||||||
|
fd.write content
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert plist to string
|
||||||
|
# format = List::FORMAT_BINARY:: The format to save the plist
|
||||||
|
# opts={}:: Pass parser options
|
||||||
|
def to_str(format=List::FORMAT_BINARY,opts={})
|
||||||
|
if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN
|
||||||
|
raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML")
|
||||||
|
end
|
||||||
|
|
||||||
|
prsr = @@parsers[format-1].new
|
||||||
|
|
||||||
|
opts[:root] = @value
|
||||||
|
opts[:formatted] = @formatted unless opts.has_key?(:formatted)
|
||||||
|
|
||||||
|
return prsr.to_str(opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
class Array
|
||||||
|
# convert an array to plist format
|
||||||
|
def to_plist(options={})
|
||||||
|
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
|
||||||
|
|
||||||
|
plist = CFPropertyList::List.new
|
||||||
|
plist.value = CFPropertyList.guess(self, options)
|
||||||
|
plist.to_str(options[:plist_format], options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Enumerator
|
||||||
|
# convert an array to plist format
|
||||||
|
def to_plist(options={})
|
||||||
|
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
|
||||||
|
|
||||||
|
plist = CFPropertyList::List.new
|
||||||
|
plist.value = CFPropertyList.guess(self, options)
|
||||||
|
plist.to_str(options[:plist_format], options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Hash
|
||||||
|
# convert a hash to plist format
|
||||||
|
def to_plist(options={})
|
||||||
|
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
|
||||||
|
|
||||||
|
plist = CFPropertyList::List.new
|
||||||
|
plist.value = CFPropertyList.guess(self, options)
|
||||||
|
plist.to_str(options[:plist_format], options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
349
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFTypes.rb
vendored
Normal file
|
|
@ -0,0 +1,349 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# CFTypes, e.g. CFString, CFInteger
|
||||||
|
# needed to create unambiguous plists
|
||||||
|
#
|
||||||
|
# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
|
||||||
|
# Copyright:: Copyright (c) 2009
|
||||||
|
# License:: MIT License
|
||||||
|
|
||||||
|
require 'base64'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
##
|
||||||
|
# Blob is intended to distinguish between a Ruby String instance that should
|
||||||
|
# be converted to a CFString type and a Ruby String instance that should be
|
||||||
|
# converted to a CFData type
|
||||||
|
class Blob < String
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# UidFixnum is intended to distinguish between a Ruby Integer
|
||||||
|
# instance that should be converted to a CFInteger/CFReal type and a
|
||||||
|
# Ruby Integer instance that should be converted to a CFUid type.
|
||||||
|
class UidFixnum < Integer
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class defines the base class for all CFType classes
|
||||||
|
#
|
||||||
|
class CFType
|
||||||
|
# value of the type
|
||||||
|
attr_accessor :value
|
||||||
|
|
||||||
|
def initialize(value=nil)
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_xml(parser)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_binary(bplist)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class holds string values, both, UTF-8 and UTF-16BE
|
||||||
|
# It will convert the value to UTF-16BE if necessary (i.e. if non-ascii char contained)
|
||||||
|
class CFString < CFType
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('string')
|
||||||
|
n = parser.append_node(n, parser.new_text(@value)) unless @value.nil?
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.string_to_binary(@value);
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
if @value =~ /^\w+$/
|
||||||
|
@value
|
||||||
|
else
|
||||||
|
quoted
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def quoted
|
||||||
|
str = '"'
|
||||||
|
@value.each_char do |c|
|
||||||
|
str << case c
|
||||||
|
when '"'
|
||||||
|
'\\"'
|
||||||
|
when '\\'
|
||||||
|
'\\'
|
||||||
|
when "\a"
|
||||||
|
"\\a"
|
||||||
|
when "\b"
|
||||||
|
"\\b"
|
||||||
|
when "\f"
|
||||||
|
"\\f"
|
||||||
|
when "\n"
|
||||||
|
"\n"
|
||||||
|
when "\v"
|
||||||
|
"\\v"
|
||||||
|
when "\r"
|
||||||
|
"\\r"
|
||||||
|
when "\t"
|
||||||
|
"\\t"
|
||||||
|
else
|
||||||
|
c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
str << '"'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class holds integer/fixnum values
|
||||||
|
class CFInteger < CFType
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('integer')
|
||||||
|
n = parser.append_node(n, parser.new_text(@value.to_s))
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.num_to_binary(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
@value.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class holds float values
|
||||||
|
class CFReal < CFType
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('real')
|
||||||
|
n = parser.append_node(n, parser.new_text(@value.to_s))
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.num_to_binary(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
@value.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class holds Time values. While Apple uses seconds since 2001,
|
||||||
|
# the rest of the world uses seconds since 1970. So if you access value
|
||||||
|
# directly, you get the Time class. If you access via get_value you either
|
||||||
|
# geht the timestamp or the Apple timestamp
|
||||||
|
class CFDate < CFType
|
||||||
|
TIMESTAMP_APPLE = 0
|
||||||
|
TIMESTAMP_UNIX = 1
|
||||||
|
DATE_DIFF_APPLE_UNIX = 978307200
|
||||||
|
|
||||||
|
# create a XML date strimg from a time object
|
||||||
|
def CFDate.date_string(val)
|
||||||
|
# 2009-05-13T20:23:43Z
|
||||||
|
val.getutc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||||
|
end
|
||||||
|
|
||||||
|
# parse a XML date string
|
||||||
|
def CFDate.parse_date(val)
|
||||||
|
# 2009-05-13T20:23:43Z
|
||||||
|
val =~ %r{^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$}
|
||||||
|
year,month,day,hour,min,sec = $1, $2, $3, $4, $5, $6
|
||||||
|
return Time.utc(year,month,day,hour,min,sec).getlocal
|
||||||
|
end
|
||||||
|
|
||||||
|
# set value to defined state
|
||||||
|
def initialize(value = nil,format=CFDate::TIMESTAMP_UNIX)
|
||||||
|
if(value.is_a?(Time) || value.nil?) then
|
||||||
|
@value = value.nil? ? Time.now : value
|
||||||
|
elsif value.instance_of? Date
|
||||||
|
@value = Time.utc(value.year, value.month, value.day, 0, 0, 0)
|
||||||
|
elsif value.instance_of? DateTime
|
||||||
|
@value = value.to_time.utc
|
||||||
|
else
|
||||||
|
set_value(value,format)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# set value with timestamp, either Apple or UNIX
|
||||||
|
def set_value(value,format=CFDate::TIMESTAMP_UNIX)
|
||||||
|
if(format == CFDate::TIMESTAMP_UNIX) then
|
||||||
|
@value = Time.at(value)
|
||||||
|
else
|
||||||
|
@value = Time.at(value + CFDate::DATE_DIFF_APPLE_UNIX)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# get timestamp, either UNIX or Apple timestamp
|
||||||
|
def get_value(format=CFDate::TIMESTAMP_UNIX)
|
||||||
|
if(format == CFDate::TIMESTAMP_UNIX) then
|
||||||
|
@value.to_i
|
||||||
|
else
|
||||||
|
@value.to_f - CFDate::DATE_DIFF_APPLE_UNIX
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('date')
|
||||||
|
n = parser.append_node(n, parser.new_text(CFDate::date_string(@value)))
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.date_to_binary(@value)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
@value.strftime("%Y-%m-%d %H:%M:%S %z")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class contains a boolean value
|
||||||
|
class CFBoolean < CFType
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
parser.new_node(@value ? 'true' : 'false')
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.bool_to_binary(@value);
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
@value ? "true" : "false"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class contains binary data values
|
||||||
|
class CFData < CFType
|
||||||
|
# Base64 encoded data
|
||||||
|
DATA_BASE64 = 0
|
||||||
|
# Raw data
|
||||||
|
DATA_RAW = 1
|
||||||
|
|
||||||
|
# set value to defined state, either base64 encoded or raw
|
||||||
|
def initialize(value=nil,format=DATA_BASE64)
|
||||||
|
if(format == DATA_RAW)
|
||||||
|
@raw_value = value
|
||||||
|
else
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# get base64 encoded value
|
||||||
|
def encoded_value
|
||||||
|
@value ||= "\n#{Base64.encode64(@raw_value).gsub("\n", '').scan(/.{1,76}/).join("\n")}\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
# get base64 decoded value
|
||||||
|
def decoded_value
|
||||||
|
@raw_value ||= Blob.new(Base64.decode64(@value))
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('data')
|
||||||
|
n = parser.append_node(n, parser.new_text(encoded_value()))
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.data_to_binary(decoded_value())
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
"<" + decoded_value.unpack("H*").join("") + ">"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This class contains an array of values
|
||||||
|
class CFArray < CFType
|
||||||
|
# create a new array CFType
|
||||||
|
def initialize(val=[])
|
||||||
|
@value = val
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('array')
|
||||||
|
@value.each do |v|
|
||||||
|
n = parser.append_node(n, v.to_xml(parser))
|
||||||
|
end
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.array_to_binary(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
ary = @value.map { |v| v.to_plain(plist) }
|
||||||
|
"( " + ary.join(", ") + " )"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# this class contains a hash of values
|
||||||
|
class CFDictionary < CFType
|
||||||
|
# Create new CFDictonary type.
|
||||||
|
def initialize(value={})
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to XML
|
||||||
|
def to_xml(parser)
|
||||||
|
n = parser.new_node('dict')
|
||||||
|
@value.each_pair do |key, value|
|
||||||
|
k = parser.append_node(parser.new_node('key'), parser.new_text(key.to_s))
|
||||||
|
n = parser.append_node(n, k)
|
||||||
|
n = parser.append_node(n, value.to_xml(parser))
|
||||||
|
end
|
||||||
|
n
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.dict_to_binary(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
str = "{ "
|
||||||
|
cfstr = CFString.new()
|
||||||
|
|
||||||
|
@value.each do |k,v|
|
||||||
|
cfstr.value = k
|
||||||
|
str << cfstr.to_plain(plist) + " = " + v.to_plain(plist) + "; "
|
||||||
|
end
|
||||||
|
|
||||||
|
str << "}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class CFUid < CFType
|
||||||
|
def to_xml(parser)
|
||||||
|
CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_xml(parser)
|
||||||
|
end
|
||||||
|
|
||||||
|
# convert to binary
|
||||||
|
def to_binary(bplist)
|
||||||
|
bplist.uid_to_binary(@value)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_plain(plist)
|
||||||
|
CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_plain(plist)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
149
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbLibXMLParser.rb
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'libxml'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# XML parser
|
||||||
|
class LibXMLParser < XMLParserInterface
|
||||||
|
LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER)
|
||||||
|
PARSER_OPTIONS = LibXML::XML::Parser::Options::NOBLANKS|LibXML::XML::Parser::Options::NONET
|
||||||
|
# read a XML file
|
||||||
|
# opts::
|
||||||
|
# * :file - The filename of the file to load
|
||||||
|
# * :data - The data to parse
|
||||||
|
def load(opts)
|
||||||
|
doc = nil
|
||||||
|
|
||||||
|
if(opts.has_key?(:file)) then
|
||||||
|
doc = LibXML::XML::Document.file(opts[:file],:options => PARSER_OPTIONS)
|
||||||
|
else
|
||||||
|
doc = LibXML::XML::Document.string(opts[:data],:options => PARSER_OPTIONS)
|
||||||
|
end
|
||||||
|
|
||||||
|
if doc
|
||||||
|
root = doc.root.first
|
||||||
|
return import_xml(root)
|
||||||
|
end
|
||||||
|
rescue LibXML::XML::Error => e
|
||||||
|
raise CFFormatError.new('invalid XML: ' + e.message)
|
||||||
|
end
|
||||||
|
|
||||||
|
# serialize CFPropertyList object to XML
|
||||||
|
# opts = {}:: Specify options: :formatted - Use indention and line breaks
|
||||||
|
def to_str(opts={})
|
||||||
|
doc = LibXML::XML::Document.new
|
||||||
|
|
||||||
|
doc.root = LibXML::XML::Node.new('plist')
|
||||||
|
doc.encoding = LibXML::XML::Encoding::UTF_8
|
||||||
|
|
||||||
|
doc.root['version'] = '1.0'
|
||||||
|
doc.root << opts[:root].to_xml(self)
|
||||||
|
|
||||||
|
# ugly hack, but there's no other possibility I know
|
||||||
|
str = doc.to_s(:indent => opts[:formatted])
|
||||||
|
str1 = String.new
|
||||||
|
first = false
|
||||||
|
str.each_line do |line|
|
||||||
|
str1 << line
|
||||||
|
unless(first) then
|
||||||
|
str1 << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/
|
||||||
|
end
|
||||||
|
|
||||||
|
first = true
|
||||||
|
end
|
||||||
|
|
||||||
|
str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
|
||||||
|
return str1
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_node(name)
|
||||||
|
LibXML::XML::Node.new(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_text(val)
|
||||||
|
LibXML::XML::Node.new_text(val)
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_node(parent, child)
|
||||||
|
parent << child
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
# get the value of a DOM node
|
||||||
|
def get_value(n)
|
||||||
|
content = if n.children?
|
||||||
|
n.first.content
|
||||||
|
else
|
||||||
|
n.content
|
||||||
|
end
|
||||||
|
|
||||||
|
content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
|
||||||
|
content
|
||||||
|
end
|
||||||
|
|
||||||
|
# import the XML values
|
||||||
|
def import_xml(node)
|
||||||
|
ret = nil
|
||||||
|
|
||||||
|
case node.name
|
||||||
|
when 'dict'
|
||||||
|
hsh = Hash.new
|
||||||
|
key = nil
|
||||||
|
|
||||||
|
if node.children? then
|
||||||
|
node.children.each do |n|
|
||||||
|
next if n.text? # avoid a bug of libxml
|
||||||
|
next if n.comment?
|
||||||
|
|
||||||
|
if n.name == "key" then
|
||||||
|
key = get_value(n)
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Format error!") if key.nil?
|
||||||
|
hsh[key] = import_xml(n)
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if hsh['CF$UID'] and hsh.keys.length == 1
|
||||||
|
ret = CFUid.new(hsh['CF$UID'].value)
|
||||||
|
else
|
||||||
|
ret = CFDictionary.new(hsh)
|
||||||
|
end
|
||||||
|
|
||||||
|
when 'array'
|
||||||
|
ary = Array.new
|
||||||
|
|
||||||
|
if node.children? then
|
||||||
|
node.children.each do |n|
|
||||||
|
next if n.text? # avoid a bug of libxml
|
||||||
|
next if n.comment?
|
||||||
|
ary.push import_xml(n)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ret = CFArray.new(ary)
|
||||||
|
|
||||||
|
when 'true'
|
||||||
|
ret = CFBoolean.new(true)
|
||||||
|
when 'false'
|
||||||
|
ret = CFBoolean.new(false)
|
||||||
|
when 'real'
|
||||||
|
ret = CFReal.new(get_value(node).to_f)
|
||||||
|
when 'integer'
|
||||||
|
ret = CFInteger.new(get_value(node).to_i)
|
||||||
|
when 'string'
|
||||||
|
ret = CFString.new(get_value(node))
|
||||||
|
when 'data'
|
||||||
|
ret = CFData.new(get_value(node))
|
||||||
|
when 'date'
|
||||||
|
ret = CFDate.new(CFDate.parse_date(get_value(node)))
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
152
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbNokogiriParser.rb
vendored
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'nokogiri'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# XML parser
|
||||||
|
class NokogiriXMLParser < ParserInterface
|
||||||
|
PARSER_OPTIONS = Nokogiri::XML::ParseOptions::NOBLANKS|Nokogiri::XML::ParseOptions::NONET
|
||||||
|
# read a XML file
|
||||||
|
# opts::
|
||||||
|
# * :file - The filename of the file to load
|
||||||
|
# * :data - The data to parse
|
||||||
|
def load(opts)
|
||||||
|
doc = nil
|
||||||
|
if(opts.has_key?(:file)) then
|
||||||
|
File.open(opts[:file], "rb") { |fd| doc = Nokogiri::XML::Document.parse(fd, nil, nil, PARSER_OPTIONS) }
|
||||||
|
else
|
||||||
|
doc = Nokogiri::XML::Document.parse(opts[:data], nil, nil, PARSER_OPTIONS)
|
||||||
|
end
|
||||||
|
|
||||||
|
if doc
|
||||||
|
root = doc.root.children.first
|
||||||
|
return import_xml(root)
|
||||||
|
end
|
||||||
|
rescue Nokogiri::XML::SyntaxError => e
|
||||||
|
raise CFFormatError.new('invalid XML: ' + e.message)
|
||||||
|
end
|
||||||
|
|
||||||
|
# serialize CFPropertyList object to XML
|
||||||
|
# opts = {}:: Specify options: :formatted - Use indention and line breaks
|
||||||
|
def to_str(opts={})
|
||||||
|
doc = Nokogiri::XML::Document.new
|
||||||
|
@doc = doc
|
||||||
|
|
||||||
|
doc.root = doc.create_element 'plist', :version => '1.0'
|
||||||
|
doc.encoding = 'UTF-8'
|
||||||
|
|
||||||
|
doc.root << opts[:root].to_xml(self)
|
||||||
|
|
||||||
|
# ugly hack, but there's no other possibility I know
|
||||||
|
s_opts = Nokogiri::XML::Node::SaveOptions::AS_XML
|
||||||
|
s_opts |= Nokogiri::XML::Node::SaveOptions::FORMAT if opts[:formatted]
|
||||||
|
|
||||||
|
str = doc.serialize(:save_with => s_opts)
|
||||||
|
str1 = String.new
|
||||||
|
first = false
|
||||||
|
str.each_line do |line|
|
||||||
|
str1 << line
|
||||||
|
unless(first) then
|
||||||
|
str1 << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/
|
||||||
|
end
|
||||||
|
|
||||||
|
first = true
|
||||||
|
end
|
||||||
|
|
||||||
|
str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
|
||||||
|
return str1
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_node(name)
|
||||||
|
@doc.create_element name
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_text(val)
|
||||||
|
@doc.create_text_node val
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_node(parent, child)
|
||||||
|
parent << child
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
# get the value of a DOM node
|
||||||
|
def get_value(n)
|
||||||
|
content = if n.children.empty?
|
||||||
|
n.content
|
||||||
|
else
|
||||||
|
n.children.first.content
|
||||||
|
end
|
||||||
|
|
||||||
|
content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
|
||||||
|
content
|
||||||
|
end
|
||||||
|
|
||||||
|
# import the XML values
|
||||||
|
def import_xml(node)
|
||||||
|
ret = nil
|
||||||
|
|
||||||
|
case node.name
|
||||||
|
when 'dict'
|
||||||
|
hsh = Hash.new
|
||||||
|
key = nil
|
||||||
|
children = node.children
|
||||||
|
|
||||||
|
unless children.empty? then
|
||||||
|
children.each do |n|
|
||||||
|
next if n.text? # avoid a bug of libxml
|
||||||
|
next if n.comment?
|
||||||
|
|
||||||
|
if n.name == "key" then
|
||||||
|
key = get_value(n)
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Format error!") if key.nil?
|
||||||
|
hsh[key] = import_xml(n)
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if hsh['CF$UID'] and hsh.keys.length == 1
|
||||||
|
ret = CFUid.new(hsh['CF$UID'].value)
|
||||||
|
else
|
||||||
|
ret = CFDictionary.new(hsh)
|
||||||
|
end
|
||||||
|
|
||||||
|
when 'array'
|
||||||
|
ary = Array.new
|
||||||
|
children = node.children
|
||||||
|
|
||||||
|
unless children.empty? then
|
||||||
|
children.each do |n|
|
||||||
|
next if n.text? # avoid a bug of libxml
|
||||||
|
next if n.comment?
|
||||||
|
ary.push import_xml(n)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ret = CFArray.new(ary)
|
||||||
|
|
||||||
|
when 'true'
|
||||||
|
ret = CFBoolean.new(true)
|
||||||
|
when 'false'
|
||||||
|
ret = CFBoolean.new(false)
|
||||||
|
when 'real'
|
||||||
|
ret = CFReal.new(get_value(node).to_f)
|
||||||
|
when 'integer'
|
||||||
|
ret = CFInteger.new(get_value(node).to_i)
|
||||||
|
when 'string'
|
||||||
|
ret = CFString.new(get_value(node))
|
||||||
|
when 'data'
|
||||||
|
ret = CFData.new(get_value(node))
|
||||||
|
when 'date'
|
||||||
|
ret = CFDate.new(CFDate.parse_date(get_value(node)))
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
199
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb
vendored
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'strscan'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# XML parser
|
||||||
|
class PlainParser < XMLParserInterface
|
||||||
|
# read a XML file
|
||||||
|
# opts::
|
||||||
|
# * :file - The filename of the file to load
|
||||||
|
# * :data - The data to parse
|
||||||
|
def load(opts)
|
||||||
|
@doc = nil
|
||||||
|
|
||||||
|
if(opts.has_key?(:file)) then
|
||||||
|
File.open(opts[:file], :external_encoding => "ASCII") do |fd|
|
||||||
|
@doc = StringScanner.new(fd.read)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@doc = StringScanner.new(opts[:data])
|
||||||
|
end
|
||||||
|
|
||||||
|
if @doc
|
||||||
|
root = import_plain
|
||||||
|
raise CFFormatError.new('content after root object') unless @doc.eos?
|
||||||
|
|
||||||
|
return root
|
||||||
|
end
|
||||||
|
|
||||||
|
raise CFFormatError.new('invalid plist string or file not found')
|
||||||
|
end
|
||||||
|
|
||||||
|
SPACES_AND_COMMENTS = %r{((?:/\*.*?\*/)|(?://.*?$\n?)|(?:\s*))+}x
|
||||||
|
|
||||||
|
# serialize CFPropertyList object to XML
|
||||||
|
# opts = {}:: Specify options: :formatted - Use indention and line breaks
|
||||||
|
def to_str(opts={})
|
||||||
|
opts[:root].to_plain(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
def skip_whitespaces
|
||||||
|
@doc.skip SPACES_AND_COMMENTS
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_dict
|
||||||
|
skip_whitespaces
|
||||||
|
hsh = {}
|
||||||
|
|
||||||
|
while not @doc.scan(/\}/)
|
||||||
|
key = import_plain
|
||||||
|
raise CFFormatError.new("invalid dictionary format") if !key
|
||||||
|
|
||||||
|
if key.is_a?(CFString)
|
||||||
|
key = key.value
|
||||||
|
elsif key.is_a?(CFInteger) or key.is_a?(CFReal)
|
||||||
|
key = key.value.to_s
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("invalid key format")
|
||||||
|
end
|
||||||
|
|
||||||
|
skip_whitespaces
|
||||||
|
|
||||||
|
raise CFFormatError.new("invalid dictionary format") unless @doc.scan(/=/)
|
||||||
|
|
||||||
|
skip_whitespaces
|
||||||
|
val = import_plain
|
||||||
|
|
||||||
|
skip_whitespaces
|
||||||
|
raise CFFormatError.new("invalid dictionary format") unless @doc.scan(/;/)
|
||||||
|
skip_whitespaces
|
||||||
|
|
||||||
|
hsh[key] = val
|
||||||
|
raise CFFormatError.new("invalid dictionary format") if @doc.eos?
|
||||||
|
end
|
||||||
|
|
||||||
|
CFDictionary.new(hsh)
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_array
|
||||||
|
skip_whitespaces
|
||||||
|
ary = []
|
||||||
|
|
||||||
|
while not @doc.scan(/\)/)
|
||||||
|
val = import_plain
|
||||||
|
|
||||||
|
return nil if not val or not val.value
|
||||||
|
skip_whitespaces
|
||||||
|
|
||||||
|
if not @doc.skip(/,\s*/)
|
||||||
|
if @doc.scan(/\)/)
|
||||||
|
ary << val
|
||||||
|
return CFArray.new(ary)
|
||||||
|
end
|
||||||
|
|
||||||
|
raise CFFormatError.new("invalid array format")
|
||||||
|
end
|
||||||
|
|
||||||
|
ary << val
|
||||||
|
raise CFFormatError.new("invalid array format") if @doc.eos?
|
||||||
|
end
|
||||||
|
|
||||||
|
CFArray.new(ary)
|
||||||
|
end
|
||||||
|
|
||||||
|
def escape_char
|
||||||
|
case @doc.matched
|
||||||
|
when '"'
|
||||||
|
'"'
|
||||||
|
when '\\'
|
||||||
|
'\\'
|
||||||
|
when 'a'
|
||||||
|
"\a"
|
||||||
|
when 'b'
|
||||||
|
"\b"
|
||||||
|
when 'f'
|
||||||
|
"\f"
|
||||||
|
when 'n'
|
||||||
|
"\n"
|
||||||
|
when 'v'
|
||||||
|
"\v"
|
||||||
|
when 'r'
|
||||||
|
"\r"
|
||||||
|
when 't'
|
||||||
|
"\t"
|
||||||
|
when 'U'
|
||||||
|
@doc.scan(/.{4}/).hex.chr('utf-8')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_quoted
|
||||||
|
str = ''
|
||||||
|
|
||||||
|
while not @doc.scan(/"/)
|
||||||
|
if @doc.scan(/\\/)
|
||||||
|
@doc.scan(/./)
|
||||||
|
str << escape_char
|
||||||
|
|
||||||
|
elsif @doc.eos?
|
||||||
|
raise CFFormatError.new("unterminated string")
|
||||||
|
|
||||||
|
else @doc.scan(/./)
|
||||||
|
str << @doc.matched
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
CFString.new(str)
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_unquoted
|
||||||
|
raise CFFormatError.new("unexpected end of file") if @doc.eos?
|
||||||
|
|
||||||
|
if @doc.scan(/(\d\d\d\d)-(\d\d)-(\d\d)\s+(\d\d):(\d\d):(\d\d)(?:\s+(\+|-)(\d\d)(\d\d))?/)
|
||||||
|
year,month,day,hour,min,sec,pl_min,tz_hour, tz_min = @doc[1], @doc[2], @doc[3], @doc[4], @doc[5], @doc[6], @doc[7], @doc[8], @doc[9]
|
||||||
|
CFDate.new(Time.new(year, month, day, hour, min, sec, pl_min ? sprintf("%s%s:%s", pl_min, tz_hour, tz_min) : nil))
|
||||||
|
|
||||||
|
elsif @doc.scan(/-?\d+?\.\d+\b/)
|
||||||
|
CFReal.new(@doc.matched.to_f)
|
||||||
|
|
||||||
|
elsif @doc.scan(/-?\d+\b/)
|
||||||
|
CFInteger.new(@doc.matched.to_i)
|
||||||
|
|
||||||
|
elsif @doc.scan(/\b(true|false)\b/)
|
||||||
|
CFBoolean.new(@doc.matched == 'true')
|
||||||
|
else
|
||||||
|
CFString.new(@doc.scan(/\w+/))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_binary
|
||||||
|
@doc.scan(/(.*?)>/)
|
||||||
|
|
||||||
|
hex_str = @doc[1].gsub(/ /, '')
|
||||||
|
CFData.new([hex_str].pack("H*"), CFData::DATA_RAW)
|
||||||
|
end
|
||||||
|
|
||||||
|
# import the XML values
|
||||||
|
def import_plain
|
||||||
|
skip_whitespaces
|
||||||
|
ret = nil
|
||||||
|
|
||||||
|
if @doc.scan(/\{/) # dict
|
||||||
|
ret = read_dict
|
||||||
|
elsif @doc.scan(/\(/) # array
|
||||||
|
ret = read_array
|
||||||
|
elsif @doc.scan(/"/) # string
|
||||||
|
ret = read_quoted
|
||||||
|
elsif @doc.scan(/</) # binary
|
||||||
|
ret = read_binary
|
||||||
|
else # string w/o quotes
|
||||||
|
ret = read_unquoted
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
148
ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbREXMLParser.rb
vendored
Normal file
|
|
@ -0,0 +1,148 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
require 'rexml/document'
|
||||||
|
|
||||||
|
module CFPropertyList
|
||||||
|
# XML parser
|
||||||
|
class ReXMLParser < ParserInterface
|
||||||
|
# read a XML file
|
||||||
|
# opts::
|
||||||
|
# * :file - The filename of the file to load
|
||||||
|
# * :data - The data to parse
|
||||||
|
def load(opts)
|
||||||
|
|
||||||
|
doc = nil
|
||||||
|
if(opts.has_key?(:file)) then
|
||||||
|
File.open(opts[:file], "rb") { |fd| doc = REXML::Document.new(fd) }
|
||||||
|
else
|
||||||
|
doc = REXML::Document.new(opts[:data])
|
||||||
|
end
|
||||||
|
|
||||||
|
if doc
|
||||||
|
root = doc.root.elements[1]
|
||||||
|
return import_xml(root)
|
||||||
|
end
|
||||||
|
rescue REXML::ParseException => e
|
||||||
|
raise CFFormatError.new('invalid XML: ' + e.message)
|
||||||
|
end
|
||||||
|
|
||||||
|
# serialize CFPropertyList object to XML
|
||||||
|
# opts = {}:: Specify options: :formatted - Use indention and line breaks
|
||||||
|
def to_str(opts={})
|
||||||
|
doc = REXML::Document.new
|
||||||
|
@doc = doc
|
||||||
|
|
||||||
|
doc.context[:attribute_quote] = :quote
|
||||||
|
|
||||||
|
doc.add_element 'plist', {'version' => '1.0'}
|
||||||
|
doc.root << opts[:root].to_xml(self)
|
||||||
|
|
||||||
|
formatter = if opts[:formatted] then
|
||||||
|
f = REXML::Formatters::Pretty.new(2)
|
||||||
|
f.compact = true
|
||||||
|
f.width = Float::INFINITY
|
||||||
|
f
|
||||||
|
else
|
||||||
|
REXML::Formatters::Default.new
|
||||||
|
end
|
||||||
|
|
||||||
|
str = formatter.write(doc.root, "")
|
||||||
|
str1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" + str + "\n"
|
||||||
|
str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
|
||||||
|
|
||||||
|
return str1
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_node(name)
|
||||||
|
REXML::Element.new(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_text(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_node(parent, child)
|
||||||
|
if child.is_a?(String) then
|
||||||
|
parent.add_text child
|
||||||
|
else
|
||||||
|
parent.elements << child
|
||||||
|
end
|
||||||
|
parent
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
# get the value of a DOM node
|
||||||
|
def get_value(n)
|
||||||
|
content = n.text
|
||||||
|
|
||||||
|
content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
|
||||||
|
content
|
||||||
|
end
|
||||||
|
|
||||||
|
# import the XML values
|
||||||
|
def import_xml(node)
|
||||||
|
ret = nil
|
||||||
|
|
||||||
|
case node.name
|
||||||
|
when 'dict'
|
||||||
|
hsh = Hash.new
|
||||||
|
key = nil
|
||||||
|
|
||||||
|
if node.has_elements? then
|
||||||
|
node.elements.each do |n|
|
||||||
|
next if n.name == '#text' # avoid a bug of libxml
|
||||||
|
next if n.name == '#comment'
|
||||||
|
|
||||||
|
if n.name == "key" then
|
||||||
|
key = get_value(n)
|
||||||
|
key = '' if key.nil? # REXML returns nil if key is empty
|
||||||
|
else
|
||||||
|
raise CFFormatError.new("Format error!") if key.nil?
|
||||||
|
hsh[key] = import_xml(n)
|
||||||
|
key = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if hsh['CF$UID'] and hsh.keys.length == 1
|
||||||
|
ret = CFUid.new(hsh['CF$UID'].value)
|
||||||
|
else
|
||||||
|
ret = CFDictionary.new(hsh)
|
||||||
|
end
|
||||||
|
|
||||||
|
when 'array'
|
||||||
|
ary = Array.new
|
||||||
|
|
||||||
|
if node.has_elements? then
|
||||||
|
node.elements.each do |n|
|
||||||
|
next if n.name == '#text' # avoid a bug of libxml
|
||||||
|
ary.push import_xml(n)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ret = CFArray.new(ary)
|
||||||
|
|
||||||
|
when 'true'
|
||||||
|
ret = CFBoolean.new(true)
|
||||||
|
when 'false'
|
||||||
|
ret = CFBoolean.new(false)
|
||||||
|
when 'real'
|
||||||
|
ret = CFReal.new(get_value(node).to_f)
|
||||||
|
when 'integer'
|
||||||
|
ret = CFInteger.new(get_value(node).to_i)
|
||||||
|
when 'string'
|
||||||
|
ret = CFString.new(get_value(node))
|
||||||
|
ret.value = '' if ret.value.nil? # REXML returns nil for empty elements' .text attribute
|
||||||
|
when 'data'
|
||||||
|
ret = CFData.new(get_value(node))
|
||||||
|
when 'date'
|
||||||
|
ret = CFDate.new(CFDate.parse_date(get_value(node)))
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# eof
|
||||||
11
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
/.bundle/
|
||||||
|
/.yardoc
|
||||||
|
/_yardoc/
|
||||||
|
/coverage/
|
||||||
|
/doc/
|
||||||
|
/pkg/
|
||||||
|
/spec/reports/
|
||||||
|
/tmp/
|
||||||
|
|
||||||
|
# rspec failure tracking
|
||||||
|
.rspec_status
|
||||||
3
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rspec
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
--format documentation
|
||||||
|
--color
|
||||||
|
--require spec_helper
|
||||||
2
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop.yml
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
inherit_from: .rubocop_todo.yml
|
||||||
|
|
||||||
32
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop_todo.yml
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
# This configuration was generated by
|
||||||
|
# `rubocop --auto-gen-config`
|
||||||
|
# on 2018-02-02 08:32:23 -0800 using RuboCop version 0.52.1.
|
||||||
|
# The point is for the user to remove these configuration records
|
||||||
|
# one by one as the offenses are removed from the code base.
|
||||||
|
# Note that changes in the inspected code, or installation of new
|
||||||
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Configuration parameters: Include.
|
||||||
|
# Include: **/*.gemspec
|
||||||
|
Gemspec/RequiredRubyVersion:
|
||||||
|
Exclude:
|
||||||
|
- 'atomos.gemspec'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Configuration parameters: CountComments.
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Max: 14
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/Documentation:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/**/*'
|
||||||
|
- 'test/**/*'
|
||||||
|
- 'lib/atomos.rb'
|
||||||
|
|
||||||
|
# Offense count: 7
|
||||||
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
||||||
|
# URISchemes: http, https
|
||||||
|
Metrics/LineLength:
|
||||||
|
Max: 97
|
||||||
5
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.travis.yml
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
sudo: false
|
||||||
|
language: ruby
|
||||||
|
rvm:
|
||||||
|
- 2.5.0
|
||||||
|
before_install: gem install bundler -v 1.16.1
|
||||||
74
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md
vendored
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at segiddins@squareup.com. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
||||||
8
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
||||||
|
|
||||||
|
# Specify your gem's dependencies in atomos.gemspec
|
||||||
|
gemspec
|
||||||
51
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile.lock
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
PATH
|
||||||
|
remote: .
|
||||||
|
specs:
|
||||||
|
atomos (0.1.3)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
ast (2.3.0)
|
||||||
|
diff-lcs (1.3)
|
||||||
|
parallel (1.12.1)
|
||||||
|
parser (2.4.0.2)
|
||||||
|
ast (~> 2.3)
|
||||||
|
powerpack (0.1.1)
|
||||||
|
rainbow (3.0.0)
|
||||||
|
rake (10.5.0)
|
||||||
|
rspec (3.7.0)
|
||||||
|
rspec-core (~> 3.7.0)
|
||||||
|
rspec-expectations (~> 3.7.0)
|
||||||
|
rspec-mocks (~> 3.7.0)
|
||||||
|
rspec-core (3.7.1)
|
||||||
|
rspec-support (~> 3.7.0)
|
||||||
|
rspec-expectations (3.7.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.7.0)
|
||||||
|
rspec-mocks (3.7.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.7.0)
|
||||||
|
rspec-support (3.7.0)
|
||||||
|
rubocop (0.52.1)
|
||||||
|
parallel (~> 1.10)
|
||||||
|
parser (>= 2.4.0.2, < 3.0)
|
||||||
|
powerpack (~> 0.1)
|
||||||
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
|
ruby-progressbar (~> 1.7)
|
||||||
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||||
|
ruby-progressbar (1.9.0)
|
||||||
|
unicode-display_width (1.3.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
atomos!
|
||||||
|
bundler (~> 1.16)
|
||||||
|
rake (~> 10.0)
|
||||||
|
rspec (~> 3.0)
|
||||||
|
rubocop
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.16.3
|
||||||
21
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/LICENSE.txt
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2018 Samuel Giddins
|
||||||
|
|
||||||
|
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.
|
||||||
43
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/README.md
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Atomos
|
||||||
|
|
||||||
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/atomos`. To experiment with that code, run `bin/console` for an interactive prompt.
|
||||||
|
|
||||||
|
TODO: Delete this and the text above, and describe your gem
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add this line to your application's Gemfile:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
gem 'atomos'
|
||||||
|
```
|
||||||
|
|
||||||
|
And then execute:
|
||||||
|
|
||||||
|
$ bundle
|
||||||
|
|
||||||
|
Or install it yourself as:
|
||||||
|
|
||||||
|
$ gem install atomos
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
TODO: Write usage instructions here
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
||||||
|
|
||||||
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/atomos. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
||||||
|
|
||||||
|
## Code of Conduct
|
||||||
|
|
||||||
|
Everyone interacting in the Atomos project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/atomos/blob/master/CODE_OF_CONDUCT.md).
|
||||||
11
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Rakefile
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'bundler/gem_tasks'
|
||||||
|
|
||||||
|
require 'rspec/core/rake_task'
|
||||||
|
require 'rubocop/rake_task'
|
||||||
|
|
||||||
|
RSpec::Core::RakeTask.new
|
||||||
|
RuboCop::RakeTask.new
|
||||||
|
|
||||||
|
task default: %i[rubocop spec]
|
||||||
1
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/VERSION
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0.1.3
|
||||||
26
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/atomos.gemspec
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
Gem::Specification.new do |spec|
|
||||||
|
spec.name = 'atomos'
|
||||||
|
spec.version = File.read(File.expand_path('../VERSION', __FILE__))
|
||||||
|
spec.authors = ['Samuel Giddins']
|
||||||
|
spec.email = ['segiddins@segiddins.me']
|
||||||
|
|
||||||
|
spec.summary = 'A simple gem to atomically write files'
|
||||||
|
spec.homepage = 'https://github.com/segiddins/atomos'
|
||||||
|
spec.license = 'MIT'
|
||||||
|
|
||||||
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
||||||
|
f.match(%r{^(test|spec|features)/})
|
||||||
|
end
|
||||||
|
spec.bindir = 'exe'
|
||||||
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
||||||
|
spec.require_paths = ['lib']
|
||||||
|
|
||||||
|
spec.required_ruby_version = '>= 2.0'
|
||||||
|
|
||||||
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
||||||
|
spec.add_development_dependency 'rake', '~> 10.0'
|
||||||
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
||||||
|
spec.add_development_dependency 'rubocop'
|
||||||
|
end
|
||||||
15
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/console
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'bundler/setup'
|
||||||
|
require 'atomos'
|
||||||
|
|
||||||
|
# You can add fixtures and/or initialization code here to make experimenting
|
||||||
|
# with your gem easier. You can also use a different console, if you like.
|
||||||
|
|
||||||
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
||||||
|
# require "pry"
|
||||||
|
# Pry.start
|
||||||
|
|
||||||
|
require 'irb'
|
||||||
|
IRB.start(__FILE__)
|
||||||
29
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rake
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file was generated by Bundler.
|
||||||
|
#
|
||||||
|
# The application 'rake' is installed as part of a gem, and
|
||||||
|
# this file is here to facilitate running it.
|
||||||
|
#
|
||||||
|
|
||||||
|
require 'pathname'
|
||||||
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
||||||
|
Pathname.new(__FILE__).realpath)
|
||||||
|
|
||||||
|
bundle_binstub = File.expand_path('../bundle', __FILE__)
|
||||||
|
|
||||||
|
if File.file?(bundle_binstub)
|
||||||
|
if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
|
||||||
|
load(bundle_binstub)
|
||||||
|
else
|
||||||
|
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
||||||
|
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler/setup'
|
||||||
|
|
||||||
|
load Gem.bin_path('rake', 'rake')
|
||||||
29
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rspec
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file was generated by Bundler.
|
||||||
|
#
|
||||||
|
# The application 'rspec' is installed as part of a gem, and
|
||||||
|
# this file is here to facilitate running it.
|
||||||
|
#
|
||||||
|
|
||||||
|
require 'pathname'
|
||||||
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
||||||
|
Pathname.new(__FILE__).realpath)
|
||||||
|
|
||||||
|
bundle_binstub = File.expand_path('../bundle', __FILE__)
|
||||||
|
|
||||||
|
if File.file?(bundle_binstub)
|
||||||
|
if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
|
||||||
|
load(bundle_binstub)
|
||||||
|
else
|
||||||
|
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
||||||
|
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler/setup'
|
||||||
|
|
||||||
|
load Gem.bin_path('rspec-core', 'rspec')
|
||||||
29
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rubocop
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file was generated by Bundler.
|
||||||
|
#
|
||||||
|
# The application 'rubocop' is installed as part of a gem, and
|
||||||
|
# this file is here to facilitate running it.
|
||||||
|
#
|
||||||
|
|
||||||
|
require 'pathname'
|
||||||
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
||||||
|
Pathname.new(__FILE__).realpath)
|
||||||
|
|
||||||
|
bundle_binstub = File.expand_path('../bundle', __FILE__)
|
||||||
|
|
||||||
|
if File.file?(bundle_binstub)
|
||||||
|
if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
|
||||||
|
load(bundle_binstub)
|
||||||
|
else
|
||||||
|
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
||||||
|
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler/setup'
|
||||||
|
|
||||||
|
load Gem.bin_path('rubocop', 'rubocop')
|
||||||
8
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/setup
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
set -vx
|
||||||
|
|
||||||
|
bundle install
|
||||||
|
|
||||||
|
# Do any other automated setup that you need to do here
|
||||||
47
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos.rb
vendored
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'atomos/version'
|
||||||
|
|
||||||
|
module Atomos
|
||||||
|
module_function
|
||||||
|
|
||||||
|
# rubocop:disable Metrics/MethodLength
|
||||||
|
def atomic_write(dest, contents = nil, tmpdir: nil, &block)
|
||||||
|
unless contents.nil? ^ block.nil?
|
||||||
|
raise ArgumentError, 'must provide either contents or a block'
|
||||||
|
end
|
||||||
|
|
||||||
|
tmpdir = Atomos.default_tmpdir_for_file(dest, tmpdir)
|
||||||
|
|
||||||
|
require 'tempfile'
|
||||||
|
Tempfile.open(".atomos.#{File.basename(dest)}", tmpdir) do |tmpfile|
|
||||||
|
if contents
|
||||||
|
tmpfile << contents
|
||||||
|
else
|
||||||
|
retval = yield tmpfile
|
||||||
|
end
|
||||||
|
|
||||||
|
tmpfile.close
|
||||||
|
|
||||||
|
File.rename(tmpfile.path, dest)
|
||||||
|
|
||||||
|
retval
|
||||||
|
end
|
||||||
|
end
|
||||||
|
# rubocop:enable Metrics/MethodLength
|
||||||
|
|
||||||
|
def self.default_tmpdir_for_file(dest, tmpdir)
|
||||||
|
tmpdir ||= begin
|
||||||
|
require 'tmpdir'
|
||||||
|
Dir.tmpdir
|
||||||
|
end
|
||||||
|
|
||||||
|
# Ensure the destination is on the same device as tmpdir
|
||||||
|
if File.stat(tmpdir).dev != File.stat(File.dirname(dest)).dev
|
||||||
|
# If not, use the directory of the destination as the tmpdir.
|
||||||
|
tmpdir = File.dirname(dest)
|
||||||
|
end
|
||||||
|
|
||||||
|
tmpdir
|
||||||
|
end
|
||||||
|
end
|
||||||
5
ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos/version.rb
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Atomos
|
||||||
|
VERSION = File.read(File.expand_path('../../../VERSION', __FILE__))
|
||||||
|
end
|
||||||
22
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/BSDL
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
56
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/COPYING
vendored
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
|
||||||
|
You can redistribute it and/or modify it under either the terms of the
|
||||||
|
2-clause BSDL (see the file BSDL), or the conditions below:
|
||||||
|
|
||||||
|
1. You may make and give away verbatim copies of the source form of the
|
||||||
|
software without restriction, provided that you duplicate all of the
|
||||||
|
original copyright notices and associated disclaimers.
|
||||||
|
|
||||||
|
2. You may modify your copy of the software in any way, provided that
|
||||||
|
you do at least ONE of the following:
|
||||||
|
|
||||||
|
a. place your modifications in the Public Domain or otherwise
|
||||||
|
make them Freely Available, such as by posting said
|
||||||
|
modifications to Usenet or an equivalent medium, or by allowing
|
||||||
|
the author to include your modifications in the software.
|
||||||
|
|
||||||
|
b. use the modified software only within your corporation or
|
||||||
|
organization.
|
||||||
|
|
||||||
|
c. give non-standard binaries non-standard names, with
|
||||||
|
instructions on where to get the original software distribution.
|
||||||
|
|
||||||
|
d. make other distribution arrangements with the author.
|
||||||
|
|
||||||
|
3. You may distribute the software in object code or binary form,
|
||||||
|
provided that you do at least ONE of the following:
|
||||||
|
|
||||||
|
a. distribute the binaries and library files of the software,
|
||||||
|
together with instructions (in the manual page or equivalent)
|
||||||
|
on where to get the original distribution.
|
||||||
|
|
||||||
|
b. accompany the distribution with the machine-readable source of
|
||||||
|
the software.
|
||||||
|
|
||||||
|
c. give non-standard binaries non-standard names, with
|
||||||
|
instructions on where to get the original software distribution.
|
||||||
|
|
||||||
|
d. make other distribution arrangements with the author.
|
||||||
|
|
||||||
|
4. You may modify and include the part of the software into any other
|
||||||
|
software (possibly commercial). But some files in the distribution
|
||||||
|
are not written by the author, so that they are not under these terms.
|
||||||
|
|
||||||
|
For the list of those files and their copying conditions, see the
|
||||||
|
file LEGAL.
|
||||||
|
|
||||||
|
5. The scripts and library files supplied as input to or produced as
|
||||||
|
output from the software do not automatically fall under the
|
||||||
|
copyright of the software, but belong to whomever generated them,
|
||||||
|
and may be sold commercially, and may be aggregated with this
|
||||||
|
software.
|
||||||
|
|
||||||
|
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE.
|
||||||
60
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/LEGAL
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
# -*- rdoc -*-
|
||||||
|
|
||||||
|
= LEGAL NOTICE INFORMATION
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
All the files in this distribution are covered under either the Ruby's
|
||||||
|
license (see the file COPYING) or public-domain except some files
|
||||||
|
mentioned below.
|
||||||
|
|
||||||
|
== MIT License
|
||||||
|
>>>
|
||||||
|
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.
|
||||||
|
|
||||||
|
== Old-style BSD license
|
||||||
|
>>>
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of the University nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
IMPORTANT NOTE::
|
||||||
|
|
||||||
|
From ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||||
|
paragraph 3 above is now null and void.
|
||||||
48
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/README.md
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
# Base64
|
||||||
|
|
||||||
|
The Base64 module provides for the encoding (`#encode64`, `#strict_encode64`,
|
||||||
|
`#urlsafe_encode64`) and decoding (`#decode64`, `#strict_decode64`,
|
||||||
|
`#urlsafe_decode64`) of binary data using a Base64 representation.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add this line to your application's Gemfile:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
gem 'base64'
|
||||||
|
```
|
||||||
|
|
||||||
|
And then execute:
|
||||||
|
|
||||||
|
$ bundle install
|
||||||
|
|
||||||
|
Or install it yourself as:
|
||||||
|
|
||||||
|
$ gem install base64
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
A simple encoding and decoding.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require "base64"
|
||||||
|
|
||||||
|
enc = Base64.encode64('Send reinforcements')
|
||||||
|
# -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
|
||||||
|
plain = Base64.decode64(enc)
|
||||||
|
# -> "Send reinforcements"
|
||||||
|
```
|
||||||
|
|
||||||
|
The purpose of using base64 to encode data is that it translates any
|
||||||
|
binary data into purely printable characters.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
||||||
|
|
||||||
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/base64.
|
||||||
|
|
||||||
381
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/lib/base64.rb
vendored
Normal file
|
|
@ -0,0 +1,381 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
#
|
||||||
|
# \Module \Base64 provides methods for:
|
||||||
|
#
|
||||||
|
# - \Encoding a binary string (containing non-ASCII characters)
|
||||||
|
# as a string of printable ASCII characters.
|
||||||
|
# - Decoding such an encoded string.
|
||||||
|
#
|
||||||
|
# \Base64 is commonly used in contexts where binary data
|
||||||
|
# is not allowed or supported:
|
||||||
|
#
|
||||||
|
# - Images in HTML or CSS files, or in URLs.
|
||||||
|
# - Email attachments.
|
||||||
|
#
|
||||||
|
# A \Base64-encoded string is about one-third larger that its source.
|
||||||
|
# See the {Wikipedia article}[https://en.wikipedia.org/wiki/Base64]
|
||||||
|
# for more information.
|
||||||
|
#
|
||||||
|
# This module provides three pairs of encode/decode methods.
|
||||||
|
# Your choices among these methods should depend on:
|
||||||
|
#
|
||||||
|
# - Which character set is to be used for encoding and decoding.
|
||||||
|
# - Whether "padding" is to be used.
|
||||||
|
# - Whether encoded strings are to contain newlines.
|
||||||
|
#
|
||||||
|
# Note: Examples on this page assume that the including program has executed:
|
||||||
|
#
|
||||||
|
# require 'base64'
|
||||||
|
#
|
||||||
|
# == \Encoding Character Sets
|
||||||
|
#
|
||||||
|
# A \Base64-encoded string consists only of characters from a 64-character set:
|
||||||
|
#
|
||||||
|
# - <tt>('A'..'Z')</tt>.
|
||||||
|
# - <tt>('a'..'z')</tt>.
|
||||||
|
# - <tt>('0'..'9')</tt>.
|
||||||
|
# - <tt>=</tt>, the 'padding' character.
|
||||||
|
# - Either:
|
||||||
|
# - <tt>%w[+ /]</tt>:
|
||||||
|
# {RFC-2045-compliant}[https://datatracker.ietf.org/doc/html/rfc2045];
|
||||||
|
# _not_ safe for URLs.
|
||||||
|
# - <tt>%w[- _]</tt>:
|
||||||
|
# {RFC-4648-compliant}[https://datatracker.ietf.org/doc/html/rfc4648];
|
||||||
|
# safe for URLs.
|
||||||
|
#
|
||||||
|
# If you are working with \Base64-encoded strings that will come from
|
||||||
|
# or be put into URLs, you should choose this encoder-decoder pair
|
||||||
|
# of RFC-4648-compliant methods:
|
||||||
|
#
|
||||||
|
# - Base64.urlsafe_encode64 and Base64.urlsafe_decode64.
|
||||||
|
#
|
||||||
|
# Otherwise, you may choose any of the pairs in this module,
|
||||||
|
# including the pair above, or the RFC-2045-compliant pairs:
|
||||||
|
#
|
||||||
|
# - Base64.encode64 and Base64.decode64.
|
||||||
|
# - Base64.strict_encode64 and Base64.strict_decode64.
|
||||||
|
#
|
||||||
|
# == Padding
|
||||||
|
#
|
||||||
|
# \Base64-encoding changes a triplet of input bytes
|
||||||
|
# into a quartet of output characters.
|
||||||
|
#
|
||||||
|
# <b>Padding in Encode Methods</b>
|
||||||
|
#
|
||||||
|
# Padding -- extending an encoded string with zero, one, or two trailing
|
||||||
|
# <tt>=</tt> characters -- is performed by methods Base64.encode64,
|
||||||
|
# Base64.strict_encode64, and, by default, Base64.urlsafe_encode64:
|
||||||
|
#
|
||||||
|
# Base64.encode64('s') # => "cw==\n"
|
||||||
|
# Base64.strict_encode64('s') # => "cw=="
|
||||||
|
# Base64.urlsafe_encode64('s') # => "cw=="
|
||||||
|
# Base64.urlsafe_encode64('s', padding: false) # => "cw"
|
||||||
|
#
|
||||||
|
# When padding is performed, the encoded string is always of length <em>4n</em>,
|
||||||
|
# where +n+ is a non-negative integer:
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n</em> generate unpadded output characters
|
||||||
|
# of length <em>4n</em>:
|
||||||
|
#
|
||||||
|
# # n = 1: 3 bytes => 4 characters.
|
||||||
|
# Base64.strict_encode64('123') # => "MDEy"
|
||||||
|
# # n = 2: 6 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('123456') # => "MDEyMzQ1"
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n+1</em> generate padded output characters
|
||||||
|
# of length <em>4(n+1)</em>, with two padding characters at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 4 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('1234') # => "MDEyMw=="
|
||||||
|
# # n = 2: 7 bytes => 12 characters.
|
||||||
|
# Base64.strict_encode64('1234567') # => "MDEyMzQ1Ng=="
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n+2</em> generate padded output characters
|
||||||
|
# of length <em>4(n+1)</em>, with one padding character at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 5 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('12345') # => "MDEyMzQ="
|
||||||
|
# # n = 2: 8 bytes => 12 characters.
|
||||||
|
# Base64.strict_encode64('12345678') # => "MDEyMzQ1Njc="
|
||||||
|
#
|
||||||
|
# When padding is suppressed, for a positive integer <em>n</em>:
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n</em> generate unpadded output characters
|
||||||
|
# of length <em>4n</em>:
|
||||||
|
#
|
||||||
|
# # n = 1: 3 bytes => 4 characters.
|
||||||
|
# Base64.urlsafe_encode64('123', padding: false) # => "MDEy"
|
||||||
|
# # n = 2: 6 bytes => 8 characters.
|
||||||
|
# Base64.urlsafe_encode64('123456', padding: false) # => "MDEyMzQ1"
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n+1</em> generate unpadded output characters
|
||||||
|
# of length <em>4n+2</em>, with two padding characters at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 4 bytes => 6 characters.
|
||||||
|
# Base64.urlsafe_encode64('1234', padding: false) # => "MDEyMw"
|
||||||
|
# # n = 2: 7 bytes => 10 characters.
|
||||||
|
# Base64.urlsafe_encode64('1234567', padding: false) # => "MDEyMzQ1Ng"
|
||||||
|
#
|
||||||
|
# - Input bytes of length <em>3n+2</em> generate unpadded output characters
|
||||||
|
# of length <em>4n+3</em>, with one padding character at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 5 bytes => 7 characters.
|
||||||
|
# Base64.urlsafe_encode64('12345', padding: false) # => "MDEyMzQ"
|
||||||
|
# # m = 2: 8 bytes => 11 characters.
|
||||||
|
# Base64.urlsafe_encode64('12345678', padding: false) # => "MDEyMzQ1Njc"
|
||||||
|
#
|
||||||
|
# <b>Padding in Decode Methods</b>
|
||||||
|
#
|
||||||
|
# All of the \Base64 decode methods support (but do not require) padding.
|
||||||
|
#
|
||||||
|
# \Method Base64.decode64 does not check the size of the padding:
|
||||||
|
#
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
|
||||||
|
#
|
||||||
|
# \Method Base64.strict_decode64 strictly enforces padding size:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
|
||||||
|
#
|
||||||
|
# \Method Base64.urlsafe_decode64 allows padding in the encoded string,
|
||||||
|
# which if present, must be correct:
|
||||||
|
# see {Padding}[Base64.html#module-Base64-label-Padding], above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
# == Newlines
|
||||||
|
#
|
||||||
|
# An encoded string returned by Base64.encode64 or Base64.urlsafe_encode64
|
||||||
|
# has an embedded newline character
|
||||||
|
# after each 60-character sequence, and, if non-empty, at the end:
|
||||||
|
#
|
||||||
|
# # No newline if empty.
|
||||||
|
# encoded = Base64.encode64("\x00" * 0)
|
||||||
|
# encoded.index("\n") # => nil
|
||||||
|
#
|
||||||
|
# # Newline at end of short output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 1)
|
||||||
|
# encoded.size # => 4
|
||||||
|
# encoded.index("\n") # => 4
|
||||||
|
#
|
||||||
|
# # Newline at end of longer output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 45)
|
||||||
|
# encoded.size # => 60
|
||||||
|
# encoded.index("\n") # => 60
|
||||||
|
#
|
||||||
|
# # Newlines embedded and at end of still longer output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 46)
|
||||||
|
# encoded.size # => 65
|
||||||
|
# encoded.rindex("\n") # => 65
|
||||||
|
# encoded.split("\n").map {|s| s.size } # => [60, 4]
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines,
|
||||||
|
# which are encoded as \Base64:
|
||||||
|
#
|
||||||
|
# # Base64.encode64("\n\n\n") # => "CgoK\n"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
#
|
||||||
|
module Base64
|
||||||
|
|
||||||
|
VERSION = "0.3.0"
|
||||||
|
|
||||||
|
module_function
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.encode64(string) -> encoded_string
|
||||||
|
#
|
||||||
|
# Returns a string containing the RFC-2045-compliant \Base64-encoding of +string+.
|
||||||
|
#
|
||||||
|
# Per RFC 2045, the returned string may contain the URL-unsafe characters
|
||||||
|
# <tt>+</tt> or <tt>/</tt>;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
#
|
||||||
|
# Base64.encode64("\xFB\xEF\xBE") # => "++++\n"
|
||||||
|
# Base64.encode64("\xFF\xFF\xFF") # => "////\n"
|
||||||
|
#
|
||||||
|
# The returned string may include padding;
|
||||||
|
# see {Padding}[Base64.html#module-Base64-label-Padding] above.
|
||||||
|
#
|
||||||
|
# Base64.encode64('*') # => "Kg==\n"
|
||||||
|
#
|
||||||
|
# The returned string ends with a newline character, and if sufficiently long
|
||||||
|
# will have one or more embedded newline characters;
|
||||||
|
# see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
|
||||||
|
#
|
||||||
|
# Base64.encode64('*') # => "Kg==\n"
|
||||||
|
# Base64.encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKg==\n"
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines,
|
||||||
|
# which will be encoded as ordinary \Base64:
|
||||||
|
#
|
||||||
|
# Base64.encode64("\n\n\n") # => "CgoK\n"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
#
|
||||||
|
def encode64(bin)
|
||||||
|
[bin].pack("m")
|
||||||
|
end
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.decode(encoded_string) -> decoded_string
|
||||||
|
#
|
||||||
|
# Returns a string containing the decoding of an RFC-2045-compliant
|
||||||
|
# \Base64-encoded string +encoded_string+:
|
||||||
|
#
|
||||||
|
# s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
# Base64.decode64(s) # => "This is line 1\nThis is line 2\n"
|
||||||
|
#
|
||||||
|
# Non-\Base64 characters in +encoded_string+ are ignored;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
# these include newline characters and characters <tt>-</tt> and <tt>/</tt>:
|
||||||
|
#
|
||||||
|
# Base64.decode64("\x00\n-_") # => ""
|
||||||
|
#
|
||||||
|
# Padding in +encoded_string+ (even if incorrect) is ignored:
|
||||||
|
#
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
|
||||||
|
#
|
||||||
|
def decode64(str)
|
||||||
|
str.unpack1("m")
|
||||||
|
end
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.strict_encode64(string) -> encoded_string
|
||||||
|
#
|
||||||
|
# Returns a string containing the RFC-2045-compliant \Base64-encoding of +string+.
|
||||||
|
#
|
||||||
|
# Per RFC 2045, the returned string may contain the URL-unsafe characters
|
||||||
|
# <tt>+</tt> or <tt>/</tt>;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64("\xFB\xEF\xBE") # => "++++\n"
|
||||||
|
# Base64.strict_encode64("\xFF\xFF\xFF") # => "////\n"
|
||||||
|
#
|
||||||
|
# The returned string may include padding;
|
||||||
|
# see {Padding}[Base64.html#module-Base64-label-Padding] above.
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64('*') # => "Kg==\n"
|
||||||
|
#
|
||||||
|
# The returned string will have no newline characters, regardless of its length;
|
||||||
|
# see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64('*') # => "Kg=="
|
||||||
|
# Base64.strict_encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines,
|
||||||
|
# which will be encoded as ordinary \Base64:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64("\n\n\n") # => "CgoK"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.strict_encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
|
||||||
|
#
|
||||||
|
def strict_encode64(bin)
|
||||||
|
[bin].pack("m0")
|
||||||
|
end
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.strict_decode64(encoded_string) -> decoded_string
|
||||||
|
#
|
||||||
|
# Returns a string containing the decoding of an RFC-2045-compliant
|
||||||
|
# \Base64-encoded string +encoded_string+:
|
||||||
|
#
|
||||||
|
# s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
|
||||||
|
# Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"
|
||||||
|
#
|
||||||
|
# Non-\Base64 characters in +encoded_string+ are not allowed;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
# these include newline characters and characters <tt>-</tt> and <tt>/</tt>:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("\n") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64('-') # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64('_') # Raises ArgumentError
|
||||||
|
#
|
||||||
|
# Padding in +encoded_string+, if present, must be correct:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
|
||||||
|
#
|
||||||
|
def strict_decode64(str)
|
||||||
|
str.unpack1("m0")
|
||||||
|
end
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.urlsafe_encode64(string) -> encoded_string
|
||||||
|
#
|
||||||
|
# Returns the RFC-4648-compliant \Base64-encoding of +string+.
|
||||||
|
#
|
||||||
|
# Per RFC 4648, the returned string will not contain the URL-unsafe characters
|
||||||
|
# <tt>+</tt> or <tt>/</tt>,
|
||||||
|
# but instead may contain the URL-safe characters
|
||||||
|
# <tt>-</tt> and <tt>_</tt>;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64("\xFB\xEF\xBE") # => "----"
|
||||||
|
# Base64.urlsafe_encode64("\xFF\xFF\xFF") # => "____"
|
||||||
|
#
|
||||||
|
# By default, the returned string may have padding;
|
||||||
|
# see {Padding}[Base64.html#module-Base64-label-Padding], above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*') # => "Kg=="
|
||||||
|
#
|
||||||
|
# Optionally, you can suppress padding:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*', padding: false) # => "Kg"
|
||||||
|
#
|
||||||
|
# The returned string will have no newline characters, regardless of its length;
|
||||||
|
# see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*') # => "Kg=="
|
||||||
|
# Base64.urlsafe_encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
|
||||||
|
#
|
||||||
|
def urlsafe_encode64(bin, padding: true)
|
||||||
|
str = strict_encode64(bin)
|
||||||
|
str.chomp!("==") or str.chomp!("=") unless padding
|
||||||
|
str.tr!("+/", "-_")
|
||||||
|
str
|
||||||
|
end
|
||||||
|
|
||||||
|
# :call-seq:
|
||||||
|
# Base64.urlsafe_decode64(encoded_string) -> decoded_string
|
||||||
|
#
|
||||||
|
# Returns the decoding of an RFC-4648-compliant \Base64-encoded string +encoded_string+:
|
||||||
|
#
|
||||||
|
# +encoded_string+ may not contain non-Base64 characters;
|
||||||
|
# see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64('+') # Raises ArgumentError.
|
||||||
|
# Base64.urlsafe_decode64('/') # Raises ArgumentError.
|
||||||
|
# Base64.urlsafe_decode64("\n") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
# Padding in +encoded_string+, if present, must be correct:
|
||||||
|
# see {Padding}[Base64.html#module-Base64-label-Padding], above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
def urlsafe_decode64(str)
|
||||||
|
# NOTE: RFC 4648 does say nothing about unpadded input, but says that
|
||||||
|
# "the excess pad characters MAY also be ignored", so it is inferred that
|
||||||
|
# unpadded input is also acceptable.
|
||||||
|
if !str.end_with?("=") && str.length % 4 != 0
|
||||||
|
str = str.ljust((str.length + 3) & ~3, "=")
|
||||||
|
str.tr!("-_", "+/")
|
||||||
|
else
|
||||||
|
str = str.tr("-_", "+/")
|
||||||
|
end
|
||||||
|
strict_decode64(str)
|
||||||
|
end
|
||||||
|
end
|
||||||
355
ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/sig/base64.rbs
vendored
Normal file
|
|
@ -0,0 +1,355 @@
|
||||||
|
# <!-- rdoc-file=lib/base64.rb -->
|
||||||
|
# Module Base64 provides methods for:
|
||||||
|
#
|
||||||
|
# * Encoding a binary string (containing non-ASCII characters) as a string of
|
||||||
|
# printable ASCII characters.
|
||||||
|
# * Decoding such an encoded string.
|
||||||
|
#
|
||||||
|
# Base64 is commonly used in contexts where binary data is not allowed or
|
||||||
|
# supported:
|
||||||
|
#
|
||||||
|
# * Images in HTML or CSS files, or in URLs.
|
||||||
|
# * Email attachments.
|
||||||
|
#
|
||||||
|
# A Base64-encoded string is about one-third larger that its source. See the
|
||||||
|
# [Wikipedia article](https://en.wikipedia.org/wiki/Base64) for more
|
||||||
|
# information.
|
||||||
|
#
|
||||||
|
# This module provides three pairs of encode/decode methods. Your choices among
|
||||||
|
# these methods should depend on:
|
||||||
|
#
|
||||||
|
# * Which character set is to be used for encoding and decoding.
|
||||||
|
# * Whether "padding" is to be used.
|
||||||
|
# * Whether encoded strings are to contain newlines.
|
||||||
|
#
|
||||||
|
# Note: Examples on this page assume that the including program has executed:
|
||||||
|
#
|
||||||
|
# require 'base64'
|
||||||
|
#
|
||||||
|
# ## Encoding Character Sets
|
||||||
|
#
|
||||||
|
# A Base64-encoded string consists only of characters from a 64-character set:
|
||||||
|
#
|
||||||
|
# * `('A'..'Z')`.
|
||||||
|
# * `('a'..'z')`.
|
||||||
|
# * `('0'..'9')`.
|
||||||
|
# * `=`, the 'padding' character.
|
||||||
|
# * Either:
|
||||||
|
# * `%w[+ /]`:
|
||||||
|
# [RFC-2045-compliant](https://datatracker.ietf.org/doc/html/rfc2045);
|
||||||
|
# *not* safe for URLs.
|
||||||
|
# * `%w[- _]`:
|
||||||
|
# [RFC-4648-compliant](https://datatracker.ietf.org/doc/html/rfc4648);
|
||||||
|
# safe for URLs.
|
||||||
|
#
|
||||||
|
# If you are working with Base64-encoded strings that will come from or be put
|
||||||
|
# into URLs, you should choose this encoder-decoder pair of RFC-4648-compliant
|
||||||
|
# methods:
|
||||||
|
#
|
||||||
|
# * Base64.urlsafe_encode64 and Base64.urlsafe_decode64.
|
||||||
|
#
|
||||||
|
# Otherwise, you may choose any of the pairs in this module, including the pair
|
||||||
|
# above, or the RFC-2045-compliant pairs:
|
||||||
|
#
|
||||||
|
# * Base64.encode64 and Base64.decode64.
|
||||||
|
# * Base64.strict_encode64 and Base64.strict_decode64.
|
||||||
|
#
|
||||||
|
# ## Padding
|
||||||
|
#
|
||||||
|
# Base64-encoding changes a triplet of input bytes into a quartet of output
|
||||||
|
# characters.
|
||||||
|
#
|
||||||
|
# **Padding in Encode Methods**
|
||||||
|
#
|
||||||
|
# Padding -- extending an encoded string with zero, one, or two trailing `=`
|
||||||
|
# characters -- is performed by methods Base64.encode64, Base64.strict_encode64,
|
||||||
|
# and, by default, Base64.urlsafe_encode64:
|
||||||
|
#
|
||||||
|
# Base64.encode64('s') # => "cw==\n"
|
||||||
|
# Base64.strict_encode64('s') # => "cw=="
|
||||||
|
# Base64.urlsafe_encode64('s') # => "cw=="
|
||||||
|
# Base64.urlsafe_encode64('s', padding: false) # => "cw"
|
||||||
|
#
|
||||||
|
# When padding is performed, the encoded string is always of length *4n*, where
|
||||||
|
# `n` is a non-negative integer:
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n* generate unpadded output characters of length
|
||||||
|
# *4n*:
|
||||||
|
#
|
||||||
|
# # n = 1: 3 bytes => 4 characters.
|
||||||
|
# Base64.strict_encode64('123') # => "MDEy"
|
||||||
|
# # n = 2: 6 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('123456') # => "MDEyMzQ1"
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n+1* generate padded output characters of length
|
||||||
|
# *4(n+1)*, with two padding characters at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 4 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('1234') # => "MDEyMw=="
|
||||||
|
# # n = 2: 7 bytes => 12 characters.
|
||||||
|
# Base64.strict_encode64('1234567') # => "MDEyMzQ1Ng=="
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n+2* generate padded output characters of length
|
||||||
|
# *4(n+1)*, with one padding character at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 5 bytes => 8 characters.
|
||||||
|
# Base64.strict_encode64('12345') # => "MDEyMzQ="
|
||||||
|
# # n = 2: 8 bytes => 12 characters.
|
||||||
|
# Base64.strict_encode64('12345678') # => "MDEyMzQ1Njc="
|
||||||
|
#
|
||||||
|
# When padding is suppressed, for a positive integer *n*:
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n* generate unpadded output characters of length
|
||||||
|
# *4n*:
|
||||||
|
#
|
||||||
|
# # n = 1: 3 bytes => 4 characters.
|
||||||
|
# Base64.urlsafe_encode64('123', padding: false) # => "MDEy"
|
||||||
|
# # n = 2: 6 bytes => 8 characters.
|
||||||
|
# Base64.urlsafe_encode64('123456', padding: false) # => "MDEyMzQ1"
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n+1* generate unpadded output characters of length
|
||||||
|
# *4n+2*, with two padding characters at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 4 bytes => 6 characters.
|
||||||
|
# Base64.urlsafe_encode64('1234', padding: false) # => "MDEyMw"
|
||||||
|
# # n = 2: 7 bytes => 10 characters.
|
||||||
|
# Base64.urlsafe_encode64('1234567', padding: false) # => "MDEyMzQ1Ng"
|
||||||
|
#
|
||||||
|
# * Input bytes of length *3n+2* generate unpadded output characters of length
|
||||||
|
# *4n+3*, with one padding character at the end:
|
||||||
|
#
|
||||||
|
# # n = 1: 5 bytes => 7 characters.
|
||||||
|
# Base64.urlsafe_encode64('12345', padding: false) # => "MDEyMzQ"
|
||||||
|
# # m = 2: 8 bytes => 11 characters.
|
||||||
|
# Base64.urlsafe_encode64('12345678', padding: false) # => "MDEyMzQ1Njc"
|
||||||
|
#
|
||||||
|
# **Padding in Decode Methods**
|
||||||
|
#
|
||||||
|
# All of the Base64 decode methods support (but do not require) padding.
|
||||||
|
#
|
||||||
|
# Method Base64.decode64 does not check the size of the padding:
|
||||||
|
#
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
|
||||||
|
#
|
||||||
|
# Method Base64.strict_decode64 strictly enforces padding size:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
|
||||||
|
#
|
||||||
|
# Method Base64.urlsafe_decode64 allows padding in `str`, which if present, must
|
||||||
|
# be correct: see [Padding](Base64.html#module-Base64-label-Padding), above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
# ## Newlines
|
||||||
|
#
|
||||||
|
# An encoded string returned by Base64.encode64 or Base64.urlsafe_encode64 has
|
||||||
|
# an embedded newline character after each 60-character sequence, and, if
|
||||||
|
# non-empty, at the end:
|
||||||
|
#
|
||||||
|
# # No newline if empty.
|
||||||
|
# encoded = Base64.encode64("\x00" * 0)
|
||||||
|
# encoded.index("\n") # => nil
|
||||||
|
#
|
||||||
|
# # Newline at end of short output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 1)
|
||||||
|
# encoded.size # => 4
|
||||||
|
# encoded.index("\n") # => 4
|
||||||
|
#
|
||||||
|
# # Newline at end of longer output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 45)
|
||||||
|
# encoded.size # => 60
|
||||||
|
# encoded.index("\n") # => 60
|
||||||
|
#
|
||||||
|
# # Newlines embedded and at end of still longer output.
|
||||||
|
# encoded = Base64.encode64("\x00" * 46)
|
||||||
|
# encoded.size # => 65
|
||||||
|
# encoded.rindex("\n") # => 65
|
||||||
|
# encoded.split("\n").map {|s| s.size } # => [60, 4]
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines, which are encoded as
|
||||||
|
# Base64:
|
||||||
|
#
|
||||||
|
# # Base64.encode64("\n\n\n") # => "CgoK\n"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
#
|
||||||
|
module Base64
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - decode64(str)
|
||||||
|
# -->
|
||||||
|
# Returns a string containing the decoding of an RFC-2045-compliant
|
||||||
|
# Base64-encoded string `str`:
|
||||||
|
#
|
||||||
|
# s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
# Base64.decode64(s) # => "This is line 1\nThis is line 2\n"
|
||||||
|
#
|
||||||
|
# Non-Base64 characters in `str` are ignored; see [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above: these
|
||||||
|
# include newline characters and characters `-` and `/`:
|
||||||
|
#
|
||||||
|
# Base64.decode64("\x00\n-_") # => ""
|
||||||
|
#
|
||||||
|
# Padding in `str` (even if incorrect) is ignored:
|
||||||
|
#
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
|
||||||
|
#
|
||||||
|
def self?.decode64: (String str) -> String
|
||||||
|
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - encode64(bin)
|
||||||
|
# -->
|
||||||
|
# Returns a string containing the RFC-2045-compliant Base64-encoding of `bin`.
|
||||||
|
#
|
||||||
|
# Per RFC 2045, the returned string may contain the URL-unsafe characters `+` or
|
||||||
|
# `/`; see [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
|
||||||
|
#
|
||||||
|
# Base64.encode64("\xFB\xEF\xBE") # => "++++\n"
|
||||||
|
# Base64.encode64("\xFF\xFF\xFF") # => "////\n"
|
||||||
|
#
|
||||||
|
# The returned string may include padding; see
|
||||||
|
# [Padding](Base64.html#module-Base64-label-Padding) above.
|
||||||
|
#
|
||||||
|
# Base64.encode64('*') # => "Kg==\n"
|
||||||
|
#
|
||||||
|
# The returned string ends with a newline character, and if sufficiently long
|
||||||
|
# will have one or more embedded newline characters; see
|
||||||
|
# [Newlines](Base64.html#module-Base64-label-Newlines) above:
|
||||||
|
#
|
||||||
|
# Base64.encode64('*') # => "Kg==\n"
|
||||||
|
# Base64.encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKg==\n"
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines, which will be encoded as
|
||||||
|
# ordinary Base64:
|
||||||
|
#
|
||||||
|
# Base64.encode64("\n\n\n") # => "CgoK\n"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
|
||||||
|
#
|
||||||
|
def self?.encode64: (String bin) -> String
|
||||||
|
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - strict_decode64(str)
|
||||||
|
# -->
|
||||||
|
# Returns a string containing the decoding of an RFC-2045-compliant
|
||||||
|
# Base64-encoded string `str`:
|
||||||
|
#
|
||||||
|
# s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
|
||||||
|
# Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"
|
||||||
|
#
|
||||||
|
# Non-Base64 characters in `str` not allowed; see [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above: these
|
||||||
|
# include newline characters and characters `-` and `/`:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("\n") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64('-') # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64('_') # Raises ArgumentError
|
||||||
|
#
|
||||||
|
# Padding in `str`, if present, must be correct:
|
||||||
|
#
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
|
||||||
|
#
|
||||||
|
def self?.strict_decode64: (String str) -> String
|
||||||
|
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - strict_encode64(bin)
|
||||||
|
# -->
|
||||||
|
# Returns a string containing the RFC-2045-compliant Base64-encoding of `bin`.
|
||||||
|
#
|
||||||
|
# Per RFC 2045, the returned string may contain the URL-unsafe characters `+` or
|
||||||
|
# `/`; see [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64("\xFB\xEF\xBE") # => "++++\n"
|
||||||
|
# Base64.strict_encode64("\xFF\xFF\xFF") # => "////\n"
|
||||||
|
#
|
||||||
|
# The returned string may include padding; see
|
||||||
|
# [Padding](Base64.html#module-Base64-label-Padding) above.
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64('*') # => "Kg==\n"
|
||||||
|
#
|
||||||
|
# The returned string will have no newline characters, regardless of its length;
|
||||||
|
# see [Newlines](Base64.html#module-Base64-label-Newlines) above:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64('*') # => "Kg=="
|
||||||
|
# Base64.strict_encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
|
||||||
|
#
|
||||||
|
# The string to be encoded may itself contain newlines, which will be encoded as
|
||||||
|
# ordinary Base64:
|
||||||
|
#
|
||||||
|
# Base64.strict_encode64("\n\n\n") # => "CgoK"
|
||||||
|
# s = "This is line 1\nThis is line 2\n"
|
||||||
|
# Base64.strict_encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
|
||||||
|
#
|
||||||
|
def self?.strict_encode64: (String bin) -> String
|
||||||
|
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - urlsafe_decode64(str)
|
||||||
|
# -->
|
||||||
|
# Returns the decoding of an RFC-4648-compliant Base64-encoded string `str`:
|
||||||
|
#
|
||||||
|
# `str` may not contain non-Base64 characters; see [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64('+') # Raises ArgumentError.
|
||||||
|
# Base64.urlsafe_decode64('/') # Raises ArgumentError.
|
||||||
|
# Base64.urlsafe_decode64("\n") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
# Padding in `str`, if present, must be correct: see
|
||||||
|
# [Padding](Base64.html#module-Base64-label-Padding), above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
|
||||||
|
# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
|
||||||
|
#
|
||||||
|
def self?.urlsafe_decode64: (String str) -> String
|
||||||
|
|
||||||
|
# <!--
|
||||||
|
# rdoc-file=lib/base64.rb
|
||||||
|
# - urlsafe_encode64(bin, padding: true)
|
||||||
|
# -->
|
||||||
|
# Returns the RFC-4648-compliant Base64-encoding of `bin`.
|
||||||
|
#
|
||||||
|
# Per RFC 4648, the returned string will not contain the URL-unsafe characters
|
||||||
|
# `+` or `/`, but instead may contain the URL-safe characters `-` and `_`; see
|
||||||
|
# [Encoding Character
|
||||||
|
# Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64("\xFB\xEF\xBE") # => "----"
|
||||||
|
# Base64.urlsafe_encode64("\xFF\xFF\xFF") # => "____"
|
||||||
|
#
|
||||||
|
# By default, the returned string may have padding; see
|
||||||
|
# [Padding](Base64.html#module-Base64-label-Padding), above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*') # => "Kg=="
|
||||||
|
#
|
||||||
|
# Optionally, you can suppress padding:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*', padding: false) # => "Kg"
|
||||||
|
#
|
||||||
|
# The returned string will have no newline characters, regardless of its length;
|
||||||
|
# see [Newlines](Base64.html#module-Base64-label-Newlines) above:
|
||||||
|
#
|
||||||
|
# Base64.urlsafe_encode64('*') # => "Kg=="
|
||||||
|
# Base64.urlsafe_encode64('*' * 46)
|
||||||
|
# # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
|
||||||
|
#
|
||||||
|
def self?.urlsafe_encode64: (String bin, ?padding: boolish) -> String
|
||||||
|
end
|
||||||
45
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- '*-stable'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ci:
|
||||||
|
name: Ruby ${{ matrix.ruby.name }}
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
ruby:
|
||||||
|
- { name: "2.3", value: 2.3.8 }
|
||||||
|
- { name: "2.4", value: 2.4.10 }
|
||||||
|
- { name: "2.5", value: 2.5.9 }
|
||||||
|
- { name: "2.6", value: 2.6.9 }
|
||||||
|
- { name: "2.7", value: 2.7.5 }
|
||||||
|
- { name: "3.0", value: 3.0.3 }
|
||||||
|
- { name: "3.1", value: 3.1.0 }
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby.value }}
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Run Test
|
||||||
|
run: bundle exec rake spec
|
||||||
|
|
||||||
|
- name: Test & publish code coverage
|
||||||
|
uses: paambaati/codeclimate-action@v3.0.0
|
||||||
|
env:
|
||||||
|
CC_TEST_REPORTER_ID: 46c8b29dd6711f35704e7c5a541486cbbf2cff8b2df8ce755bfc09917d3c1cbb
|
||||||
17
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
*.gem
|
||||||
|
*.rbc
|
||||||
|
.bundle
|
||||||
|
.config
|
||||||
|
.yardoc
|
||||||
|
InstalledFiles
|
||||||
|
_yardoc
|
||||||
|
coverage
|
||||||
|
doc/
|
||||||
|
lib/bundler/man
|
||||||
|
pkg
|
||||||
|
rdoc
|
||||||
|
spec/reports
|
||||||
|
test/tmp
|
||||||
|
test/version_tmp
|
||||||
|
tmp
|
||||||
|
.idea
|
||||||
30
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.kick
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
recipe :ruby
|
||||||
|
|
||||||
|
Kicker::Recipes::Ruby.runner_bin = 'bundle exec bacon --quiet'
|
||||||
|
|
||||||
|
process do |files|
|
||||||
|
specs = files.take_and_map do |file|
|
||||||
|
if file =~ %r{lib/[^/]*/(.+?)\.rb$}
|
||||||
|
s = Dir.glob("spec/**/#{File.basename(file, '.rb')}_spec.rb")
|
||||||
|
s.uniq unless s.empty?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Kicker::Recipes::Ruby.run_tests(specs)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Have written this so many times, probably should make a recipe out of it.
|
||||||
|
process do |files|
|
||||||
|
files.each do |file|
|
||||||
|
case file
|
||||||
|
when 'Gemfile'
|
||||||
|
files.delete(file)
|
||||||
|
execute 'bundle install'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
recipe :ignore
|
||||||
|
ignore(/.*\/?tags/)
|
||||||
|
ignore(/.*\/?\.git/)
|
||||||
|
ignore(/^tmp/)
|
||||||
|
|
||||||
6
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop.yml
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
require:
|
||||||
|
- rubocop-performance
|
||||||
|
|
||||||
|
inherit_from:
|
||||||
|
- .rubocop_todo.yml
|
||||||
|
- .rubocop_cocoapods.yml
|
||||||
151
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_cocoapods.yml
vendored
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
AllCops:
|
||||||
|
Include:
|
||||||
|
- ./Rakefile
|
||||||
|
- ./Gemfile
|
||||||
|
- ./*.gemspec
|
||||||
|
Exclude:
|
||||||
|
- ./spec/fixtures/**/*
|
||||||
|
- ./vendor/bundle/**/*
|
||||||
|
|
||||||
|
# At the moment not ready to be used
|
||||||
|
# https://github.com/bbatsov/rubocop/issues/947
|
||||||
|
Style/Documentation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
#- CocoaPods -----------------------------------------------------------------#
|
||||||
|
|
||||||
|
# We adopted raise instead of fail.
|
||||||
|
Style/SignalException:
|
||||||
|
EnforcedStyle: only_raise
|
||||||
|
|
||||||
|
# They are idiomatic
|
||||||
|
Lint/AssignmentInCondition:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Allow backticks
|
||||||
|
Style/AsciiComments:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Indentation clarifies logic branches in implementations
|
||||||
|
Style/IfUnlessModifier:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# No enforced convention here.
|
||||||
|
Style/SingleLineBlockParams:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# We only add the comment when needed.
|
||||||
|
Style/Encoding:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Having these make it easier to *not* forget to add one when adding a new
|
||||||
|
# value and you can simply copy the previous line.
|
||||||
|
Style/TrailingCommaInArguments:
|
||||||
|
EnforcedStyleForMultiline: comma
|
||||||
|
|
||||||
|
Style/TrailingCommaInArrayLiteral:
|
||||||
|
EnforcedStyleForMultiline: comma
|
||||||
|
|
||||||
|
Style/TrailingCommaInHashLiteral:
|
||||||
|
EnforcedStyleForMultiline: comma
|
||||||
|
|
||||||
|
Layout/MultilineOperationIndentation:
|
||||||
|
EnforcedStyle: indented
|
||||||
|
|
||||||
|
# Clashes with CLAide Command#validate!
|
||||||
|
Style/GuardClause:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Not always desirable: lib/claide/command/plugins_helper.rb:12:15
|
||||||
|
Style/Next:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Arbitrary max lengths for classes simply do not work and enabling this will
|
||||||
|
# lead to a never ending stream of annoyance and changes.
|
||||||
|
Metrics/ClassLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Arbitrary max lengths for modules simply do not work and enabling this will
|
||||||
|
# lead to a never ending stream of annoyance and changes.
|
||||||
|
Metrics/ModuleLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Arbitrary max lengths for methods simply do not work and enabling this will
|
||||||
|
# lead to a never ending stream of annoyance and changes.
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# No enforced convention here.
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# It will be obvious which code is complex, Rubocop should only lint simple
|
||||||
|
# rules for us.
|
||||||
|
Metrics/AbcSize:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# It will be obvious which code is complex, Rubocop should only lint simple
|
||||||
|
# rules for us.
|
||||||
|
Metrics/CyclomaticComplexity:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# It will be obvious which code is complex, Rubocop should only lint simple
|
||||||
|
# rules for us.
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
#- CocoaPods support for Ruby 1.8.7 ------------------------------------------#
|
||||||
|
|
||||||
|
Style/HashSyntax:
|
||||||
|
EnforcedStyle: hash_rockets
|
||||||
|
|
||||||
|
Style/Lambda:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/DotPosition:
|
||||||
|
EnforcedStyle: trailing
|
||||||
|
|
||||||
|
Style/EachWithObject:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/SpecialGlobalVars:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
#- CocoaPods specs -----------------------------------------------------------#
|
||||||
|
|
||||||
|
# Allow for `should.match /regexp/`.
|
||||||
|
Lint/AmbiguousRegexpLiteral:
|
||||||
|
Exclude:
|
||||||
|
- spec/**/*
|
||||||
|
|
||||||
|
Performance/RedundantMatch:
|
||||||
|
Exclude:
|
||||||
|
- spec/**/*
|
||||||
|
|
||||||
|
# Allow `object.should == object` syntax.
|
||||||
|
Lint/Void:
|
||||||
|
Exclude:
|
||||||
|
- spec/**/*
|
||||||
|
|
||||||
|
Style/ClassAndModuleChildren:
|
||||||
|
Exclude:
|
||||||
|
- spec/**/*
|
||||||
|
|
||||||
|
Lint/UselessComparison:
|
||||||
|
Exclude:
|
||||||
|
- spec/**/*
|
||||||
|
|
||||||
|
Lint/RaiseException:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Lint/StructNewOverride:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/HashEachMethods:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/HashTransformKeys:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Style/HashTransformValues:
|
||||||
|
Enabled: false
|
||||||
70
ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_todo.yml
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
# This configuration was generated by
|
||||||
|
# `rubocop --auto-gen-config`
|
||||||
|
# on 2016-03-09 18:40:14 -0600 using RuboCop version 0.38.0.
|
||||||
|
# The point is for the user to remove these configuration records
|
||||||
|
# one by one as the offenses are removed from the code base.
|
||||||
|
# Note that changes in the inspected code, or installation of new
|
||||||
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
|
# Offense count: 3
|
||||||
|
Lint/IneffectiveAccessModifier:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Lint/RedundantCopDisableDirective:
|
||||||
|
Exclude:
|
||||||
|
- 'spec/command/banner_spec.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Performance/FixedSize:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command/banner.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Performance/StringReplacement:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command/banner.rb'
|
||||||
|
|
||||||
|
# Offense count: 8
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||||
|
# SupportedStyles: prefer_alias, prefer_alias_method
|
||||||
|
Style/Alias:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/argument.rb'
|
||||||
|
- 'lib/claide/command.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
# Configuration parameters: SingleLineConditionsOnly.
|
||||||
|
Style/ConditionalAssignment:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command/banner.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
Style/IfInsideElse:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command.rb'
|
||||||
|
|
||||||
|
# Offense count: 9
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Style/MutableConstant:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/ansi.rb'
|
||||||
|
- 'lib/claide/argument.rb'
|
||||||
|
- 'lib/claide/command.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Style/ParallelAssignment:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command/argument_suggester.rb'
|
||||||
|
|
||||||
|
# Offense count: 1
|
||||||
|
# Cop supports --auto-correct.
|
||||||
|
Style/RedundantInterpolation:
|
||||||
|
Exclude:
|
||||||
|
- 'lib/claide/command/argument_suggester.rb'
|
||||||