Repository: owensd/apous
Branch: master
Commit: 56ac30c37f54
Files: 29
Total size: 43.0 KB
Directory structure:
gitextract_ssdk6qb7/
├── .gitignore
├── Features.md
├── LICENSE
├── Makefile
├── README.md
├── apous.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── apous.xcscheme
├── misc/
│ ├── Components.plist
│ └── scripts/
│ └── bootstrap.sh
├── samples/
│ ├── basic/
│ │ └── basic.swift
│ ├── carthage/
│ │ ├── Cartfile
│ │ └── main.swift
│ ├── cocoapods/
│ │ ├── Podfile
│ │ └── main.swift
│ ├── multi/
│ │ ├── bar.swift
│ │ ├── foo.swift
│ │ └── main.swift
│ ├── nested/
│ │ ├── main.swift
│ │ └── os/
│ │ └── path/
│ │ ├── abspath.swift
│ │ └── basename.swift
│ └── shebang/
│ └── main.swift
├── src/
│ ├── ErrorCodes.swift
│ ├── Tools.swift
│ ├── Utils.swift
│ ├── main.swift
│ └── version.sh
└── test/
├── Info.plist
└── Samples.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# OS X
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
Pods/
Rome/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
Carthage/
# Apous
bin/
.apousscript
VersionInfo.swift
releases/
================================================
FILE: Features.md
================================================
Features Planned for v0.2.0:
1. Refactoring project to support unit tests
2. Support nested directories for the script
Possible for v0.2.0:
1. Creation of implicit Xcode file for Xcode authoring support
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015 Kiad Software, LLC.
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.
================================================
FILE: Makefile
================================================
TEMPORARY_FOLDER=/tmp/Apous.dst
PREFIX=/usr/local
BUILD_TOOL=xcodebuild
XCODEFLAGS=-project 'apous.xcodeproj' -scheme 'apous' DSTROOT=$(TEMPORARY_FOLDER)
APOUS_EXECUTABLE=$(TEMPORARY_FOLDER)/apous
FRAMEWORKS_FOLDER=/Library/Frameworks
BINARIES_FOLDER=/usr/local/bin
VERSION_STRING=v0.2.2
COMPONENTS_PLIST=misc/Components.plist
OUTPUT_PACKAGE=Apous.pkg
.PHONY: all bootstrap clean install package test uninstall
all: bootstrap
$(BUILD_TOOL) $(XCODEFLAGS) build
bootstrap:
misc/scripts/bootstrap.sh
test: clean bootstrap
$(BUILD_TOOL) $(XCODEFLAGS) test
clean:
rm -f "$(OUTPUT_PACKAGE)"
rm -rf "$(TEMPORARY_FOLDER)"
$(BUILD_TOOL) $(XCODEFLAGS) clean
install: package
sudo installer -pkg "$(TEMPORARY_FOLDER)/$(OUTPUT_PACKAGE)" -target /
uninstall:
rm -f "$(BINARIES_FOLDER)/apous"
installables: clean bootstrap
$(BUILD_TOOL) $(XCODEFLAGS) install
mkdir -p "$(TEMPORARY_FOLDER)$(BINARIES_FOLDER)"
prefix_install: installables
mkdir -p "$(PREFIX)/Frameworks" "$(PREFIX)/bin"
cp -f "$(TEMPORARY_FOLDER)$(BINARIES_FOLDER)/apous" "$(PREFIX)/bin/"
package: installables
pkgbuild \
--component-plist "$(COMPONENTS_PLIST)" \
--identifier "io.owensd.apous" \
--install-location "/" \
--root "$(TEMPORARY_FOLDER)" \
--version "$(VERSION_STRING)" \
"$(TEMPORARY_FOLDER)/$(OUTPUT_PACKAGE)"
================================================
FILE: README.md
================================================
_______
| _ .-----.-----.--.--.-----.
|. 1 | _ | _ | | |__ --|
|. _ | __|_____|_____|_____|
|: | |__|
|::.|:. |
`--- ---'
# Apous [](https://raw.githubusercontent.com/owensd/apous/master/LICENSE) [](https://github.com/owensd/Apous/releases)
Apous is a simple tool that allows for easier authoring of Swift scripts.
Primary features:
1. Allow the breaking up of scripts into multiple files.
2. Dependency management through [Carthage](https://github.com/Carthage/Carthage) or [CocoaPods](https://github.com/CocoaPods/CocoaPods/).
## How it Works
Apous works by first checking for a `Cartfile` or `Podfile` in your script's directory. If one is
present, then `carthage update` or `pod install --no-integrate` will be run.
Next, all of your Swift files are compiled into a single `.apousscript` binary that will then be
run automatically for you.
It's really that simple.
## Getting Started
First, you need to install the latest build of Apous.
1. Download the latest version of `apous` from "Releases".
2. Copy it to a location in your path, such as `/usr/local/bin/`.
Homebrew support is pending: https://github.com/Homebrew/homebrew/pull/41473
## Creating Your First Script
1. Create a new directory for your scripts, say `mkdir demo`
2. Change to that directory: `cd demo`
3. Create a new script file: `touch demo.swift`
4. Change the contents of the file to:
```swift
import Foundation
print("Welcome to Apous!")
```
5. Run the script: `apous .`
This will output:
Welcome to Apous!
You can see some other samples here: [Samples](https://github.com/owensd/apous/tree/master/samples).
### Alternatively
Apous also supports running scripts with `#!`. Note that your entry point script **must** be named `main.swift`.
```swift
#!/usr/local/bin/apous
import Foundation
print("Welcome to Apous!")
```
Then run:
> chmod +x main.swift
> ./main.swift
Welcome to Apous!
## FAQ
**Q: What is Apous mean?**
A: It's from the ancient Greek απους, meaning "without feet".
================================================
FILE: apous.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
7D0373391B49021700E2711D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D0373381B49021700E2711D /* main.swift */; };
7D0F00941B4AF32F003B6EF0 /* Samples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D0F00931B4AF32F003B6EF0 /* Samples.swift */; };
7D3AC3461B49F99B0068CC83 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3451B49F99B0068CC83 /* Utils.swift */; };
7D3AC3481B49FE170068CC83 /* ErrorCodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3471B49FE170068CC83 /* ErrorCodes.swift */; };
7D3AC34A1B4A37BC0068CC83 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3491B4A37BC0068CC83 /* Tools.swift */; };
7DF997441B4B33A200E90F56 /* VersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF997431B4B33A200E90F56 /* VersionInfo.swift */; };
7DF997511B4B4A6900E90F56 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3491B4A37BC0068CC83 /* Tools.swift */; };
7DF9988C1B4B72FD00E90F56 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3451B49F99B0068CC83 /* Utils.swift */; };
7DF9988D1B4B730500E90F56 /* ErrorCodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D3AC3471B49FE170068CC83 /* ErrorCodes.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
7DF9974B1B4B354000E90F56 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 7D03732D1B49021700E2711D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 7DF997471B4B353600E90F56;
remoteInfo = GenerateVersionInfo;
};
7DF9974D1B4B354800E90F56 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 7D03732D1B49021700E2711D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 7DF997471B4B353600E90F56;
remoteInfo = GenerateVersionInfo;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
7D0373331B49021700E2711D /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
7D0373351B49021700E2711D /* apous */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = apous; sourceTree = BUILT_PRODUCTS_DIR; };
7D0373381B49021700E2711D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
7D0F00911B4AF32F003B6EF0 /* apoustest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = apoustest.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
7D0F00931B4AF32F003B6EF0 /* Samples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Samples.swift; sourceTree = "<group>"; };
7D0F00951B4AF32F003B6EF0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
7D0F009A1B4AF3F1003B6EF0 /* Features.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Features.md; sourceTree = "<group>"; };
7D3AC3421B49F1FC0068CC83 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
7D3AC3441B49F62F0068CC83 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
7D3AC3451B49F99B0068CC83 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = "<group>"; };
7D3AC3471B49FE170068CC83 /* ErrorCodes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorCodes.swift; sourceTree = "<group>"; };
7D3AC3491B4A37BC0068CC83 /* Tools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tools.swift; sourceTree = "<group>"; };
7DC546B91B4C55640070A858 /* samples */ = {isa = PBXFileReference; lastKnownFileType = folder; path = samples; sourceTree = SOURCE_ROOT; };
7DF997431B4B33A200E90F56 /* VersionInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionInfo.swift; sourceTree = "<group>"; };
7DF9974F1B4B356700E90F56 /* version.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = version.sh; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
7D0373321B49021700E2711D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
7D0F008E1B4AF32F003B6EF0 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
7D03732C1B49021700E2711D = {
isa = PBXGroup;
children = (
7D0F00991B4AF3D9003B6EF0 /* docs */,
7D0373371B49021700E2711D /* src */,
7D0F00921B4AF32F003B6EF0 /* test */,
7D0373361B49021700E2711D /* Products */,
);
sourceTree = "<group>";
};
7D0373361B49021700E2711D /* Products */ = {
isa = PBXGroup;
children = (
7D0373351B49021700E2711D /* apous */,
7D0F00911B4AF32F003B6EF0 /* apoustest.xctest */,
);
name = Products;
sourceTree = "<group>";
};
7D0373371B49021700E2711D /* src */ = {
isa = PBXGroup;
children = (
7DF997501B4B37B100E90F56 /* Versioning */,
7D0373381B49021700E2711D /* main.swift */,
7D3AC3451B49F99B0068CC83 /* Utils.swift */,
7D3AC3471B49FE170068CC83 /* ErrorCodes.swift */,
7D3AC3491B4A37BC0068CC83 /* Tools.swift */,
);
path = src;
sourceTree = "<group>";
};
7D0F00921B4AF32F003B6EF0 /* test */ = {
isa = PBXGroup;
children = (
7DC546B91B4C55640070A858 /* samples */,
7D0F00931B4AF32F003B6EF0 /* Samples.swift */,
7D0F00951B4AF32F003B6EF0 /* Info.plist */,
);
path = test;
sourceTree = "<group>";
};
7D0F00991B4AF3D9003B6EF0 /* docs */ = {
isa = PBXGroup;
children = (
7D0F009A1B4AF3F1003B6EF0 /* Features.md */,
7D3AC3441B49F62F0068CC83 /* LICENSE */,
7D3AC3421B49F1FC0068CC83 /* README.md */,
);
name = docs;
sourceTree = "<group>";
};
7DF997501B4B37B100E90F56 /* Versioning */ = {
isa = PBXGroup;
children = (
7DF997431B4B33A200E90F56 /* VersionInfo.swift */,
7DF9974F1B4B356700E90F56 /* version.sh */,
);
name = Versioning;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXLegacyTarget section */
7DF997471B4B353600E90F56 /* GenerateVersionInfo */ = {
isa = PBXLegacyTarget;
buildArgumentsString = version.sh;
buildConfigurationList = 7DF997481B4B353600E90F56 /* Build configuration list for PBXLegacyTarget "GenerateVersionInfo" */;
buildPhases = (
);
buildToolPath = /bin/sh;
buildWorkingDirectory = "$(SRCROOT)/src";
dependencies = (
);
name = GenerateVersionInfo;
passBuildSettingsInEnvironment = 1;
productName = GenerateVersionInfo;
};
/* End PBXLegacyTarget section */
/* Begin PBXNativeTarget section */
7D0373341B49021700E2711D /* apous */ = {
isa = PBXNativeTarget;
buildConfigurationList = 7D03733C1B49021700E2711D /* Build configuration list for PBXNativeTarget "apous" */;
buildPhases = (
7D0373311B49021700E2711D /* Sources */,
7D0373321B49021700E2711D /* Frameworks */,
7D0373331B49021700E2711D /* CopyFiles */,
7DE115081B4C4A9100B198FB /* Package for GitHub Release */,
);
buildRules = (
);
dependencies = (
7DF9974C1B4B354000E90F56 /* PBXTargetDependency */,
);
name = apous;
productName = apous;
productReference = 7D0373351B49021700E2711D /* apous */;
productType = "com.apple.product-type.tool";
};
7D0F00901B4AF32F003B6EF0 /* apoustest */ = {
isa = PBXNativeTarget;
buildConfigurationList = 7D0F00981B4AF32F003B6EF0 /* Build configuration list for PBXNativeTarget "apoustest" */;
buildPhases = (
7D0F008D1B4AF32F003B6EF0 /* Sources */,
7D0F008E1B4AF32F003B6EF0 /* Frameworks */,
7D0F008F1B4AF32F003B6EF0 /* Resources */,
7DF9988B1B4B4C5600E90F56 /* Copy Samples */,
);
buildRules = (
);
dependencies = (
7DF9974E1B4B354800E90F56 /* PBXTargetDependency */,
);
name = apoustest;
productName = apoustest;
productReference = 7D0F00911B4AF32F003B6EF0 /* apoustest.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
7D03732D1B49021700E2711D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = owensd.io;
TargetAttributes = {
7D0373341B49021700E2711D = {
CreatedOnToolsVersion = 7.0;
};
7D0F00901B4AF32F003B6EF0 = {
CreatedOnToolsVersion = 7.0;
};
7DF997471B4B353600E90F56 = {
CreatedOnToolsVersion = 7.0;
};
};
};
buildConfigurationList = 7D0373301B49021700E2711D /* Build configuration list for PBXProject "apous" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 7D03732C1B49021700E2711D;
productRefGroup = 7D0373361B49021700E2711D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
7DF997471B4B353600E90F56 /* GenerateVersionInfo */,
7D0373341B49021700E2711D /* apous */,
7D0F00901B4AF32F003B6EF0 /* apoustest */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
7D0F008F1B4AF32F003B6EF0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
7DE115081B4C4A9100B198FB /* Package for GitHub Release */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Package for GitHub Release";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "#mkdir -p releases\n#rm -f $SRCROOT/releases/$TARGET_NAME.zip\n#zip -j $SRCROOT/releases/$TARGET_NAME.zip $SRCROOT/bin/$TARGET_NAME";
};
7DF9988B1B4B4C5600E90F56 /* Copy Samples */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"$(SRCROOT)/samples",
);
name = "Copy Samples";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "rm -rf \"$TARGET_BUILD_DIR/samples\"\ncp -R \"$SRCROOT/samples\" \"$TARGET_BUILD_DIR\"";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
7D0373311B49021700E2711D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7D3AC3461B49F99B0068CC83 /* Utils.swift in Sources */,
7D3AC3481B49FE170068CC83 /* ErrorCodes.swift in Sources */,
7D0373391B49021700E2711D /* main.swift in Sources */,
7DF997441B4B33A200E90F56 /* VersionInfo.swift in Sources */,
7D3AC34A1B4A37BC0068CC83 /* Tools.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
7D0F008D1B4AF32F003B6EF0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7D0F00941B4AF32F003B6EF0 /* Samples.swift in Sources */,
7DF997511B4B4A6900E90F56 /* Tools.swift in Sources */,
7DF9988C1B4B72FD00E90F56 /* Utils.swift in Sources */,
7DF9988D1B4B730500E90F56 /* ErrorCodes.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
7DF9974C1B4B354000E90F56 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 7DF997471B4B353600E90F56 /* GenerateVersionInfo */;
targetProxy = 7DF9974B1B4B354000E90F56 /* PBXContainerItemProxy */;
};
7DF9974E1B4B354800E90F56 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 7DF997471B4B353600E90F56 /* GenerateVersionInfo */;
targetProxy = 7DF9974D1B4B354800E90F56 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
7D03733A1B49021700E2711D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
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_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;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
7D03733B1B49021700E2711D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
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;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
name = Release;
};
7D03733D1B49021700E2711D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
7D03733E1B49021700E2711D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
7D0F00961B4AF32F003B6EF0 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = test/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.owensd.apoustest;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
7D0F00971B4AF32F003B6EF0 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = test/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = io.owensd.apoustest;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
7DF997491B4B353600E90F56 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEBUGGING_SYMBOLS = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
7DF9974A1B4B353600E90F56 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
7D0373301B49021700E2711D /* Build configuration list for PBXProject "apous" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7D03733A1B49021700E2711D /* Debug */,
7D03733B1B49021700E2711D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
7D03733C1B49021700E2711D /* Build configuration list for PBXNativeTarget "apous" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7D03733D1B49021700E2711D /* Debug */,
7D03733E1B49021700E2711D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
7D0F00981B4AF32F003B6EF0 /* Build configuration list for PBXNativeTarget "apoustest" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7D0F00961B4AF32F003B6EF0 /* Debug */,
7D0F00971B4AF32F003B6EF0 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
7DF997481B4B353600E90F56 /* Build configuration list for PBXLegacyTarget "GenerateVersionInfo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7DF997491B4B353600E90F56 /* Debug */,
7DF9974A1B4B353600E90F56 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 7D03732D1B49021700E2711D /* Project object */;
}
================================================
FILE: apous.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:apous.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: apous.xcodeproj/xcshareddata/xcschemes/apous.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D0373341B49021700E2711D"
BuildableName = "apous"
BlueprintName = "apous"
ReferencedContainer = "container:apous.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D0F00901B4AF32F003B6EF0"
BuildableName = "apoustest.xctest"
BlueprintName = "apoustest"
ReferencedContainer = "container:apous.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D0373341B49021700E2711D"
BuildableName = "apous"
BlueprintName = "apous"
ReferencedContainer = "container:apous.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
customWorkingDirectory = "/Users/owensd/Library/Developer/Xcode/DerivedData/apous-fvgxvrkkgylijchhwanxayhydwrh/Build/Products/Debug/samples/shebang"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D0373341B49021700E2711D"
BuildableName = "apous"
BlueprintName = "apous"
ReferencedContainer = "container:apous.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
<CommandLineArgument
argument = "~/Projects/owensd.io/apous/samples/carthage"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "/Users/owensd/Library/Developer/Xcode/DerivedData/apous-fvgxvrkkgylijchhwanxayhydwrh/Build/Products/Debug/samples/carthage"
isEnabled = "YES">
</CommandLineArgument>
<CommandLineArgument
argument = "~/Project/owensd.io/apous/samples/basic"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "./samples/nested"
isEnabled = "NO">
</CommandLineArgument>
</CommandLineArguments>
<EnvironmentVariables>
<EnvironmentVariable
key = "PATH"
value = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/scripts:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "7D0373341B49021700E2711D"
BuildableName = "apous"
BlueprintName = "apous"
ReferencedContainer = "container:apous.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: misc/Components.plist
================================================
<?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">
<array>
</array>
</plist>
================================================
FILE: misc/scripts/bootstrap.sh
================================================
#!/bin/bash
export SCRIPT_DIR=$(dirname "$0")
##
## Bootstrap Process
##
main ()
{
local submodules=$(git submodule status)
local result=$?
if [ "$result" -ne "0" ]
then
exit $result
fi
if [ -n "$submodules" ]
then
echo "*** Updating submodules..."
update_submodules
fi
}
bootstrap_submodule ()
{
local bootstrap="script/bootstrap"
if [ -e "$bootstrap" ]
then
echo "*** Bootstrapping $name..."
"$bootstrap" >/dev/null
else
update_submodules
fi
}
update_submodules ()
{
git submodule sync --quiet && git submodule update --init && git submodule foreach --quiet bootstrap_submodule
}
export -f bootstrap_submodule
export -f update_submodules
main
================================================
FILE: samples/basic/basic.swift
================================================
print("Hello! This is a simple sample that contains no dependencies.")
================================================
FILE: samples/carthage/Cartfile
================================================
github "thoughtbot/Argo" "td-swift-2"
================================================
FILE: samples/carthage/main.swift
================================================
import Argo
import Runes
print("dependencies imported properly")
================================================
FILE: samples/cocoapods/Podfile
================================================
platform :osx, '10.10'
use_frameworks!
plugin 'cocoapods-rome'
pod "Argo", :git => "https://github.com/thoughtbot/Argo", :branch => "td-swift-2"
================================================
FILE: samples/cocoapods/main.swift
================================================
import Argo
import Runes
print("dependencies imported properly")
================================================
FILE: samples/multi/bar.swift
================================================
func bar() -> Int {
return 1
}
================================================
FILE: samples/multi/foo.swift
================================================
func foo() -> Int {
return 2
}
================================================
FILE: samples/multi/main.swift
================================================
print("foo: \(foo())")
print("bar: \(bar())")
================================================
FILE: samples/nested/main.swift
================================================
print("Testing Nested Directories")
print("abspath: \(abspath())")
print("basename: \(basename())")
================================================
FILE: samples/nested/os/path/abspath.swift
================================================
func abspath() -> String {
return "abspath!"
}
================================================
FILE: samples/nested/os/path/basename.swift
================================================
func basename() -> String {
return "basename!"
}
================================================
FILE: samples/shebang/main.swift
================================================
#!/usr/local/bin/apous
print("Hello! This is a simple sample that contains no dependencies.")
================================================
FILE: src/ErrorCodes.swift
================================================
//
// ErrorCodes.swift
// apous
//
// Created by David Owens on 7/5/15.
// Copyright © 2015 owensd.io. All rights reserved.
//
enum ErrorCode: Int, ErrorType {
case InvalidUsage = 1
case PathNotFound
case CarthageNotInstalled
case CocoaPodsNotInstalled
case SwiftNotInstalled
case PTYCreationFailed
}
================================================
FILE: src/Tools.swift
================================================
//
// Tools.swift
// apous
//
// Created by David Owens on 7/5/15.
// Copyright © 2015 owensd.io. All rights reserved.
//
import Foundation
// I'm playing around with using functions as the types here because that's all
// that is really needed. The types with a protocol extension in the previous
// version just felt like way too much for what was really needed, which is
// essentially just a way to invoke the tool with some arguments.
/// The output type for a `Tool`.
typealias TaskResult = (out: String,code: Int32)
/// The function signature that all tools must conform to.
typealias Tool = (args: String...) throws -> TaskResult
/// Runs the given tool at `launchPath` passing in `args`. The output is then captured
/// by `output` and `error`.
func runTask(launchPath: String, args: [String] = [], outputToStandardOut: Bool = true) throws -> TaskResult
{
// This is the buffered output that will be returned.
var out = ""
// It turns out this code is not robust; it does not seem to always get all of the stream data.
// BUG #12 - https://github.com/owensd/apous/issues/12
//
// // Ok, so stdout sucks the big one. If your NSTask actually does any redirection to another
// // tool that then outputs to stdout, that is going to be buffered and will only come back in
// // chunks.
//
// var master: Int32 = 0
// var slave: Int32 = 0
// if openpty(&master, &slave, nil, nil, nil) == -1 {
// throw ErrorCode.PTYCreationFailed
// }
// defer {
// close(master)
// close(slave)
// }
//
// let output = NSFileHandle(fileDescriptor: master)
func stream(handle: NSFileHandle) -> String {
let data = handle.availableData
let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String ?? ""
// Sample string might look like this: ^[[34;1m***^[[0m Fetching ^[[1mArgo^[[0m
// However, we need the escape codes to look like this: \e[34;1m***\e[0m Fetching \e[1mArgo\e[0m
// Also, the normal output logged needs to have all of that stripped...
func process(input: String, fn: (inout string: String, range: Range<String.Index>) -> ()) -> String {
var str = input
var range: Range<String.Index>? = nil
var nextRange: Range<String.Index>? = nil
repeat {
range = str.rangeOfString(
"(\\^)\\[\\[(\\d+;\\d+m|\\d+m)",
options: NSStringCompareOptions.RegularExpressionSearch,
range: nextRange)
if let range = range {
nextRange?.startIndex = range.endIndex
fn(string: &str, range: range)
}
} while range != nil
return str
}
let replaced = process(str) { (inout string: String, range: Range<String.Index>) in
string.replaceRange(range.startIndex ..< range.startIndex.advancedBy(2), with: "\\e")
}
let stripped = process(str) { (inout string: String, range: Range<String.Index>) in
string.removeRange(range)
}
if outputToStandardOut {
// NOTE(owensd): Without the -n, additional newlines are getting in there...
NSTask.launchedTaskWithLaunchPath("/bin/bash", arguments: ["-c", "echo -en $'\(replaced)'"])
}
return stripped
}
let output = NSPipe()
output.fileHandleForReading.readabilityHandler = { out += stream($0) }
let task = NSTask()
task.launchPath = try canonicalPath(launchPath)
task.arguments = args
task.standardOutput = output
task.standardError = output
task.terminationHandler = {
($0.standardOutput as? NSFileHandle)?.readabilityHandler = nil
}
task.launch()
task.waitUntilExit()
return (
out: out.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()),
code: task.terminationStatus)
}
// Psuedo-namespace "tools" simulated with an enum with no cases.
enum tools {}
private func launchPathForTool(tool: String) throws -> String? {
let result = try tools.which(tool)
return result.out.characters.count == 0 ? nil : result.out
}
extension tools {
static func which(args: String...) throws -> TaskResult {
return try runTask("/usr/bin/which", args: args, outputToStandardOut: false)
}
static func pod(args: String...) throws -> TaskResult {
guard let path = try launchPathForTool("pod") else { throw ErrorCode.CocoaPodsNotInstalled }
let info = args.reduce("") { $0 + $1 + " " }
print("Running pod \(info)")
return try runTask(path, args: args)
}
static func carthage(args: String...) throws -> TaskResult {
guard let path = try launchPathForTool("carthage") else { throw ErrorCode.CarthageNotInstalled }
let info = args.reduce("") { $0 + $1 + " " }
print("Running carthage \(info)")
return try runTask(path, args: args)
}
static func swiftc(args: [String]) throws -> TaskResult {
guard let path = try launchPathForTool("swiftc") else { throw ErrorCode.SwiftNotInstalled }
return try runTask(path, args: args)
}
static func swiftc(args: String...) throws -> TaskResult {
return try tools.swiftc(args)
}
}
extension tools {
static let CartfileConfig = "Cartfile"
static let PodfileConfig = "Podfile"
static func apous(path: String) throws -> TaskResult {
let fileManager = NSFileManager.defaultManager()
// The tools need to be run under the context of the script directory.
fileManager.changeCurrentDirectoryPath(path)
var frameworkPaths: [String] = []
if fileManager.fileExistsAtPath(path.stringByAppendingPathComponent(CartfileConfig)) {
try tools.carthage("update")
frameworkPaths += ["-F", "Carthage/Build/Mac"]
}
if fileManager.fileExistsAtPath(path.stringByAppendingPathComponent(PodfileConfig)) {
try tools.pod("install", "--no-integrate")
frameworkPaths += ["-F", "Rome"]
}
let files = filesAtPath(path)
let args = frameworkPaths + ["-o", ".apousscript"] + files
try tools.swiftc(args)
return try runTask("./.apousscript")
}
}
================================================
FILE: src/Utils.swift
================================================
//
// Utils.swift
// apous
//
// Created by David Owens on 7/5/15.
// Copyright © 2015 owensd.io. All rights reserved.
//
import Foundation
public extension String {
public var pathExtension: String { return (self as NSString).pathExtension }
public var lastPathComponent: String { return (self as NSString).lastPathComponent }
public var stringByDeletingLastPathComponent: String { return (self as NSString).stringByDeletingLastPathComponent }
public var pathComponents: [String] { return (self as NSString).pathComponents }
public func stringByAppendingPathComponent(str: String) -> String {
return (self as NSString).stringByAppendingPathComponent(str)
}
}
/// Returns the root path that contains the script(s).
func canonicalPath(path: String) throws -> String {
guard let cpath = path.cStringUsingEncoding(NSUTF8StringEncoding) else { throw ErrorCode.PathNotFound }
let rpath = realpath(cpath, nil)
if rpath == nil { throw ErrorCode.PathNotFound }
guard let abspath = String(CString: rpath, encoding: NSUTF8StringEncoding) else { throw ErrorCode.PathNotFound }
return abspath
}
/// Exit the process error with the given `ErrorCode`.
@noreturn func exit(code: ErrorCode) {
exit(Int32(code.rawValue))
}
/// Returns the full path of the valid script files at the given `path`.
func filesAtPath(path: String) -> [String] {
let items: [String] = {
return NSFileManager.defaultManager().subpathsAtPath(path) ?? []
}()
return items
.filter() {
let root = $0.pathComponents[0]
return $0.pathExtension == "swift" && (root != "Carthage" && root != "Rome" && root != "Pods")
}
.map() { path.stringByAppendingPathComponent($0) }
}
================================================
FILE: src/main.swift
================================================
//
// main.swift
// apous
//
// Created by David Owens on 7/4/15.
// Copyright © 2015 owensd.io. All rights reserved.
//
import Foundation
func printUsage() {
print("OVERVIEW: Apous Swift Script Runner (build: \(VersionInfo.Version.rawValue)-\(VersionInfo.Branch.rawValue))")
print("")
print("USAGE: apous [<script_file>|<path/to/scripts>]")
}
//
// The body of the script.
//
let arguments = NSProcessInfo.processInfo().arguments
if arguments.contains("-help") {
printUsage()
exit(0)
}
// This is used to enable more verbose logging.
let DebugOutputEnabled = arguments.contains("-debug")
// NOTE(owensd): This method is a workaround because of Swift bugs and code in the top-level scope.
func run() throws {
let scriptItem = arguments[1..<arguments.count].filter() { $0 != "-debug" }
let path: String
switch scriptItem.count {
case 0:
path = NSFileManager.defaultManager().currentDirectoryPath
case 1:
let item = scriptItem[0]
if item.pathExtension == "swift" {
if item.lastPathComponent == "main.swift" {
path = item.stringByDeletingLastPathComponent
}
else {
print("Only a 'main.swift' file can be specified.")
exit(ErrorCode.InvalidUsage)
}
}
else {
path = try canonicalPath(item)
}
default:
print("Invalid usage.")
printUsage()
exit(ErrorCode.InvalidUsage)
}
try tools.apous(path)
}
do {
try run()
}
catch {
guard let error = error as? ErrorCode else { exit(1) }
exit(Int32(error.rawValue))
}
================================================
FILE: src/version.sh
================================================
VERSION=0.2.2
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
VERSION_FILE=VersionInfo.swift
echo "// THIS IS A GENERATED FILE\n" > $VERSION_FILE
echo "enum VersionInfo : String {" >> $VERSION_FILE
echo " case Version = \"$VERSION\"" >> $VERSION_FILE
echo " case Branch = \"$BRANCH_NAME\"" >> $VERSION_FILE
echo "}" >> $VERSION_FILE
================================================
FILE: test/Info.plist
================================================
<?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>CFBundleDevelopmentRegion</key>
<string>en</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>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: test/Samples.swift
================================================
//
// apoustest.swift
// apoustest
//
// Created by David Owens on 7/6/15.
// Copyright © 2015 owensd.io. All rights reserved.
//
import XCTest
class SamplesTest : XCTestCase {
lazy var samplesPath: String = {
let path = NSBundle(forClass: self.dynamicType)
.bundlePath
.stringByDeletingLastPathComponent
.stringByAppendingPathComponent("samples") ?? ""
return path
}()
func validateSampleToolOutput(sample: String, output: String) {
do {
let path: String = samplesPath.stringByAppendingPathComponent(sample)
if !NSFileManager.defaultManager().fileExistsAtPath(path) {
XCTFail("The given samples path does not exist: \(path)")
return
}
let result = try tools.apous(path)
XCTAssertEqual(
result.out.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()),
output.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()),
"The sample output does not match the expected.")
}
catch {
XCTFail("An error occurred during test execution.")
}
}
func testBasic() {
let output = "Hello! This is a simple sample that contains no dependencies."
validateSampleToolOutput("basic", output: output)
}
func testMulti() {
let output = "foo: 2\nbar: 1"
validateSampleToolOutput("multi", output: output)
}
func testNested() {
let output = "Testing Nested Directories\nabspath: abspath!\nbasename: basename!"
validateSampleToolOutput("nested", output: output)
}
}
gitextract_ssdk6qb7/
├── .gitignore
├── Features.md
├── LICENSE
├── Makefile
├── README.md
├── apous.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── apous.xcscheme
├── misc/
│ ├── Components.plist
│ └── scripts/
│ └── bootstrap.sh
├── samples/
│ ├── basic/
│ │ └── basic.swift
│ ├── carthage/
│ │ ├── Cartfile
│ │ └── main.swift
│ ├── cocoapods/
│ │ ├── Podfile
│ │ └── main.swift
│ ├── multi/
│ │ ├── bar.swift
│ │ ├── foo.swift
│ │ └── main.swift
│ ├── nested/
│ │ ├── main.swift
│ │ └── os/
│ │ └── path/
│ │ ├── abspath.swift
│ │ └── basename.swift
│ └── shebang/
│ └── main.swift
├── src/
│ ├── ErrorCodes.swift
│ ├── Tools.swift
│ ├── Utils.swift
│ ├── main.swift
│ └── version.sh
└── test/
├── Info.plist
└── Samples.swift
Condensed preview — 29 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (49K chars).
[
{
"path": ".gitignore",
"chars": 685,
"preview": "# OS X\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.pe"
},
{
"path": "Features.md",
"chars": 213,
"preview": "Features Planned for v0.2.0:\n\n 1. Refactoring project to support unit tests\n 2. Support nested directories for the scr"
},
{
"path": "LICENSE",
"chars": 1085,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Kiad Software, LLC.\n\nPermission is hereby granted, free of charge, to any pers"
},
{
"path": "Makefile",
"chars": 1317,
"preview": "TEMPORARY_FOLDER=/tmp/Apous.dst\nPREFIX=/usr/local\nBUILD_TOOL=xcodebuild\n\nXCODEFLAGS=-project 'apous.xcodeproj' -scheme '"
},
{
"path": "README.md",
"chars": 2229,
"preview": " _______\n | _ .-----.-----.--.--.-----.\n |. 1 | _ | _ | | |__ --|\n |. _ | __|_____|_____|"
},
{
"path": "apous.xcodeproj/project.pbxproj",
"chars": 18647,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "apous.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 150,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:apous.xcodeproj"
},
{
"path": "apous.xcodeproj/xcshareddata/xcschemes/apous.xcscheme",
"chars": 4891,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0700\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "misc/Components.plist",
"chars": 189,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "misc/scripts/bootstrap.sh",
"chars": 758,
"preview": "#!/bin/bash\n\nexport SCRIPT_DIR=$(dirname \"$0\")\n\n##\n## Bootstrap Process\n##\n\nmain ()\n{\n local submodules=$(git submodu"
},
{
"path": "samples/basic/basic.swift",
"chars": 71,
"preview": "\nprint(\"Hello! This is a simple sample that contains no dependencies.\")"
},
{
"path": "samples/carthage/Cartfile",
"chars": 37,
"preview": "github \"thoughtbot/Argo\" \"td-swift-2\""
},
{
"path": "samples/carthage/main.swift",
"chars": 65,
"preview": "import Argo\nimport Runes\n\nprint(\"dependencies imported properly\")"
},
{
"path": "samples/cocoapods/Podfile",
"chars": 147,
"preview": "platform :osx, '10.10'\nuse_frameworks!\n\nplugin 'cocoapods-rome'\n\npod \"Argo\", :git => \"https://github.com/thoughtbot/Argo"
},
{
"path": "samples/cocoapods/main.swift",
"chars": 65,
"preview": "import Argo\nimport Runes\n\nprint(\"dependencies imported properly\")"
},
{
"path": "samples/multi/bar.swift",
"chars": 31,
"preview": "func bar() -> Int {\n\treturn 1\n}"
},
{
"path": "samples/multi/foo.swift",
"chars": 31,
"preview": "func foo() -> Int {\n\treturn 2\n}"
},
{
"path": "samples/multi/main.swift",
"chars": 46,
"preview": "print(\"foo: \\(foo())\")\nprint(\"bar: \\(bar())\")\n"
},
{
"path": "samples/nested/main.swift",
"chars": 101,
"preview": "\nprint(\"Testing Nested Directories\")\nprint(\"abspath: \\(abspath())\")\nprint(\"basename: \\(basename())\")\n"
},
{
"path": "samples/nested/os/path/abspath.swift",
"chars": 51,
"preview": "\nfunc abspath() -> String {\n return \"abspath!\"\n}"
},
{
"path": "samples/nested/os/path/basename.swift",
"chars": 53,
"preview": "\nfunc basename() -> String {\n return \"basename!\"\n}"
},
{
"path": "samples/shebang/main.swift",
"chars": 95,
"preview": "#!/usr/local/bin/apous\n\nprint(\"Hello! This is a simple sample that contains no dependencies.\")\n"
},
{
"path": "src/ErrorCodes.swift",
"chars": 330,
"preview": "//\n// ErrorCodes.swift\n// apous\n//\n// Created by David Owens on 7/5/15.\n// Copyright © 2015 owensd.io. All rights re"
},
{
"path": "src/Tools.swift",
"chars": 6499,
"preview": "//\n// Tools.swift\n// apous\n//\n// Created by David Owens on 7/5/15.\n// Copyright © 2015 owensd.io. All rights reserve"
},
{
"path": "src/Utils.swift",
"chars": 1777,
"preview": "//\n// Utils.swift\n// apous\n//\n// Created by David Owens on 7/5/15.\n// Copyright © 2015 owensd.io. All rights reserve"
},
{
"path": "src/main.swift",
"chars": 1680,
"preview": "//\n// main.swift\n// apous\n//\n// Created by David Owens on 7/4/15.\n// Copyright © 2015 owensd.io. All rights reserved"
},
{
"path": "src/version.sh",
"chars": 340,
"preview": "\nVERSION=0.2.2\nBRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)\nVERSION_FILE=VersionInfo.swift\n\necho \"// THIS IS A GENERAT"
},
{
"path": "test/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "test/Samples.swift",
"chars": 1755,
"preview": "//\n// apoustest.swift\n// apoustest\n//\n// Created by David Owens on 7/6/15.\n// Copyright © 2015 owensd.io. All rights"
}
]
About this extraction
This page contains the full source code of the owensd/apous GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 29 files (43.0 KB), approximately 13.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.