Skip to content

Commit

Permalink
Merge branch 'od/travis_coveralls' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
odrobnik committed Apr 25, 2014
2 parents 37ce605 + 0419085 commit a92ab33
Show file tree
Hide file tree
Showing 6 changed files with 325 additions and 1 deletion.
13 changes: 13 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
language: objective-c

before_script:
- sudo easy_install cpp-coveralls

script:
- xctool -project genstrings2.xcodeproj -scheme "Static Library" test -arch x86_64 ONLY_ACTIVE_ARCH=NO
### disabled until Travis-CI fixes missing appledoc install on 10.9 machines
# - appledoc -o /tmp .

after_success:
- ./coveralls.rb --extension m --exclude-folder Demo --exclude-folder Test --exclude-folder Externals
2 changes: 2 additions & 0 deletions Readme.markdown
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
DTLocalizableStringScanner
==========================

[![Build Status](https://travis-ci.org/Cocoanetics/DTLocalizableStringScanner.png?branch=develop)](https://travis-ci.org/Cocoanetics/DTLocalizableStringScanner) [![Coverage Status](https://coveralls.io/repos/Cocoanetics/DTLocalizableStringScanner/badge.png?branch=develop)](https://coveralls.io/r/Cocoanetics/DTLocalizableStringScanner?branch=develop)

This project aims to duplicate and enhance the functionality found in the `genstrings` utility provided by Apple. The Demo builds a command line utility `genstrings2` which works like the original but using more modern techniques. The Core contains classes and categories to add this scanning functionality to [Linguan](http://www.cocoanetics.com/apps/linguan/).

Documentation
Expand Down
13 changes: 13 additions & 0 deletions Test/Resources/Multiple_Tables.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* Tests if tokens properly end up in multiple strings tables */

#define CONTACT_NAME_MENU_TITLE NSLocalizedString(@"Contact Name Format",nil)




if ([[menuItem title] isEqualToString:NSLocalizedStringFromTableInBundle(@"Open Link", @"Third Table", [NSBundle bundleForClass:[WebView class]], nil)])
[webViewMenuItems removeObjectIdenticalTo:menuItem];
}



136 changes: 136 additions & 0 deletions coveralls.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#!/usr/bin/env ruby

require 'etc'
require 'fileutils'
require 'find'
require 'optparse'

# arraw of source subfolders to exclude
excludedFolders = []
extensionsToProcess = []
coveralls_cmd = "coveralls"

excludeHeaders = false

# create option parser
opts = OptionParser.new
opts.banner = "Usage: coveralls.rb [options]"

opts.on('-e', '--exclude-folder FOLDER', 'Folder to exclude') do |v|
excludedFolders << v
coveralls_cmd.concat(" -e #{v}")
end

opts.on('-h', '--exclude-headers', 'Ignores headers') do |v|
excludeHeaders = true
end

opts.on('-x', '--extension EXT', 'Source file extension to process') do |v|
extensionsToProcess << v
coveralls_cmd.concat(" -x #{v}")
end

opts.on_tail("-?", "--help", "Show this message") do
puts opts
exit
end

# parse the options
begin
opts.parse!(ARGV)
rescue OptionParser::InvalidOption => e
puts e
puts opts
exit(1)
end

# the folders
workingDir = Dir.getwd
derivedDataDir = "#{Etc.getpwuid.dir}/Library/Developer/Xcode/DerivedData/"
outputDir = workingDir + "/gcov"

# create gcov output folder
FileUtils.mkdir outputDir

# pattern to get source file from first line of gcov file
GCOV_SOURCE_PATTERN = Regexp.new(/Source:(.*)/)

# enumerate all gcda files underneath derivedData
Find.find(derivedDataDir) do |gcda_file|

if gcda_file.match(/\.gcda\Z/)

#get just the folder name
gcov_dir = File.dirname(gcda_file)

# cut off absolute working dir to get relative source path
relative_input_path = gcda_file.slice(derivedDataDir.length, gcda_file.length)
puts "\nINPUT: #{relative_input_path}"

#process the file
result = %x( gcov '#{gcda_file}' -o '#{gcov_dir}' )

# filter the resulting output
Dir.glob("*.gcov") do |gcov_file|

firstLine = File.open(gcov_file).readline
match = GCOV_SOURCE_PATTERN.match(firstLine)

if (match)

source_path = match[1]

puts "source: #{source_path} - #{workingDir}"

if (source_path.start_with? workingDir)

# cut off absolute working dir to get relative source path
relative_path = source_path.slice(workingDir.length+1, source_path.length)

extension = File.extname(relative_path)
extension = extension.slice(1, extension.length-1)

puts "#{extension}"

# get the path components
path_comps = relative_path.split(File::SEPARATOR)

shouldProcess = false
exclusionMsg =""

if (excludedFolders.include?(path_comps[0]))
exclusionMsg = "excluded via option"
else
if (excludeHeaders == true && extension == 'h')
exclusionMsg = "excluded header"
else
if (extensionsToProcess.count == 0 || extensionsToProcess.include?(extension))
shouldProcess = true
else
exclusionMsg = "excluded extension"
shouldProcess = false
end
end
end

if (shouldProcess)
puts " - process: #{relative_path}"
FileUtils.mv(gcov_file, outputDir)
else
puts " - ignore: #{relative_path} (#{exclusionMsg})"
FileUtils.rm gcov_file
end
else
puts " - ignore: #{gcov_file} (outside source folder)"
FileUtils.rm gcov_file
end
end
end
end
end

#call the coveralls, exclude some files
system coveralls_cmd

#clean up
FileUtils.rm_rf outputDir
93 changes: 92 additions & 1 deletion genstrings2.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/usr/local/bin/appledoc --print-settings --output \"${BUILD_DIR}/Documentation/\" \"${PROJECT_DIR}\"\necho \"Documentation Output directory: ${BUILD_DIR}/Documentation/\"";
shellScript = "echo \"Documentation Output directory: ${BUILD_DIR}/Documentation/\"\n/usr/local/bin/appledoc --print-settings --output \"${BUILD_DIR}/Documentation/\" \"${PROJECT_DIR}\"\nexit $?";
showEnvVarsInLog = 0;
};
A7F65DBC14C03E980092E2EE /* ShellScript */ = {
Expand Down Expand Up @@ -488,6 +488,92 @@
/* End PBXTargetDependency section */

/* Begin XCBuildConfiguration section */
A7313BDA190A619A007E130F /* Coverage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"COVERAGE=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.7;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Coverage;
};
A7313BDB190A619A007E130F /* Coverage */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Demo/genstrings2-Prefix.pch";
OTHER_LDFLAGS = (
"-ObjC",
"-all_load",
);
PRODUCT_NAME = genstrings2;
};
name = Coverage;
};
A7313BDC190A619A007E130F /* Coverage */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = YES;
COMBINE_HIDPI_IMAGES = YES;
GCC_GENERATE_TEST_COVERAGE_FILES = YES;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Core/DTLocalizableStringScanner-Prefix.pch";
PRODUCT_NAME = DTLocalizableStringScanner;
SKIP_INSTALL = YES;
};
name = Coverage;
};
A7313BDD190A619A007E130F /* Coverage */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
GCC_GENERATE_TEST_COVERAGE_FILES = YES;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Test/UnitTest-Prefix.pch";
INFOPLIST_FILE = "Test/UnitTest-Info.plist";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = octest;
};
name = Coverage;
};
A7313BDE190A619A007E130F /* Coverage */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Coverage;
};
A775234A14ACEF7A0035CDCA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
Expand Down Expand Up @@ -652,6 +738,7 @@
isa = XCConfigurationList;
buildConfigurations = (
A775234A14ACEF7A0035CDCA /* Debug */,
A7313BDA190A619A007E130F /* Coverage */,
A775234B14ACEF7A0035CDCA /* Release */,
);
defaultConfigurationIsVisible = 0;
Expand All @@ -661,6 +748,7 @@
isa = XCConfigurationList;
buildConfigurations = (
A775234D14ACEF7A0035CDCA /* Debug */,
A7313BDB190A619A007E130F /* Coverage */,
A775234E14ACEF7A0035CDCA /* Release */,
);
defaultConfigurationIsVisible = 0;
Expand All @@ -670,6 +758,7 @@
isa = XCConfigurationList;
buildConfigurations = (
A79AC09614B1A51800489FA3 /* Debug */,
A7313BDC190A619A007E130F /* Coverage */,
A79AC09714B1A51800489FA3 /* Release */,
);
defaultConfigurationIsVisible = 0;
Expand All @@ -679,6 +768,7 @@
isa = XCConfigurationList;
buildConfigurations = (
A79D903616F7491B009D8A46 /* Debug */,
A7313BDE190A619A007E130F /* Coverage */,
A79D903716F7491B009D8A46 /* Release */,
);
defaultConfigurationIsVisible = 0;
Expand All @@ -688,6 +778,7 @@
isa = XCConfigurationList;
buildConfigurations = (
A7F65DCC14C03E990092E2EE /* Debug */,
A7313BDD190A619A007E130F /* Coverage */,
A7F65DCD14C03E990092E2EE /* Release */,
);
defaultConfigurationIsVisible = 0;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0460"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A79AC08714B1A51800489FA3"
BuildableName = "libDTLocalizableStringScanner.a"
BlueprintName = "Static Library"
ReferencedContainer = "container:genstrings2.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Coverage">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A7F65DBD14C03E980092E2EE"
BuildableName = "UnitTest.octest"
BlueprintName = "UnitTest"
ReferencedContainer = "container:genstrings2.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

0 comments on commit a92ab33

Please sign in to comment.