From 775b5199f2a576e40d5eb63b09ea4c9e3b963f75 Mon Sep 17 00:00:00 2001 From: Tomasz Szulc Date: Sat, 1 Aug 2015 17:58:29 +0200 Subject: [PATCH] Cleanup in project structure --- ExpressionsLoader.playground/Contents.swift | 11 -- .../Resources/base.json | 28 ----- .../Resources/expressions.json | 11 -- .../Sources/CountryCode.swift | 8 -- .../ExpressionRepresentationType.swift | 9 -- .../Sources/ExpressionsLoader.swift | 27 ----- .../Sources/ExpressionsPatternType.swift | 11 -- .../Sources/JSONFileLoader.swift | 45 -------- .../Sources/LengthVariation.swift | 18 --- .../Sources/LengthVariationType.swift | 10 -- .../Sources/Processable.swift | 12 -- .../Sources/ProcessableExpression.swift | 18 --- ...ProcessableLengthVariationExpression.swift | 18 --- .../Sources/ProcessableTranslation.swift | 18 --- ...TranslationLengthVariationExpression.swift | 18 --- .../Sources/Regex.swift | 106 ------------------ .../Sources/TranslationLengthVariation.swift | 18 --- .../Sources/TranslationSimple.swift | 18 --- .../Sources/TranslationType.swift | 9 -- .../Sources/TranslationsLoader.swift | 103 ----------------- .../contents.xcplayground | 4 - .../contents.xcworkspacedata | 7 -- .../UserInterfaceState.xcuserstate | Bin 27792 -> 0 bytes .../WorkspaceSettings.xcsettings | 10 -- .../timeline.xctimeline | 6 - Swifternalization.xcodeproj/project.pbxproj | 36 +++--- .../SharedBaseExpression.swift | 0 .../SharedPolishExpression.swift | 0 28 files changed, 18 insertions(+), 561 deletions(-) delete mode 100644 ExpressionsLoader.playground/Contents.swift delete mode 100644 ExpressionsLoader.playground/Resources/base.json delete mode 100644 ExpressionsLoader.playground/Resources/expressions.json delete mode 100644 ExpressionsLoader.playground/Sources/CountryCode.swift delete mode 100644 ExpressionsLoader.playground/Sources/ExpressionRepresentationType.swift delete mode 100644 ExpressionsLoader.playground/Sources/ExpressionsLoader.swift delete mode 100644 ExpressionsLoader.playground/Sources/ExpressionsPatternType.swift delete mode 100644 ExpressionsLoader.playground/Sources/JSONFileLoader.swift delete mode 100644 ExpressionsLoader.playground/Sources/LengthVariation.swift delete mode 100644 ExpressionsLoader.playground/Sources/LengthVariationType.swift delete mode 100644 ExpressionsLoader.playground/Sources/Processable.swift delete mode 100644 ExpressionsLoader.playground/Sources/ProcessableExpression.swift delete mode 100644 ExpressionsLoader.playground/Sources/ProcessableLengthVariationExpression.swift delete mode 100644 ExpressionsLoader.playground/Sources/ProcessableTranslation.swift delete mode 100644 ExpressionsLoader.playground/Sources/ProcessableTranslationLengthVariationExpression.swift delete mode 100644 ExpressionsLoader.playground/Sources/Regex.swift delete mode 100644 ExpressionsLoader.playground/Sources/TranslationLengthVariation.swift delete mode 100644 ExpressionsLoader.playground/Sources/TranslationSimple.swift delete mode 100644 ExpressionsLoader.playground/Sources/TranslationType.swift delete mode 100644 ExpressionsLoader.playground/Sources/TranslationsLoader.swift delete mode 100644 ExpressionsLoader.playground/contents.xcplayground delete mode 100644 ExpressionsLoader.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 ExpressionsLoader.playground/playground.xcworkspace/xcuserdata/tomkowz.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 ExpressionsLoader.playground/playground.xcworkspace/xcuserdata/tomkowz.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 ExpressionsLoader.playground/timeline.xctimeline rename Swifternalization/{Shared Expressions => }/SharedBaseExpression.swift (100%) rename Swifternalization/{Shared Expressions => }/SharedPolishExpression.swift (100%) diff --git a/ExpressionsLoader.playground/Contents.swift b/ExpressionsLoader.playground/Contents.swift deleted file mode 100644 index 642a8c5..0000000 --- a/ExpressionsLoader.playground/Contents.swift +++ /dev/null @@ -1,11 +0,0 @@ -//: Playground - noun: a place where people can play - -import UIKit - -let expsBase = ExpressionsLoader.loadExpressions("base") -let expsPL = ExpressionsLoader.loadExpressions("pl") -let translations = TranslationsLoader.loadTranslations("base") - -for translation in translations { - println(translation.key) -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Resources/base.json b/ExpressionsLoader.playground/Resources/base.json deleted file mode 100644 index e0b4524..0000000 --- a/ExpressionsLoader.playground/Resources/base.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "welcome": "welcome", - - "cars": { - "one": "1 car", - "ie:x=2": "2 cars", - "more": "%d cars" - }, - - "forgot-password": { - "@100": "Forgot Password? Help.", - "@200": "Forgot Password? Get password Help.", - "@300": "Forgotten Your Password? Get password Help." - }, - - "car-sentence": { - "one": { - "@100": "one car", - "@200": "just one car", - "@300": "you've got just one car" - }, - - "more": { - "@100": "%d cars", - "@300": "you've got %d cars" - } - } -} diff --git a/ExpressionsLoader.playground/Resources/expressions.json b/ExpressionsLoader.playground/Resources/expressions.json deleted file mode 100644 index 05f0b5d..0000000 --- a/ExpressionsLoader.playground/Resources/expressions.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "base": { - "one": "ie:x=1", - "two": "ie:x=2", - "more": "exp:(^[^1])|(^\\d{2,})" - }, - - "pl": { - "few": "exp:(((?!1).[2-4]{1})$)|(^[2-4]$)" - } -} diff --git a/ExpressionsLoader.playground/Sources/CountryCode.swift b/ExpressionsLoader.playground/Sources/CountryCode.swift deleted file mode 100644 index 05a482c..0000000 --- a/ExpressionsLoader.playground/Sources/CountryCode.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation - -/** -https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 (lowercase) + "base" -Represents country codes in framework. -Country codes are used to get correct user device's language. -*/ -public typealias CountryCode = String diff --git a/ExpressionsLoader.playground/Sources/ExpressionRepresentationType.swift b/ExpressionsLoader.playground/Sources/ExpressionRepresentationType.swift deleted file mode 100644 index 1703518..0000000 --- a/ExpressionsLoader.playground/Sources/ExpressionRepresentationType.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -/** -Represents expressions in the framework. -*/ -public protocol ExpressionRepresentationType { - /// Identifier of expression. - var identifier: String {get} -} diff --git a/ExpressionsLoader.playground/Sources/ExpressionsLoader.swift b/ExpressionsLoader.playground/Sources/ExpressionsLoader.swift deleted file mode 100644 index da50f07..0000000 --- a/ExpressionsLoader.playground/Sources/ExpressionsLoader.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation - -/** -Used to load content from `expressions.json` file for specified language. -*/ -public final class ExpressionsLoader: JSONFileLoader { - - /** - Loads expressions for specified language. - - :param: countryCode A country code - - :returns: array of loaded expressions. - */ - public class func loadExpressions(countryCode: CountryCode) -> [ProcessableExpression] { - var expressions = [ProcessableExpression]() - if let json = self.load("expressions", fileType: "json", bundle: NSBundle.mainBundle()), - let expressionsDict = json[countryCode] as? Dictionary { - for (identifier, pattern) in expressionsDict { - expressions.append(ProcessableExpression(identifier: identifier, pattern: pattern)) - } - } else { - println("expressions.json file structure is incorrect.") - } - return expressions - } -} diff --git a/ExpressionsLoader.playground/Sources/ExpressionsPatternType.swift b/ExpressionsLoader.playground/Sources/ExpressionsPatternType.swift deleted file mode 100644 index 7babb8d..0000000 --- a/ExpressionsLoader.playground/Sources/ExpressionsPatternType.swift +++ /dev/null @@ -1,11 +0,0 @@ -import Foundation - -/** -Represents objects that have expression pattern. -Example an expression that contains just pattern, without things like length -variations. -*/ -public protocol ExpressionPatternType { - /// A pattern. - var pattern: String {get} -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/JSONFileLoader.swift b/ExpressionsLoader.playground/Sources/JSONFileLoader.swift deleted file mode 100644 index e5e4884..0000000 --- a/ExpressionsLoader.playground/Sources/JSONFileLoader.swift +++ /dev/null @@ -1,45 +0,0 @@ -import Foundation - -/** -Simple JSON loader. -*/ -public class JSONFileLoader { - public typealias JSONDictionary = Dictionary - - /** - Load content of file with specified name, type and bundle. - - :param: fileName A name of a file. - :param: fileType A type of a file. - :param: bundle A bundle when file is located. - - :return: JSON or nil. - */ - public final class func load(fileName: String, fileType: String, bundle: NSBundle = NSBundle.mainBundle()) -> JSONDictionary? { - if let fileURL = bundle.URLForResource(fileName, withExtension: fileType) { - return load(fileURL) - } - println("Cannot find file \(fileName).\(fileType).") - return nil - } - - /** - Loads file for specified URL and try to serialize it. - - :params: fileURL url to JSON file. - - :return: Dictionary with content of JSON file or nil. - */ - private class func load(fileURL: NSURL) -> JSONDictionary? { - if let data = NSData(contentsOfURL: fileURL) { - var error: NSError? - if let dictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? JSONDictionary { - return dictionary - } else { - print("Cannot parse JSON. It might be broken.") - } - } - print("Cannot load content of file.") - return nil - } -} diff --git a/ExpressionsLoader.playground/Sources/LengthVariation.swift b/ExpressionsLoader.playground/Sources/LengthVariation.swift deleted file mode 100644 index beadc32..0000000 --- a/ExpressionsLoader.playground/Sources/LengthVariation.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Struct that represents length variation. -*/ -public struct LengthVariation: LengthVariationType { - /// Length - width of a screen. - public let length: Int - - /// localized string. - public let value: String - - /// Create length variation object. - public init(length: Int, value: String) { - self.length = length - self.value = value - } -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/LengthVariationType.swift b/ExpressionsLoader.playground/Sources/LengthVariationType.swift deleted file mode 100644 index 0959ff2..0000000 --- a/ExpressionsLoader.playground/Sources/LengthVariationType.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -/// Represents length variation. -public protocol LengthVariationType { - /// Length of a screen. - var length: Int {get} - - /// Localized value. - var value: String {get} -} diff --git a/ExpressionsLoader.playground/Sources/Processable.swift b/ExpressionsLoader.playground/Sources/Processable.swift deleted file mode 100644 index 4deef2a..0000000 --- a/ExpressionsLoader.playground/Sources/Processable.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation - -/** -Specifies objects that need processing and are not final objects that can be -used in the framework. An example of such object might be `ProcessableExpression` -that is not ready to be used because it has to be converted into normal kind of -expression that has its fields correctly filled. - -Another good example is `TranslationType` object that contains expression or few -that need to be processed. -*/ -protocol Processable {} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/ProcessableExpression.swift b/ExpressionsLoader.playground/Sources/ProcessableExpression.swift deleted file mode 100644 index a0c0bac..0000000 --- a/ExpressionsLoader.playground/Sources/ProcessableExpression.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Represents loaded expression that will be processed later. -*/ -public struct ProcessableExpression: ExpressionRepresentationType, ExpressionPatternType, Processable { - /// Identifier of expression. - public let identifier: String - - /// Pattern of expression. - public let pattern: String - - /// Creates expression. - public init(identifier: String, pattern: String) { - self.identifier = identifier - self.pattern = pattern - } -} diff --git a/ExpressionsLoader.playground/Sources/ProcessableLengthVariationExpression.swift b/ExpressionsLoader.playground/Sources/ProcessableLengthVariationExpression.swift deleted file mode 100644 index 77c84f5..0000000 --- a/ExpressionsLoader.playground/Sources/ProcessableLengthVariationExpression.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Represents processable expression with length variations. -*/ -public struct ProcessableLengthVariationExpression: ExpressionRepresentationType, Processable { - /// Identifier of expression. - public var identifier: String - - /// Array of length variations - var variations: [LengthVariation] - - /// Creates instance of the class. - public init(identifier: String, variations: [LengthVariation]) { - self.identifier = identifier - self.variations = variations - } -} diff --git a/ExpressionsLoader.playground/Sources/ProcessableTranslation.swift b/ExpressionsLoader.playground/Sources/ProcessableTranslation.swift deleted file mode 100644 index 6c9725d..0000000 --- a/ExpressionsLoader.playground/Sources/ProcessableTranslation.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Represents translation which contains expressions that are not processed yet. -*/ -public struct ProcessableTranslation: TranslationType, Processable { - /// Key that identifies translation. - public let key: String - - /// Array with loaded expressions. - let loadedExpressions: [ProcessableExpression] - - /// Creates instances of the class. - public init(key: String, loadedExpressions: [ProcessableExpression]) { - self.key = key - self.loadedExpressions = loadedExpressions - } -} diff --git a/ExpressionsLoader.playground/Sources/ProcessableTranslationLengthVariationExpression.swift b/ExpressionsLoader.playground/Sources/ProcessableTranslationLengthVariationExpression.swift deleted file mode 100644 index 092aa1f..0000000 --- a/ExpressionsLoader.playground/Sources/ProcessableTranslationLengthVariationExpression.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Represents translation which contains expressions with length variations. -*/ -public struct ProcessableTranslationLengthVariationExpression: TranslationType, Processable { - /// Key that identifies translation. - public let key: String - - /// Array with expressions. - let expressions: [ProcessableLengthVariationExpression] - - /// Creates instances of the class. - public init(key: String, expressions: [ProcessableLengthVariationExpression]) { - self.key = key - self.expressions = expressions - } -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/Regex.swift b/ExpressionsLoader.playground/Sources/Regex.swift deleted file mode 100644 index 91717ca..0000000 --- a/ExpressionsLoader.playground/Sources/Regex.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// Regex.swift -// Swifternalization -// -// Created by Tomasz Szulc on 27/06/15. -// Copyright (c) 2015 Tomasz Szulc. All rights reserved. -// - -import Foundation - -/** -Class uses NSRegularExpression internally and simplifies its usability. -*/ -public class Regex { - - /** - Return match in a string. Optionally with index of capturing group - - :param: str A string that will be matched. - :param: pattern A regex pattern. - - :returns: `String` that matches pattern or nil. - */ - public class func matchInString(str: String, pattern: String, capturingGroupIdx: Int?) -> String? { - var resultString: String? - - let range = NSMakeRange(0, count(str)) - regexp(pattern)?.enumerateMatchesInString(str, options: nil, range: range, usingBlock: { result, flags, stop in - if let result = result { - if let capturingGroupIdx = capturingGroupIdx where result.numberOfRanges > capturingGroupIdx { - resultString = self.substring(str, range: result.rangeAtIndex(capturingGroupIdx)) - } else { - resultString = self.substring(str, range: result.range) - } - } - }) - - return resultString - } - - - /** - Return first match in a string. - - :param: str A string that will be matched. - :param: pattern A regexp pattern. - - :returns: `String` that matches pattern or nil. - */ - class func firstMatchInString(str: String, pattern: String) -> String? { - if let result = regexp(pattern)?.firstMatchInString(str, options: .ReportCompletion, range: NSMakeRange(0, count(str))) { - return substring(str, range: result.range) - } - return nil - } - - /** - Return all matches in a string. - - :param: str A string that will be matched. - :param: pattern A regexp pattern. - - :returns: Array of `Strings`s. If nothing found empty array is returned. - */ - class func matchesInString(str: String, pattern: String) -> [String] { - var matches = [String]() - if let results = regexp(pattern)?.matchesInString(str, options: .ReportCompletion, range: NSMakeRange(0, count(str))) as? [NSTextCheckingResult] { - for result in results { - matches.append(substring(str, range: result.range)) - } - } - - return matches - } - - /** - Returns new `NSRegularExpression` object. - - :param: pattern A regexp pattern. - - :returns: `NSRegularExpression` object or nil if it cannot be created. - */ - private class func regexp(pattern: String) -> NSRegularExpression? { - var error: NSError? = nil - var regexp = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error) - if error != nil { - println(error!) - } - return regexp - } - - /** - Method that substring string with passed range. - - :param: str A string that is source of substraction. - :param: range A range that tells which part of `str` will be substracted. - - :returns: A string contained in `range`. - */ - private class func substring(str: String, range: NSRange) -> String { - let startRange = advance(str.startIndex, range.location) - let endRange = advance(startRange, range.length) - - return str.substringWithRange(Range(start: startRange, end: endRange)) - } -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/TranslationLengthVariation.swift b/ExpressionsLoader.playground/Sources/TranslationLengthVariation.swift deleted file mode 100644 index 95688c1..0000000 --- a/ExpressionsLoader.playground/Sources/TranslationLengthVariation.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Class represents translation which contains key and length variations. -*/ -public struct TranslationLengthVariation: TranslationType { - /// Key that identifies this translation. - public let key: String - - /// list of variations. - let variations: [LengthVariation] - - /// Creates translation object - public init(key: String, variations: [LengthVariation]) { - self.key = key - self.variations = variations - } -} \ No newline at end of file diff --git a/ExpressionsLoader.playground/Sources/TranslationSimple.swift b/ExpressionsLoader.playground/Sources/TranslationSimple.swift deleted file mode 100644 index 83305cd..0000000 --- a/ExpressionsLoader.playground/Sources/TranslationSimple.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -/** -Represents simple key-value translation. -*/ -public struct TranslationSimple: TranslationType { - /// Key that identifies translation. - public let key: String - - /// Localized string. - public let value: String - - /// Creates instance of the class. - public init(key: String, value: String) { - self.key = key - self.value = value - } -} diff --git a/ExpressionsLoader.playground/Sources/TranslationType.swift b/ExpressionsLoader.playground/Sources/TranslationType.swift deleted file mode 100644 index 653d598..0000000 --- a/ExpressionsLoader.playground/Sources/TranslationType.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Foundation - -/** -Represents translation. -*/ -public protocol TranslationType { - /// Key that identifies translation. - var key: String {get} -} diff --git a/ExpressionsLoader.playground/Sources/TranslationsLoader.swift b/ExpressionsLoader.playground/Sources/TranslationsLoader.swift deleted file mode 100644 index 83a97ef..0000000 --- a/ExpressionsLoader.playground/Sources/TranslationsLoader.swift +++ /dev/null @@ -1,103 +0,0 @@ -import Foundation - -/** -Represents translations loader. -Class is looking for json file named as country code. -It parse such file. -*/ -public final class TranslationsLoader: JSONFileLoader { - - typealias DictWithStrings = Dictionary - typealias DictWithDicts = Dictionary - - enum ElementType { - case NotSupported - case TranslationWithLengthVariations - case TranslationWithLoadedExpressions - case TranslationWithLengthVariationsAndLoadedExpressions - } - - /** - Method loads a file and parses it. - - :params: countryCode A country code. - - :return: translations parsed from the file. - */ - public class func loadTranslations(countryCode: CountryCode) -> [TranslationType] { - var loadedTranslations = [TranslationType]() - let json = self.load(countryCode, fileType: "json", bundle: NSBundle.mainBundle()) - if json == nil { return [TranslationType]() } - - for (translationKey, value) in json! { - if let translationValue = value as? String { - loadedTranslations.append(TranslationSimple(key: translationKey, value: translationValue)) - } else { - let dictionary = value as! JSONDictionary - switch detectElementType(dictionary) { - case .TranslationWithLengthVariations: - let variations = parseLengthVariations(dictionary as! DictWithStrings) - loadedTranslations.append(TranslationLengthVariation(key: translationKey, variations: variations)) - - case .TranslationWithLoadedExpressions: - let expressions = parseExpressions(dictionary as! DictWithStrings) - loadedTranslations.append(ProcessableTranslation(key: translationKey, loadedExpressions: expressions)) - - case .TranslationWithLengthVariationsAndLoadedExpressions: - var expressions = [ProcessableLengthVariationExpression]() - for (expressionIdentifier, lengthVariationsDict) in dictionary as! DictWithDicts { - let variations = parseLengthVariations(lengthVariationsDict) - expressions.append(ProcessableLengthVariationExpression(identifier: expressionIdentifier, variations: variations)) - } - loadedTranslations.append(ProcessableTranslationLengthVariationExpression(key: translationKey, expressions: expressions)) - - case .NotSupported: - // Do nothing - continue - } - } - } - - return loadedTranslations - } - - private class func parseLengthVariations(dict: DictWithStrings) -> [LengthVariation] { - var variations = [LengthVariation]() - for (key, translationValue) in dict { - let numberValue = parseNumberFromLengthVariation(key) - variations.append(LengthVariation(length: numberValue, value: translationValue)) - } - return variations - } - - private class func parseExpressions(dict: DictWithStrings) -> [ProcessableExpression] { - var expressions = [ProcessableExpression]() - for (expressionKey, translationValue) in dict { - expressions.append(ProcessableExpression(identifier: expressionKey, pattern: translationValue)) - } - return expressions - } - - private class func detectElementType(element: JSONDictionary) -> ElementType { - - if element is DictWithStrings { - if let key = element.keys.first { - let toIndex = advance(key.startIndex, 1) - let firstCharacter = key.substringToIndex(toIndex) - if firstCharacter == "@" { - return .TranslationWithLengthVariations - } else { - return .TranslationWithLoadedExpressions - } - } - } else if element is DictWithDicts { - return .TranslationWithLengthVariationsAndLoadedExpressions - } - - return .NotSupported - } - - private class func parseNumberFromLengthVariation(string: String) -> Int { - return (Regex.matchInString(string, pattern: "@(\\d+)", capturingGroupIdx: 1)! as NSString).integerValue - } -} diff --git a/ExpressionsLoader.playground/contents.xcplayground b/ExpressionsLoader.playground/contents.xcplayground deleted file mode 100644 index 5da2641..0000000 --- a/ExpressionsLoader.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/ExpressionsLoader.playground/playground.xcworkspace/contents.xcworkspacedata b/ExpressionsLoader.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index c706b0d..0000000 --- a/ExpressionsLoader.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ExpressionsLoader.playground/playground.xcworkspace/xcuserdata/tomkowz.xcuserdatad/UserInterfaceState.xcuserstate b/ExpressionsLoader.playground/playground.xcworkspace/xcuserdata/tomkowz.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f98a0d1a491086015b2c3be74c87396706570b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27792 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 - - - - HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges - - SnapshotAutomaticallyBeforeSignificantChanges - - - diff --git a/ExpressionsLoader.playground/timeline.xctimeline b/ExpressionsLoader.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/ExpressionsLoader.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/Swifternalization.xcodeproj/project.pbxproj b/Swifternalization.xcodeproj/project.pbxproj index 7c35ba9..e95c72a 100644 --- a/Swifternalization.xcodeproj/project.pbxproj +++ b/Swifternalization.xcodeproj/project.pbxproj @@ -26,8 +26,6 @@ 6D5BA5F11B6517A6000D7E49 /* TranslationsLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DB3CC731B5EBDA600A1220F /* TranslationsLoader.swift */; }; 6D5BA5F31B651809000D7E49 /* LengthVariation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DB3CC6A1B5EBDA600A1220F /* LengthVariation.swift */; }; 6D5BA5FB1B65253B000D7E49 /* SharedExpressionsProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA5FA1B65253B000D7E49 /* SharedExpressionsProcessor.swift */; }; - 6D5BA6001B6526F0000D7E49 /* SharedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA5FF1B6526F0000D7E49 /* SharedExpression.swift */; }; - 6D5BA6011B65271A000D7E49 /* SharedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA5FF1B6526F0000D7E49 /* SharedExpression.swift */; }; 6D5BA6041B6537D5000D7E49 /* SharedExpressionsProcessorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA6031B6537D5000D7E49 /* SharedExpressionsProcessorTests.swift */; }; 6D5BA6051B653935000D7E49 /* SharedExpressionsProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA5FA1B65253B000D7E49 /* SharedExpressionsProcessor.swift */; }; 6D5BA6091B655F1D000D7E49 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5BA6081B655F1D000D7E49 /* Expression.swift */; }; @@ -73,12 +71,14 @@ 6DBB6C521B401B8A002F39A3 /* Swifternalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D5004641B3EF92600A54B36 /* Swifternalization.swift */; }; 6DBB6C691B4040F0002F39A3 /* InternalPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C681B4040F0002F39A3 /* InternalPattern.swift */; }; 6DBB6C6A1B40412D002F39A3 /* InternalPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C681B4040F0002F39A3 /* InternalPattern.swift */; }; - 6DBB6C8F1B40768A002F39A3 /* SharedBaseExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C8C1B40768A002F39A3 /* SharedBaseExpression.swift */; }; - 6DBB6C911B40768A002F39A3 /* SharedPolishExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C8E1B40768A002F39A3 /* SharedPolishExpression.swift */; }; - 6DBB6C921B40769F002F39A3 /* SharedBaseExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C8C1B40768A002F39A3 /* SharedBaseExpression.swift */; }; - 6DBB6C941B40769F002F39A3 /* SharedPolishExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C8E1B40768A002F39A3 /* SharedPolishExpression.swift */; }; 6DBB6C961B4076E8002F39A3 /* SharedBaseExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C951B4076E8002F39A3 /* SharedBaseExpressionTests.swift */; }; 6DBB6C981B4077FA002F39A3 /* SharedPolishExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBB6C971B4077FA002F39A3 /* SharedPolishExpressionTests.swift */; }; + 6DBFC48D1B6D23E500F52208 /* SharedBaseExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48A1B6D23E500F52208 /* SharedBaseExpression.swift */; }; + 6DBFC48E1B6D23E500F52208 /* SharedBaseExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48A1B6D23E500F52208 /* SharedBaseExpression.swift */; }; + 6DBFC48F1B6D23E500F52208 /* SharedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48B1B6D23E500F52208 /* SharedExpression.swift */; }; + 6DBFC4901B6D23E500F52208 /* SharedExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48B1B6D23E500F52208 /* SharedExpression.swift */; }; + 6DBFC4911B6D23E500F52208 /* SharedPolishExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48C1B6D23E500F52208 /* SharedPolishExpression.swift */; }; + 6DBFC4921B6D23E500F52208 /* SharedPolishExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DBFC48C1B6D23E500F52208 /* SharedPolishExpression.swift */; }; 6DD3B93A1B5ED35200C79EAC /* base.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD3B9371B5ED35200C79EAC /* base.json */; }; 6DD3B93B1B5ED35200C79EAC /* expressions.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD3B9381B5ED35200C79EAC /* expressions.json */; }; 6DD3B93C1B5ED35200C79EAC /* pl.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD3B9391B5ED35200C79EAC /* pl.json */; }; @@ -114,7 +114,6 @@ 6D5004641B3EF92600A54B36 /* Swifternalization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Swifternalization.swift; sourceTree = ""; }; 6D5BA5EF1B651796000D7E49 /* TranslationsLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TranslationsLoaderTests.swift; sourceTree = ""; }; 6D5BA5FA1B65253B000D7E49 /* SharedExpressionsProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedExpressionsProcessor.swift; sourceTree = ""; }; - 6D5BA5FF1B6526F0000D7E49 /* SharedExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SharedExpression.swift; path = ../SharedExpression.swift; sourceTree = ""; }; 6D5BA6031B6537D5000D7E49 /* SharedExpressionsProcessorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedExpressionsProcessorTests.swift; sourceTree = ""; }; 6D5BA6081B655F1D000D7E49 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; 6D6282931B3F052B00E65FCD /* TranslatablePairTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TranslatablePairTests.swift; sourceTree = ""; }; @@ -145,10 +144,11 @@ 6DB3CC731B5EBDA600A1220F /* TranslationsLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TranslationsLoader.swift; sourceTree = ""; }; 6DB3CC8F1B5EC29600A1220F /* ExpressionPatternType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpressionPatternType.swift; sourceTree = ""; }; 6DBB6C681B4040F0002F39A3 /* InternalPattern.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InternalPattern.swift; sourceTree = ""; }; - 6DBB6C8C1B40768A002F39A3 /* SharedBaseExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedBaseExpression.swift; sourceTree = ""; }; - 6DBB6C8E1B40768A002F39A3 /* SharedPolishExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedPolishExpression.swift; sourceTree = ""; }; 6DBB6C951B4076E8002F39A3 /* SharedBaseExpressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedBaseExpressionTests.swift; sourceTree = ""; }; 6DBB6C971B4077FA002F39A3 /* SharedPolishExpressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedPolishExpressionTests.swift; sourceTree = ""; }; + 6DBFC48A1B6D23E500F52208 /* SharedBaseExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SharedBaseExpression.swift; path = Swifternalization/SharedBaseExpression.swift; sourceTree = SOURCE_ROOT; }; + 6DBFC48B1B6D23E500F52208 /* SharedExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SharedExpression.swift; path = Swifternalization/SharedExpression.swift; sourceTree = SOURCE_ROOT; }; + 6DBFC48C1B6D23E500F52208 /* SharedPolishExpression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SharedPolishExpression.swift; path = Swifternalization/SharedPolishExpression.swift; sourceTree = SOURCE_ROOT; }; 6DD3B9371B5ED35200C79EAC /* base.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = base.json; sourceTree = ""; }; 6DD3B9381B5ED35200C79EAC /* expressions.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = expressions.json; sourceTree = ""; }; 6DD3B9391B5ED35200C79EAC /* pl.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = pl.json; sourceTree = ""; }; @@ -286,9 +286,9 @@ 6DBB6C8B1B40767B002F39A3 /* Shared Expressions */ = { isa = PBXGroup; children = ( - 6D5BA5FF1B6526F0000D7E49 /* SharedExpression.swift */, - 6DBB6C8C1B40768A002F39A3 /* SharedBaseExpression.swift */, - 6DBB6C8E1B40768A002F39A3 /* SharedPolishExpression.swift */, + 6DBFC48A1B6D23E500F52208 /* SharedBaseExpression.swift */, + 6DBFC48B1B6D23E500F52208 /* SharedExpression.swift */, + 6DBFC48C1B6D23E500F52208 /* SharedPolishExpression.swift */, ); path = "Shared Expressions"; sourceTree = ""; @@ -436,21 +436,21 @@ 6D5004661B3EF92600A54B36 /* Swifternalization.swift in Sources */, 6D62829A1B3F17CA00E65FCD /* Regex.swift in Sources */, 6D6282B51B3F3C4100E65FCD /* InequalitySign.swift in Sources */, - 6DBB6C8F1B40768A002F39A3 /* SharedBaseExpression.swift in Sources */, 6D4C4EBD1B6ABE0700B7839A /* Translation.swift in Sources */, 6DB3CC901B5EC29600A1220F /* ExpressionPatternType.swift in Sources */, 6DB3CC7A1B5EBDA600A1220F /* LengthVariation.swift in Sources */, 6DB3CC751B5EBDA600A1220F /* CountryCode.swift in Sources */, 6D4C4EB31B6AAE3200B7839A /* LoadedTranslationsProcessor.swift in Sources */, + 6DBFC48F1B6D23E500F52208 /* SharedExpression.swift in Sources */, 6D4C4EAF1B6AA48F00B7839A /* LoadedTranslation.swift in Sources */, - 6D5BA6001B6526F0000D7E49 /* SharedExpression.swift in Sources */, 6D62829F1B3F1FA000E65FCD /* InequalityExpressionParser.swift in Sources */, + 6DBFC48D1B6D23E500F52208 /* SharedBaseExpression.swift in Sources */, 6D6282A51B3F24A800E65FCD /* ExpressionParser.swift in Sources */, 6D4C4EB81B6AB6DE00B7839A /* LoadedTranslationType.swift in Sources */, 6DB3CC771B5EBDA600A1220F /* SharedExpressionLoader.swift in Sources */, 6DBB6C691B4040F0002F39A3 /* InternalPattern.swift in Sources */, + 6DBFC4911B6D23E500F52208 /* SharedPolishExpression.swift in Sources */, 6D5BA6091B655F1D000D7E49 /* Expression.swift in Sources */, - 6DBB6C911B40768A002F39A3 /* SharedPolishExpression.swift in Sources */, 6D6282C51B3F4ED100E65FCD /* RegexExpressionParser.swift in Sources */, 6D6282C71B3F4F2100E65FCD /* RegexExpressionMatcher.swift in Sources */, 6DB3CC791B5EBDA600A1220F /* JSONFileLoader.swift in Sources */, @@ -471,6 +471,7 @@ 6D6282C11B3F43C600E65FCD /* InequalityExtendedExpressionMatcherTests.swift in Sources */, 6DD3B9451B5ED58A00C79EAC /* SharedExpressionLoader.swift in Sources */, 6D75E6D41B6B6CFE00B370DC /* LoadedTranslationsProcessorTests.swift in Sources */, + 6DBFC4921B6D23E500F52208 /* SharedPolishExpression.swift in Sources */, 6D50045B1B3EF91600A54B36 /* SwifternalizationTests.swift in Sources */, 6D6282A61B3F25B900E65FCD /* InequalityExpressionParser.swift in Sources */, 6D6282B81B3F3E2200E65FCD /* InequalitySign.swift in Sources */, @@ -479,9 +480,9 @@ 6D5BA6051B653935000D7E49 /* SharedExpressionsProcessor.swift in Sources */, 6D6282A71B3F25BE00E65FCD /* ExpressionMatcher.swift in Sources */, 6DD3B94B1B5ED65A00C79EAC /* NSBundle+TestExtension.swift in Sources */, + 6DBFC4901B6D23E500F52208 /* SharedExpression.swift in Sources */, 6D6282C81B3F4F6400E65FCD /* RegexExpressionMatcher.swift in Sources */, 6DD3B9421B5ED3F000C79EAC /* JSONFileLoader.swift in Sources */, - 6D5BA6011B65271A000D7E49 /* SharedExpression.swift in Sources */, 6D4C4EC51B6AD01300B7839A /* LoadedTranslationsProcessor.swift in Sources */, 6DBB6C6A1B40412D002F39A3 /* InternalPattern.swift in Sources */, 6D62F9FC1B6B808400596A7C /* ExpressionJSONs.swift in Sources */, @@ -490,16 +491,15 @@ 6D4C4EB01B6AA54800B7839A /* LoadedTranslation.swift in Sources */, 6DB3CC911B5EC29E00A1220F /* ExpressionPatternType.swift in Sources */, 6D6282941B3F052B00E65FCD /* TranslatablePairTests.swift in Sources */, - 6DBB6C941B40769F002F39A3 /* SharedPolishExpression.swift in Sources */, 6DBB6C521B401B8A002F39A3 /* Swifternalization.swift in Sources */, 6D5BA5F01B651796000D7E49 /* TranslationsLoaderTests.swift in Sources */, 6D4C4EC41B6ACF2C00B7839A /* Translation.swift in Sources */, 6D6282BF1B3F42CA00E65FCD /* InequalityExpressionMatcherTests.swift in Sources */, - 6DBB6C921B40769F002F39A3 /* SharedBaseExpression.swift in Sources */, 6D5BA6041B6537D5000D7E49 /* SharedExpressionsProcessorTests.swift in Sources */, 6D6282B31B3F3C2800E65FCD /* InequalityExtendedExpressionParser.swift in Sources */, 6D140F441B56D03D00359143 /* RandomNumbers.swift in Sources */, 6D6282AD1B3F327C00E65FCD /* InequalityExpressionMatcher.swift in Sources */, + 6DBFC48E1B6D23E500F52208 /* SharedBaseExpression.swift in Sources */, 6D4C4EC61B6AD01D00B7839A /* Expression.swift in Sources */, 6D62829D1B3F19CC00E65FCD /* RegexTests.swift in Sources */, 6D6282CB1B3F508C00E65FCD /* RegexExpressionParserTests.swift in Sources */, diff --git a/Swifternalization/Shared Expressions/SharedBaseExpression.swift b/Swifternalization/SharedBaseExpression.swift similarity index 100% rename from Swifternalization/Shared Expressions/SharedBaseExpression.swift rename to Swifternalization/SharedBaseExpression.swift diff --git a/Swifternalization/Shared Expressions/SharedPolishExpression.swift b/Swifternalization/SharedPolishExpression.swift similarity index 100% rename from Swifternalization/Shared Expressions/SharedPolishExpression.swift rename to Swifternalization/SharedPolishExpression.swift