From b966ed9cc49ad78e52bc3513f20b94f50e5a7cd3 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 18:48:15 +0200 Subject: [PATCH 1/9] Auto-migration --- Fakery.xcodeproj/project.pbxproj | 6 +++ Source/Data/Parser.swift | 46 ++++++++++----------- Source/Data/Provider.swift | 22 +++++----- Source/Extensions/ArrayExtension.swift | 4 +- Source/Faker.swift | 26 ++++++------ Source/Generators/Address.swift | 36 ++++++++-------- Source/Generators/App.swift | 8 ++-- Source/Generators/Business.swift | 10 ++--- Source/Generators/Commerce.swift | 16 +++---- Source/Generators/Company.swift | 12 +++--- Source/Generators/Generator.swift | 30 +++++++------- Source/Generators/Internet.swift | 43 ++++++++++--------- Source/Generators/Lorem.swift | 30 +++++++------- Source/Generators/Name.swift | 14 +++---- Source/Generators/Number.swift | 16 +++---- Source/Generators/PhoneNumber.swift | 14 +++---- Source/Generators/Team.swift | 10 ++--- Tests/Fakery/Generators/BusinessSpec.swift | 2 +- Tests/Fakery/Generators/CommerceSpec.swift | 8 ++-- Tests/Fakery/Generators/GeneratorSpec.swift | 8 ++-- Tests/Fakery/Generators/InternetSpec.swift | 16 +++---- 21 files changed, 191 insertions(+), 186 deletions(-) diff --git a/Fakery.xcodeproj/project.pbxproj b/Fakery.xcodeproj/project.pbxproj index 8789462..4b87e65 100644 --- a/Fakery.xcodeproj/project.pbxproj +++ b/Fakery.xcodeproj/project.pbxproj @@ -596,9 +596,11 @@ TargetAttributes = { BC827FA71BFA3CE1005F09A4 = { CreatedOnToolsVersion = 7.1.1; + LastSwiftMigration = 0800; }; BC827FB01BFA3CE1005F09A4 = { CreatedOnToolsVersion = 7.1.1; + LastSwiftMigration = 0800; }; BCF0DF391BF9F77E00427DB4 = { CreatedOnToolsVersion = 7.1.1; @@ -931,6 +933,7 @@ PRODUCT_NAME = Fakery; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -953,6 +956,7 @@ PRODUCT_NAME = Fakery; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -968,6 +972,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.Fakery-OSXTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -983,6 +988,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.Fakery-OSXTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/Source/Data/Parser.swift b/Source/Data/Parser.swift index a4ed8d3..5a022df 100644 --- a/Source/Data/Parser.swift +++ b/Source/Data/Parser.swift @@ -21,7 +21,7 @@ public final class Parser { // MARK: - Parsing - public func fetch(key: String) -> String { + public func fetch(_ key: String) -> String { var parsed = "" guard let keyData = fetchRaw(key) else { @@ -32,21 +32,21 @@ public final class Parser { if let value = keyData as? String { parsed = value - } else if let array = keyData as? [String], item = array.random() { + } else if let array = keyData as? [String], let item = array.random() { parsed = item } - if parsed.rangeOfString("#{") != nil { + if parsed.range(of: "#{") != nil { parsed = parse(parsed, forSubject: subject) } return parsed } - public func fetchRaw(key: String) -> AnyObject? { - let parts = key.componentsSeparatedByString(".") + public func fetchRaw(_ key: String) -> AnyObject? { + let parts = key.components(separatedBy: ".") - guard let localeData = data[locale], var parsed = localeData["faker"] where !parts.isEmpty else { + guard let localeData = data[locale], var parsed = localeData["faker"] , !parts.isEmpty else { return nil } @@ -55,19 +55,19 @@ public final class Parser { parsed = parsedPart } - return parsed + return parsed as AnyObject? } - func parse(template: String, forSubject subject: String) -> String { + func parse(_ template: String, forSubject subject: String) -> String { var text = "" let string = template as NSString var regex: NSRegularExpression do { try regex = NSRegularExpression(pattern: "(\\(?)#\\{([A-Za-z]+\\.)?([^\\}]+)\\}([^#]+)?", - options: .CaseInsensitive) - let matches = regex.matchesInString(string as String, - options: .ReportCompletion, + options: .caseInsensitive) + let matches = regex.matches(in: string as String, + options: .reportCompletion, range: NSMakeRange(0, string.length)) guard !matches.isEmpty else { @@ -79,28 +79,28 @@ public final class Parser { continue } - let prefixRange = match.rangeAtIndex(1) - let subjectRange = match.rangeAtIndex(2) - let methodRange = match.rangeAtIndex(3) - let otherRange = match.rangeAtIndex(4) + let prefixRange = match.rangeAt(1) + let subjectRange = match.rangeAt(2) + let methodRange = match.rangeAt(3) + let otherRange = match.rangeAt(4) if prefixRange.length > 0 { - text += string.substringWithRange(prefixRange) + text += string.substring(with: prefixRange) } var subjectWithDot = subject + "." if subjectRange.length > 0 { - subjectWithDot = string.substringWithRange(subjectRange) + subjectWithDot = string.substring(with: subjectRange) } if methodRange.length > 0 { - let key = subjectWithDot.lowercaseString + string.substringWithRange(methodRange) + let key = subjectWithDot.lowercased() + string.substring(with: methodRange) text += fetch(key) } if otherRange.length > 0 { - text += string.substringWithRange(otherRange) + text += string.substring(with: otherRange) } } } catch {} @@ -108,9 +108,9 @@ public final class Parser { return text } - func getSubject(key: String) -> String { + func getSubject(_ key: String) -> String { var subject: String = "" - var parts = key.componentsSeparatedByString(".") + var parts = key.components(separatedBy: ".") if parts.count > 0 { subject = parts[0] @@ -123,8 +123,8 @@ public final class Parser { func loadData() { guard let localeData = provider.dataForLocale(locale), - parsedData = try? NSJSONSerialization.JSONObjectWithData(localeData, options: .AllowFragments), - json = parsedData as? [String: AnyObject] else { + let parsedData = try? JSONSerialization.jsonObject(with: localeData, options: .allowFragments), + let json = parsedData as? [String: AnyObject] else { if locale != Config.defaultLocale { locale = Config.defaultLocale } else { diff --git a/Source/Data/Provider.swift b/Source/Data/Provider.swift index 0f955fa..98eaff6 100644 --- a/Source/Data/Provider.swift +++ b/Source/Data/Provider.swift @@ -2,35 +2,35 @@ import Foundation public final class Provider { - var translations: [String: NSData] = [:] + var translations: [String: Data] = [:] // MARK: - Locale data - public func dataForLocale(locale: String) -> NSData? { - var translation: NSData? + public func dataForLocale(_ locale: String) -> Data? { + var translation: Data? if let translationData = translations[locale] { translation = translationData } else { - let bundle = NSBundle(forClass: Provider.self) - var path = bundle.pathForResource(locale, ofType: Config.pathExtension, inDirectory: Config.dirPath) + let bundle = Bundle(for: Provider.self) + var path = bundle.path(forResource: locale, ofType: Config.pathExtension, inDirectory: Config.dirPath) if path == nil { - path = bundle.pathForResource(locale, ofType: Config.pathExtension, inDirectory: Config.dirFrameworkPath) + path = bundle.path(forResource: locale, ofType: Config.pathExtension, inDirectory: Config.dirFrameworkPath) } - if let resourcePath = NSBundle(forClass: Provider.self).resourcePath { + if let resourcePath = Bundle(for: Provider.self).resourcePath { let bundlePath = resourcePath + "/Faker.bundle" - if let bundle = NSBundle(path: bundlePath) { - path = bundle.pathForResource(locale, ofType: Config.pathExtension) + if let bundle = Bundle(path: bundlePath) { + path = bundle.path(forResource: locale, ofType: Config.pathExtension) } } if let path = path, - fileURL: NSURL = NSURL(fileURLWithPath: path), - data = NSData(contentsOfURL: fileURL){ + let fileURL: URL = URL(fileURLWithPath: path), + let data = try? Data(contentsOf: fileURL){ translation = data translations[locale] = data } diff --git a/Source/Extensions/ArrayExtension.swift b/Source/Extensions/ArrayExtension.swift index bf27b9d..64e13f3 100644 --- a/Source/Extensions/ArrayExtension.swift +++ b/Source/Extensions/ArrayExtension.swift @@ -2,8 +2,8 @@ import Foundation extension Array { - func at(index: Int?) -> Element? { - guard let index = index where index >= 0 && index < endIndex else { + func at(_ index: Int?) -> Element? { + guard let index = index , index >= 0 && index < endIndex else { return nil } diff --git a/Source/Faker.swift b/Source/Faker.swift index f7b4d1b..7c8a4dd 100644 --- a/Source/Faker.swift +++ b/Source/Faker.swift @@ -1,6 +1,6 @@ -public class Faker { +open class Faker { - public var locale: String { + open var locale: String { didSet { if locale != oldValue { parser.locale = locale @@ -8,17 +8,17 @@ public class Faker { } } - public let address: Address - public let app: App - public let business: Business - public let company: Company - public let commerce: Commerce - public let internet: Internet - public let lorem: Lorem - public let name: Name - public let phoneNumber: PhoneNumber - public let team: Team - public let number: Number + open let address: Address + open let app: App + open let business: Business + open let company: Company + open let commerce: Commerce + open let internet: Internet + open let lorem: Lorem + open let name: Name + open let phoneNumber: PhoneNumber + open let team: Team + open let number: Number let parser: Parser diff --git a/Source/Generators/Address.swift b/Source/Generators/Address.swift index 3f9935e..ce48c38 100644 --- a/Source/Generators/Address.swift +++ b/Source/Generators/Address.swift @@ -1,20 +1,20 @@ import Foundation -public class Address: Generator { +open class Address: Generator { - public func city() -> String { + open func city() -> String { return generate("address.city") } - public func streetName() -> String { + open func streetName() -> String { return generate("address.street_name") } - public func secondaryAddress() -> String { + open func secondaryAddress() -> String { return numerify(generate("address.secondary_address")) } - public func streetAddress(includeSecondary includeSecondary: Bool = false) -> String { + open func streetAddress(includeSecondary: Bool = false) -> String { var streetAddress = numerify(generate("address.street_address")) if includeSecondary { @@ -24,11 +24,11 @@ public class Address: Generator { return streetAddress } - public func buildingNumber() -> String { + open func buildingNumber() -> String { return bothify(generate("address.building_number")) } - public func postcode(stateAbbreviation stateAbbreviation: String = "") -> String { + open func postcode(stateAbbreviation: String = "") -> String { if stateAbbreviation.isEmpty { return bothify(generate("address.postcode")) } @@ -36,47 +36,47 @@ public class Address: Generator { return bothify(generate("address.postcode_by_state.\(stateAbbreviation)")) } - public func timeZone() -> String { + open func timeZone() -> String { return generate("address.time_zone") } - public func streetSuffix() -> String { + open func streetSuffix() -> String { return generate("address.street_suffix") } - public func citySuffix() -> String { + open func citySuffix() -> String { return generate("address.city_suffix") } - public func cityPrefix() -> String { + open func cityPrefix() -> String { return generate("address.city_prefix") } - public func stateAbbreviation() -> String { + open func stateAbbreviation() -> String { return generate("address.state_abbr") } - public func state() -> String { + open func state() -> String { return generate("address.state") } - public func county() -> String { + open func county() -> String { return generate("address.county") } - public func country() -> String { + open func country() -> String { return generate("address.country") } - public func countryCode() -> String { + open func countryCode() -> String { return generate("address.country_code") } - public func latitude() -> Double { + open func latitude() -> Double { return drand48() * 180.0 - 90.0 } - public func longitude() -> Double { + open func longitude() -> Double { return drand48() * 360.0 - 180.0 } } diff --git a/Source/Generators/App.swift b/Source/Generators/App.swift index 01984a7..291d7de 100644 --- a/Source/Generators/App.swift +++ b/Source/Generators/App.swift @@ -1,14 +1,14 @@ -public class App: Generator { +open class App: Generator { - public func name() -> String { + open func name() -> String { return generate("app.name") } - public func version() -> String { + open func version() -> String { return numerify(generate("app.version")) } - public func author() -> String { + open func author() -> String { return generate("app.author") } } diff --git a/Source/Generators/Business.swift b/Source/Generators/Business.swift index 78b9872..1a037c7 100644 --- a/Source/Generators/Business.swift +++ b/Source/Generators/Business.swift @@ -1,17 +1,17 @@ import Foundation -public class Business: Generator { +open class Business: Generator { - public func creditCardNumber() -> String { + open func creditCardNumber() -> String { return generate("business.credit_card_numbers") } - public func creditCardType() -> String { + open func creditCardType() -> String { return generate("business.credit_card_types") } - public func creditCardExpiryDate() -> NSDate? { + open func creditCardExpiryDate() -> Date? { let dateString = generate("business.credit_card_expiry_dates") - return dateFormatter.dateFromString(dateString) + return dateFormatter.date(from: dateString) } } diff --git a/Source/Generators/Commerce.swift b/Source/Generators/Commerce.swift index bd296f2..2adf2ad 100644 --- a/Source/Generators/Commerce.swift +++ b/Source/Generators/Commerce.swift @@ -1,12 +1,12 @@ import Foundation -public class Commerce: Generator { +open class Commerce: Generator { - public func color() -> String { + open func color() -> String { return generate("commerce.color") } - public func department(maximum maximum: Int = 3, fixedAmount: Bool = false) -> String { + open func department(maximum: Int = 3, fixedAmount: Bool = false) -> String { let amount = fixedAmount ? maximum : 1 + Int(arc4random_uniform(UInt32(maximum))) let fetchedCategories = categories(amount) @@ -23,20 +23,20 @@ public class Commerce: Generator { return department } - public func productName() -> String { + open func productName() -> String { return generate("commerce.product_name.adjective") + " " + generate("commerce.product_name.material") + " " + generate("commerce.product_name.product") } - public func price() -> Double { + open func price() -> Double { let arc4randoMax:Double = 0x100000000 return floor(Double((Double(arc4random()) / arc4randoMax) * 100.0) * 100) / 100.0 } // MARK: - Helpers - func categories(amount: Int) -> [String] { + func categories(_ amount: Int) -> [String] { var categories: [String] = [] while categories.count < amount { @@ -50,9 +50,9 @@ public class Commerce: Generator { return categories } - func mergeCategories(categories: [String]) -> String { + func mergeCategories(_ categories: [String]) -> String { let separator = generate("separator") - let commaSeparated = categories[0.. String { + open func name() -> String { return generate("company.name") } - public func suffix() -> String { + open func suffix() -> String { return generate("company.suffix") } - public func catchPhrase() -> String { + open func catchPhrase() -> String { return randomWordsFromKey("company.buzzwords") } - public func bs() -> String { + open func bs() -> String { return randomWordsFromKey("company.bs") } - public func logo() -> String { + open func logo() -> String { let number = Int(arc4random_uniform(13)) + 1 return "http://pigment.github.io/fake-logos/logos/medium/color/\(number).png" } diff --git a/Source/Generators/Generator.swift b/Source/Generators/Generator.swift index f1eaf29..20ac18f 100644 --- a/Source/Generators/Generator.swift +++ b/Source/Generators/Generator.swift @@ -1,6 +1,6 @@ import Foundation -public class Generator { +open class Generator { public struct Constants { public static let uppercaseLetters = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters) @@ -9,25 +9,25 @@ public class Generator { } let parser: Parser - let dateFormatter: NSDateFormatter + let dateFormatter: DateFormatter public required init(parser: Parser) { self.parser = parser - dateFormatter = NSDateFormatter() + dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" } - public func generate(key: String) -> String { + open func generate(_ key: String) -> String { return parser.fetch(key) } // MARK: - Filling - public func numerify(string: String) -> String { + open func numerify(_ string: String) -> String { let count = UInt32(Constants.numbers.count) - return String(string.characters.enumerate().map { (index, item) in + return String(string.characters.enumerated().map { (index, item) in let numberIndex = index == 0 ? arc4random_uniform(count - 1) : arc4random_uniform(count) let char = Constants.numbers[Int(numberIndex)] @@ -35,26 +35,26 @@ public class Generator { }) } - public func letterify(string: String) -> String { - return String(string.characters.enumerate().map { (index, item) in + open func letterify(_ string: String) -> String { + return String(string.characters.enumerated().map { (index, item) in let count = UInt32(Constants.uppercaseLetters.count) let char = Constants.uppercaseLetters[Int(arc4random_uniform(count))] return String(item) == "?" ? char : item }) } - public func bothify(string: String) -> String { + open func bothify(_ string: String) -> String { return letterify(numerify(string)) } - public func alphaNumerify(string: String) -> String { - return string.stringByReplacingOccurrencesOfString("[^A-Za-z0-9_]", - withString: "", - options: .RegularExpressionSearch, + open func alphaNumerify(_ string: String) -> String { + return string.replacingOccurrences(of: "[^A-Za-z0-9_]", + with: "", + options: .regularExpression, range: nil) } - public func randomWordsFromKey(key: String) -> String { + open func randomWordsFromKey(_ key: String) -> String { var string = "" var list = [String]() @@ -65,7 +65,7 @@ public class Generator { } } - string = list.joinWithSeparator(" ") + string = list.joined(separator: " ") } return string diff --git a/Source/Generators/Internet.swift b/Source/Generators/Internet.swift index df3aae9..2cc2c09 100644 --- a/Source/Generators/Internet.swift +++ b/Source/Generators/Internet.swift @@ -1,6 +1,6 @@ import Foundation -public class Internet: Generator { +open class Internet: Generator { let lorem: Lorem @@ -9,7 +9,7 @@ public class Internet: Generator { super.init(parser: parser) } - public func username(separator separator: String? = nil) -> String { + open func username(separator: String? = nil) -> String { var components: [String] = [ generate("name.first_name"), generate("name.last_name"), @@ -25,16 +25,15 @@ public class Internet: Generator { } return components[0.. String { + open func domainName(_ alphaNumericOnly: Bool = true) -> String { return domainWord(alphaNumericOnly: alphaNumericOnly) + "." + domainSuffix() } - public func domainWord(alphaNumericOnly alphaNumericOnly: Bool = true) -> String { - let nameParts = generate("company.name").componentsSeparatedByString(" ") + open func domainWord(alphaNumericOnly: Bool = true) -> String { + let nameParts = generate("company.name").components(separatedBy: " ") var name = "" if let first = nameParts.first { @@ -45,30 +44,30 @@ public class Internet: Generator { let result = alphaNumericOnly ? alphaNumerify(name) : name - return result.lowercaseString + return result.lowercased() } - public func domainSuffix() -> String { + open func domainSuffix() -> String { return generate("internet.domain_suffix") } - public func email() -> String { - return [username(), domainName()].joinWithSeparator("@") + open func email() -> String { + return [username(), domainName()].joined(separator: "@") } - public func freeEmail() -> String { - return [username(), generate("internet.free_email")].joinWithSeparator("@") + open func freeEmail() -> String { + return [username(), generate("internet.free_email")].joined(separator: "@") } - public func safeEmail() -> String { + open func safeEmail() -> String { let topLevelDomains = ["org", "com", "net"] let count = UInt32(topLevelDomains.count) let topLevelDomain = topLevelDomains[Int(arc4random_uniform(count))] - return [username(), "example." + topLevelDomain].joinWithSeparator("@") + return [username(), "example." + topLevelDomain].joined(separator: "@") } - public func password(minimumLength minimumLength: Int = 8, maximumLength: Int = 16) -> String { + open func password(minimumLength: Int = 8, maximumLength: Int = 16) -> String { var temp = lorem.characters(amount: minimumLength) let diffLength = maximumLength - minimumLength @@ -80,7 +79,7 @@ public class Internet: Generator { return temp } - public func ipV4Address() -> String { + open func ipV4Address() -> String { let ipRand = { 2 + arc4random() % 253 } @@ -88,25 +87,25 @@ public class Internet: Generator { return String(format: "%d.%d.%d.%d", ipRand(), ipRand(), ipRand(), ipRand()) } - public func ipV6Address() -> String { + open func ipV6Address() -> String { var components: [String] = [] for _ in 1..<8 { components.append(String(format: "%X", arc4random() % 65535)) } - return components.joinWithSeparator(":") + return components.joined(separator: ":") } - public func url() -> String { + open func url() -> String { return "http://\(domainName())/\(username())" } - public func image(width width: Int = 320, height: Int = 200) -> String { + open func image(width: Int = 320, height: Int = 200) -> String { return "http://lorempixel.com/\(width)/\(height)" } - public func templateImage(width width: Int = 320, height: Int = 200, + open func templateImage(width: Int = 320, height: Int = 200, backColorHex: String = "000000", frontColorHex: String = "ffffff") -> String { return "http://dummyimage.com/\(width)x\(height)/\(backColorHex)/\(frontColorHex)" } diff --git a/Source/Generators/Lorem.swift b/Source/Generators/Lorem.swift index 024c084..ac49047 100644 --- a/Source/Generators/Lorem.swift +++ b/Source/Generators/Lorem.swift @@ -1,31 +1,31 @@ import Foundation -public class Lorem: Generator { +open class Lorem: Generator { - public func word() -> String { + open func word() -> String { return generate("lorem.words") } - public func words(amount amount: Int = 3) -> String { + open func words(amount: Int = 3) -> String { var words: [String] = [] for _ in 0.. String { + open func character() -> String { return characters(amount: 1) } - public func characters(amount amount: Int = 255) -> String { + open func characters(amount: Int = 255) -> String { var chars = "" if amount > 0 { for _ in 0.. String { + open func sentence(wordsAmount: Int = 4) -> String { var sentence = words(amount: wordsAmount) + "." - sentence.replaceRange(sentence.startIndex...sentence.startIndex, - with: String(sentence[sentence.startIndex]).capitalizedString) + sentence.replaceSubrange(sentence.startIndex...sentence.startIndex, + with: String(sentence[sentence.startIndex]).capitalized) return sentence } - public func sentences(amount amount: Int = 3) -> String { + open func sentences(amount: Int = 3) -> String { var sentences: [String] = [] for _ in 0.. String { + open func paragraph(sentencesAmount: Int = 3) -> String { return sentences(amount: sentencesAmount) } - public func paragraphs(amount amount: Int = 3) -> String { + open func paragraphs(amount: Int = 3) -> String { var paragraphs: [String] = [] for _ in 0.. String { + open func name() -> String { return generate("name.name") } - public func firstName() -> String { + open func firstName() -> String { return generate("name.first_name") } - public func lastName() -> String { + open func lastName() -> String { return generate("name.last_name") } - public func prefix() -> String { + open func prefix() -> String { return generate("name.prefix") } - public func suffix() -> String { + open func suffix() -> String { return generate("name.suffix") } - public func title() -> String { + open func title() -> String { return generate("name.title.descriptor") + " " + generate("name.title.level") + " " + generate("name.title.job") diff --git a/Source/Generators/Number.swift b/Source/Generators/Number.swift index 3dc145c..3aec18a 100644 --- a/Source/Generators/Number.swift +++ b/Source/Generators/Number.swift @@ -1,31 +1,31 @@ import Foundation import CoreGraphics -public class Number { +open class Number { - private var lastUsedId: Int64 = 0 + fileprivate var lastUsedId: Int64 = 0 - public func randomBool() -> Bool { + open func randomBool() -> Bool { return randomInt() % 2 == 0 } - public func randomInt(min min: Int = 0, max: Int = 1000) -> Int { + open func randomInt(min: Int = 0, max: Int = 1000) -> Int { return min + Int(arc4random_uniform(UInt32(max - min + 1))) } - public func randomFloat(min min: Float = 0, max: Float = 1000) -> Float { + open func randomFloat(min: Float = 0, max: Float = 1000) -> Float { return (Float(arc4random()) / Float(UInt32.max)) * (max - min) + min } - public func randomCGFloat(min min: CGFloat = 0, max: CGFloat = 1000) -> CGFloat { + open func randomCGFloat(min: CGFloat = 0, max: CGFloat = 1000) -> CGFloat { return CGFloat(Float(arc4random()) / Float(UInt32.max)) * (max - min) + min } - public func randomDouble(min min: Double = 0, max: Double = 1000) -> Double { + open func randomDouble(min: Double = 0, max: Double = 1000) -> Double { return (Double(arc4random()) / Double(UInt32.max)) * (max - min) + min } - public func increasingUniqueId() -> Int { + open func increasingUniqueId() -> Int { OSAtomicIncrement64(&lastUsedId) return Int(lastUsedId) } diff --git a/Source/Generators/PhoneNumber.swift b/Source/Generators/PhoneNumber.swift index 75d45e5..a66e228 100644 --- a/Source/Generators/PhoneNumber.swift +++ b/Source/Generators/PhoneNumber.swift @@ -1,29 +1,29 @@ -public class PhoneNumber: Generator { +open class PhoneNumber: Generator { - public func phoneNumber() -> String { + open func phoneNumber() -> String { return numerify(generate("phone_number.formats")) } - public func cellPhone() -> String { + open func cellPhone() -> String { return numerify(generate("cell_phone.formats")) } // US only - public func areaCode() -> String { + open func areaCode() -> String { return generate("phone_number.area_code") } // US only - public func exchangeCode() -> String { + open func exchangeCode() -> String { return generate("phone_number.exchange_code") } // US only - public func subscriberNumber() -> String { + open func subscriberNumber() -> String { return numerify("####") } - public func numberExtension(length: Int) -> String { + open func numberExtension(_ length: Int) -> String { var template = "" for _ in 1...length { diff --git a/Source/Generators/Team.swift b/Source/Generators/Team.swift index 28a4769..2a61514 100644 --- a/Source/Generators/Team.swift +++ b/Source/Generators/Team.swift @@ -1,14 +1,14 @@ -public class Team: Generator { +open class Team: Generator { - public func name() -> String { + open func name() -> String { return generate("team.name") } - public func creature() -> String { + open func creature() -> String { return generate("team.creature") } - public func state() -> String { - return generate("address.state").capitalizedString + open func state() -> String { + return generate("address.state").capitalized } } diff --git a/Tests/Fakery/Generators/BusinessSpec.swift b/Tests/Fakery/Generators/BusinessSpec.swift index ebde1b2..808b1d1 100644 --- a/Tests/Fakery/Generators/BusinessSpec.swift +++ b/Tests/Fakery/Generators/BusinessSpec.swift @@ -32,7 +32,7 @@ class BusinessSpec: QuickSpec { let creditCardExpiryDate = business.creditCardExpiryDate() expect(creditCardExpiryDate).notTo(beNil()) if let date = creditCardExpiryDate { - let dateString = business.dateFormatter.stringFromDate(date) + let dateString = business.dateFormatter.string(from: date) expect(dateString).to(equal("2020-10-12")) } } diff --git a/Tests/Fakery/Generators/CommerceSpec.swift b/Tests/Fakery/Generators/CommerceSpec.swift index 969fe44..a2f5b65 100644 --- a/Tests/Fakery/Generators/CommerceSpec.swift +++ b/Tests/Fakery/Generators/CommerceSpec.swift @@ -23,10 +23,10 @@ class CommerceSpec: QuickSpec { describe("#department") { it("generates the correct text") { let department = commerce.department(maximum: 3, fixedAmount: true) - expect(department.rangeOfString("Music")).notTo(beNil()) - expect(department.rangeOfString("Video")).notTo(beNil()) - expect(department.rangeOfString("Development")).notTo(beNil()) - expect(department.rangeOfString("&")).notTo(beNil()) + expect(department.range(of: "Music")).notTo(beNil()) + expect(department.range(of: "Video")).notTo(beNil()) + expect(department.range(of: "Development")).notTo(beNil()) + expect(department.range(of: "&")).notTo(beNil()) expect(department).to(match("^[A-Za-z]+, [A-Za-z]+ & [A-Za-z]+$")) } } diff --git a/Tests/Fakery/Generators/GeneratorSpec.swift b/Tests/Fakery/Generators/GeneratorSpec.swift index df6d1e5..c8e140a 100644 --- a/Tests/Fakery/Generators/GeneratorSpec.swift +++ b/Tests/Fakery/Generators/GeneratorSpec.swift @@ -22,7 +22,7 @@ class GeneratorSpec: QuickSpec { it("replaces # with random numbers") { let numerified = generator.numerify("12####") expect(Int(numerified)).notTo(beNil()) - expect(numerified.containsString("#")).to(beFalse()) + expect(numerified.contains("#")).to(beFalse()) expect(numerified).to(match("^12\\d{4}$")) } } @@ -30,7 +30,7 @@ class GeneratorSpec: QuickSpec { describe("#letterify") { it("replaces ? with random letters") { let letterified = generator.letterify("This is awes?me") - expect(letterified.containsString("?")).to(beFalse()) + expect(letterified.contains("?")).to(beFalse()) expect(letterified).to(match("^This is awes[A-Za-z]me$")) } } @@ -38,8 +38,8 @@ class GeneratorSpec: QuickSpec { describe("#bothify") { it("replaces # with random numbers and ? with random letters") { let bothified = generator.bothify("#th of ?pril") - expect(bothified.containsString("#")).to(beFalse()) - expect(bothified.containsString("?")).to(beFalse()) + expect(bothified.contains("#")).to(beFalse()) + expect(bothified.contains("?")).to(beFalse()) expect(bothified).to(match("^\\dth of [A-Za-z]pril$")) } } diff --git a/Tests/Fakery/Generators/InternetSpec.swift b/Tests/Fakery/Generators/InternetSpec.swift index 601b8eb..e0f8a45 100644 --- a/Tests/Fakery/Generators/InternetSpec.swift +++ b/Tests/Fakery/Generators/InternetSpec.swift @@ -25,17 +25,17 @@ class InternetSpec: QuickSpec { context("with provided separator") { it("returns the correct text") { let username = internet.username(separator: "_") - if username.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 5 { - expect(username.containsString("_")).notTo(beNil()) + if username.lengthOfBytes(using: String.Encoding.utf8) > 5 { + expect(username.contains("_")).notTo(beNil()) } else { - expect(username.containsString("_")).to(beNil()) + expect(username.contains("_")).to(beNil()) } } } it("doesn't have the ' symbol in the result") { let username = internet.username(separator: "'_'") - expect(username.containsString("'")).to(beFalse()) + expect(username.contains("'")).to(beFalse()) } } @@ -87,7 +87,7 @@ class InternetSpec: QuickSpec { context("without min and max - 8...16 by default") { it("returns the correct password") { let password = internet.password() - let length = password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) + let length = password.lengthOfBytes(using: String.Encoding.utf8) expect(length >= 8 && length <= 16).to(beTrue()) } } @@ -95,19 +95,19 @@ class InternetSpec: QuickSpec { context("with provided min length and max length") { it("returns the correct password when min = max") { let password = internet.password(minimumLength: 3, maximumLength: 3) - let length = password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) + let length = password.lengthOfBytes(using: String.Encoding.utf8) expect(length == 3).to(beTrue()) } it("returns the correct password when min > max") { let password = internet.password(minimumLength: 3, maximumLength: 4) - let length = password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) + let length = password.lengthOfBytes(using: String.Encoding.utf8) expect(length >= 3 && length <= 4).to(beTrue()) } it("returns the correct password when min < max") { let password = internet.password(minimumLength: 4, maximumLength: 3) - let length = password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) + let length = password.lengthOfBytes(using: String.Encoding.utf8) expect(length == 4).to(beTrue()) } } From 65f8afbeb2b594378fd02ea69f20f52b3faaa100 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:10:01 +0200 Subject: [PATCH 2/9] Refactor code --- Cartfile.private | 4 +-- Cartfile.resolved | 4 +-- Fakery.xcodeproj/project.pbxproj | 15 ++++++-- .../xcschemes/Fakery-Mac.xcscheme | 2 +- .../xcschemes/Fakery-iOS.xcscheme | 2 +- .../xcschemes/Fakery-tvOS.xcscheme | 2 +- Source/Data/Parser.swift | 23 +++++++----- Source/Data/Provider.swift | 8 +++-- Source/Faker.swift | 26 +++++++------- Source/Generators/Address.swift | 36 +++++++++---------- Source/Generators/App.swift | 8 ++--- Source/Generators/Business.swift | 8 ++--- Source/Generators/Commerce.swift | 16 ++++----- Source/Generators/Company.swift | 12 +++---- Source/Generators/Generator.swift | 14 ++++---- Source/Generators/Internet.swift | 33 ++++++++--------- Source/Generators/Lorem.swift | 18 +++++----- Source/Generators/Name.swift | 14 ++++---- Source/Generators/Number.swift | 14 ++++---- Source/Generators/PhoneNumber.swift | 14 ++++---- Source/Generators/Team.swift | 8 ++--- Tests/Fakery/Data/ParserSpec.swift | 2 +- Tests/Fakery/Generators/CommerceSpec.swift | 4 +-- 23 files changed, 153 insertions(+), 134 deletions(-) diff --git a/Cartfile.private b/Cartfile.private index 3381bec..c2786fb 100644 --- a/Cartfile.private +++ b/Cartfile.private @@ -1,2 +1,2 @@ -github "Quick/Quick" "v0.9.2" -github "Quick/Nimble" "v4.0.0" +github "Quick/Quick" +github "Quick/Nimble" diff --git a/Cartfile.resolved b/Cartfile.resolved index 35cc93d..06a76c1 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,2 +1,2 @@ -github "Quick/Nimble" "v4.0.0" -github "Quick/Quick" "v0.9.2" +github "Quick/Nimble" "v5.0.0" +github "Quick/Quick" "v0.10.0" diff --git a/Fakery.xcodeproj/project.pbxproj b/Fakery.xcodeproj/project.pbxproj index 4b87e65..f8e8e20 100644 --- a/Fakery.xcodeproj/project.pbxproj +++ b/Fakery.xcodeproj/project.pbxproj @@ -591,7 +591,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Vadym Markov"; TargetAttributes = { BC827FA71BFA3CE1005F09A4 = { @@ -917,7 +917,7 @@ BC827FB91BFA3CE1005F09A4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -940,7 +940,7 @@ BC827FBA1BFA3CE1005F09A4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1005,8 +1005,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -1054,8 +1056,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -1076,6 +1080,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1086,6 +1091,7 @@ BCF0DF4F1BF9F77E00427DB4 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1103,6 +1109,7 @@ BCF0DF501BF9F77E00427DB4 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1143,6 +1150,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1164,6 +1172,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; diff --git a/Fakery.xcodeproj/xcshareddata/xcschemes/Fakery-Mac.xcscheme b/Fakery.xcodeproj/xcshareddata/xcschemes/Fakery-Mac.xcscheme index 1dfad6c..10e5e10 100644 --- a/Fakery.xcodeproj/xcshareddata/xcschemes/Fakery-Mac.xcscheme +++ b/Fakery.xcodeproj/xcshareddata/xcschemes/Fakery-Mac.xcscheme @@ -1,6 +1,6 @@ AnyObject? { + public func fetchRaw(_ key: String) -> Any? { let parts = key.components(separatedBy: ".") - guard let localeData = data[locale], var parsed = localeData["faker"] , !parts.isEmpty else { - return nil - } + guard let localeData = data[locale] as? [String: Any], + var parsed = localeData["faker"] as? [String: Any], + !parts.isEmpty else { return nil } + + var result: Any? for part in parts { - guard let parsedPart = parsed?[part] else { continue } + guard let parsedPart = parsed[part] as? [String: Any] else { + result = parsed[part] + continue + } + parsed = parsedPart + result = parsedPart } - return parsed as AnyObject? + return result } func parse(_ template: String, forSubject subject: String) -> String { @@ -124,7 +131,7 @@ public final class Parser { func loadData() { guard let localeData = provider.dataForLocale(locale), let parsedData = try? JSONSerialization.jsonObject(with: localeData, options: .allowFragments), - let json = parsedData as? [String: AnyObject] else { + let json = parsedData as? [String: Any] else { if locale != Config.defaultLocale { locale = Config.defaultLocale } else { diff --git a/Source/Data/Provider.swift b/Source/Data/Provider.swift index 98eaff6..77162f8 100644 --- a/Source/Data/Provider.swift +++ b/Source/Data/Provider.swift @@ -28,11 +28,13 @@ public final class Provider { } - if let path = path, - let fileURL: URL = URL(fileURLWithPath: path), - let data = try? Data(contentsOf: fileURL){ + if let path = path { + let fileURL = URL(fileURLWithPath: path) + + if let data = try? Data(contentsOf: fileURL) { translation = data translations[locale] = data + } } } diff --git a/Source/Faker.swift b/Source/Faker.swift index 7c8a4dd..f594a67 100644 --- a/Source/Faker.swift +++ b/Source/Faker.swift @@ -1,6 +1,6 @@ -open class Faker { +public final class Faker { - open var locale: String { + public var locale: String { didSet { if locale != oldValue { parser.locale = locale @@ -8,17 +8,17 @@ open class Faker { } } - open let address: Address - open let app: App - open let business: Business - open let company: Company - open let commerce: Commerce - open let internet: Internet - open let lorem: Lorem - open let name: Name - open let phoneNumber: PhoneNumber - open let team: Team - open let number: Number + public let address: Address + public let app: App + public let business: Business + public let company: Company + public let commerce: Commerce + public let internet: Internet + public let lorem: Lorem + public let name: Name + public let phoneNumber: PhoneNumber + public let team: Team + public let number: Number let parser: Parser diff --git a/Source/Generators/Address.swift b/Source/Generators/Address.swift index ce48c38..a040d21 100644 --- a/Source/Generators/Address.swift +++ b/Source/Generators/Address.swift @@ -1,20 +1,20 @@ import Foundation -open class Address: Generator { +public final class Address: Generator { - open func city() -> String { + public func city() -> String { return generate("address.city") } - open func streetName() -> String { + public func streetName() -> String { return generate("address.street_name") } - open func secondaryAddress() -> String { + public func secondaryAddress() -> String { return numerify(generate("address.secondary_address")) } - open func streetAddress(includeSecondary: Bool = false) -> String { + public func streetAddress(includeSecondary: Bool = false) -> String { var streetAddress = numerify(generate("address.street_address")) if includeSecondary { @@ -24,11 +24,11 @@ open class Address: Generator { return streetAddress } - open func buildingNumber() -> String { + public func buildingNumber() -> String { return bothify(generate("address.building_number")) } - open func postcode(stateAbbreviation: String = "") -> String { + public func postcode(stateAbbreviation: String = "") -> String { if stateAbbreviation.isEmpty { return bothify(generate("address.postcode")) } @@ -36,47 +36,47 @@ open class Address: Generator { return bothify(generate("address.postcode_by_state.\(stateAbbreviation)")) } - open func timeZone() -> String { + public func timeZone() -> String { return generate("address.time_zone") } - open func streetSuffix() -> String { + public func streetSuffix() -> String { return generate("address.street_suffix") } - open func citySuffix() -> String { + public func citySuffix() -> String { return generate("address.city_suffix") } - open func cityPrefix() -> String { + public func cityPrefix() -> String { return generate("address.city_prefix") } - open func stateAbbreviation() -> String { + public func stateAbbreviation() -> String { return generate("address.state_abbr") } - open func state() -> String { + public func state() -> String { return generate("address.state") } - open func county() -> String { + public func county() -> String { return generate("address.county") } - open func country() -> String { + public func country() -> String { return generate("address.country") } - open func countryCode() -> String { + public func countryCode() -> String { return generate("address.country_code") } - open func latitude() -> Double { + public func latitude() -> Double { return drand48() * 180.0 - 90.0 } - open func longitude() -> Double { + public func longitude() -> Double { return drand48() * 360.0 - 180.0 } } diff --git a/Source/Generators/App.swift b/Source/Generators/App.swift index 291d7de..f722248 100644 --- a/Source/Generators/App.swift +++ b/Source/Generators/App.swift @@ -1,14 +1,14 @@ -open class App: Generator { +public final class App: Generator { - open func name() -> String { + public func name() -> String { return generate("app.name") } - open func version() -> String { + public func version() -> String { return numerify(generate("app.version")) } - open func author() -> String { + public func author() -> String { return generate("app.author") } } diff --git a/Source/Generators/Business.swift b/Source/Generators/Business.swift index 1a037c7..5d64b63 100644 --- a/Source/Generators/Business.swift +++ b/Source/Generators/Business.swift @@ -1,16 +1,16 @@ import Foundation -open class Business: Generator { +public final class Business: Generator { - open func creditCardNumber() -> String { + public func creditCardNumber() -> String { return generate("business.credit_card_numbers") } - open func creditCardType() -> String { + public func creditCardType() -> String { return generate("business.credit_card_types") } - open func creditCardExpiryDate() -> Date? { + public func creditCardExpiryDate() -> Date? { let dateString = generate("business.credit_card_expiry_dates") return dateFormatter.date(from: dateString) } diff --git a/Source/Generators/Commerce.swift b/Source/Generators/Commerce.swift index 2adf2ad..00002b4 100644 --- a/Source/Generators/Commerce.swift +++ b/Source/Generators/Commerce.swift @@ -1,12 +1,12 @@ import Foundation -open class Commerce: Generator { +public final class Commerce: Generator { - open func color() -> String { + public func color() -> String { return generate("commerce.color") } - open func department(maximum: Int = 3, fixedAmount: Bool = false) -> String { + public func department(maximum: Int = 3, fixedAmount: Bool = false) -> String { let amount = fixedAmount ? maximum : 1 + Int(arc4random_uniform(UInt32(maximum))) let fetchedCategories = categories(amount) @@ -15,7 +15,7 @@ open class Commerce: Generator { var department = "" if count > 1 { - department = mergeCategories(fetchedCategories) + department = merge(categories: fetchedCategories) } else if count == 1 { department = fetchedCategories[0] } @@ -23,20 +23,20 @@ open class Commerce: Generator { return department } - open func productName() -> String { + public func productName() -> String { return generate("commerce.product_name.adjective") + " " + generate("commerce.product_name.material") + " " + generate("commerce.product_name.product") } - open func price() -> Double { + public func price() -> Double { let arc4randoMax:Double = 0x100000000 return floor(Double((Double(arc4random()) / arc4randoMax) * 100.0) * 100) / 100.0 } // MARK: - Helpers - func categories(_ amount: Int) -> [String] { + public func categories(_ amount: Int) -> [String] { var categories: [String] = [] while categories.count < amount { @@ -50,7 +50,7 @@ open class Commerce: Generator { return categories } - func mergeCategories(_ categories: [String]) -> String { + public func merge(categories: [String]) -> String { let separator = generate("separator") let commaSeparated = categories[0.. String { + public func name() -> String { return generate("company.name") } - open func suffix() -> String { + public func suffix() -> String { return generate("company.suffix") } - open func catchPhrase() -> String { + public func catchPhrase() -> String { return randomWordsFromKey("company.buzzwords") } - open func bs() -> String { + public func bs() -> String { return randomWordsFromKey("company.bs") } - open func logo() -> String { + public func logo() -> String { let number = Int(arc4random_uniform(13)) + 1 return "http://pigment.github.io/fake-logos/logos/medium/color/\(number).png" } diff --git a/Source/Generators/Generator.swift b/Source/Generators/Generator.swift index 20ac18f..acab314 100644 --- a/Source/Generators/Generator.swift +++ b/Source/Generators/Generator.swift @@ -1,6 +1,6 @@ import Foundation -open class Generator { +public class Generator { public struct Constants { public static let uppercaseLetters = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters) @@ -18,13 +18,13 @@ open class Generator { dateFormatter.dateFormat = "yyyy-MM-dd" } - open func generate(_ key: String) -> String { + public func generate(_ key: String) -> String { return parser.fetch(key) } // MARK: - Filling - open func numerify(_ string: String) -> String { + public func numerify(_ string: String) -> String { let count = UInt32(Constants.numbers.count) return String(string.characters.enumerated().map { (index, item) in @@ -35,7 +35,7 @@ open class Generator { }) } - open func letterify(_ string: String) -> String { + public func letterify(_ string: String) -> String { return String(string.characters.enumerated().map { (index, item) in let count = UInt32(Constants.uppercaseLetters.count) let char = Constants.uppercaseLetters[Int(arc4random_uniform(count))] @@ -43,18 +43,18 @@ open class Generator { }) } - open func bothify(_ string: String) -> String { + public func bothify(_ string: String) -> String { return letterify(numerify(string)) } - open func alphaNumerify(_ string: String) -> String { + public func alphaNumerify(_ string: String) -> String { return string.replacingOccurrences(of: "[^A-Za-z0-9_]", with: "", options: .regularExpression, range: nil) } - open func randomWordsFromKey(_ key: String) -> String { + public func randomWordsFromKey(_ key: String) -> String { var string = "" var list = [String]() diff --git a/Source/Generators/Internet.swift b/Source/Generators/Internet.swift index 2cc2c09..c0bd5f9 100644 --- a/Source/Generators/Internet.swift +++ b/Source/Generators/Internet.swift @@ -1,6 +1,6 @@ import Foundation -open class Internet: Generator { +public final class Internet: Generator { let lorem: Lorem @@ -9,7 +9,7 @@ open class Internet: Generator { super.init(parser: parser) } - open func username(separator: String? = nil) -> String { + public func username(separator: String? = nil) -> String { var components: [String] = [ generate("name.first_name"), generate("name.last_name"), @@ -24,15 +24,16 @@ open class Internet: Generator { gap = sep } - return components[0.. String { + public func domainName(_ alphaNumericOnly: Bool = true) -> String { return domainWord(alphaNumericOnly: alphaNumericOnly) + "." + domainSuffix() } - open func domainWord(alphaNumericOnly: Bool = true) -> String { + public func domainWord(alphaNumericOnly: Bool = true) -> String { let nameParts = generate("company.name").components(separatedBy: " ") var name = "" @@ -47,19 +48,19 @@ open class Internet: Generator { return result.lowercased() } - open func domainSuffix() -> String { + public func domainSuffix() -> String { return generate("internet.domain_suffix") } - open func email() -> String { + public func email() -> String { return [username(), domainName()].joined(separator: "@") } - open func freeEmail() -> String { + public func freeEmail() -> String { return [username(), generate("internet.free_email")].joined(separator: "@") } - open func safeEmail() -> String { + public func safeEmail() -> String { let topLevelDomains = ["org", "com", "net"] let count = UInt32(topLevelDomains.count) let topLevelDomain = topLevelDomains[Int(arc4random_uniform(count))] @@ -67,7 +68,7 @@ open class Internet: Generator { return [username(), "example." + topLevelDomain].joined(separator: "@") } - open func password(minimumLength: Int = 8, maximumLength: Int = 16) -> String { + public func password(minimumLength: Int = 8, maximumLength: Int = 16) -> String { var temp = lorem.characters(amount: minimumLength) let diffLength = maximumLength - minimumLength @@ -79,7 +80,7 @@ open class Internet: Generator { return temp } - open func ipV4Address() -> String { + public func ipV4Address() -> String { let ipRand = { 2 + arc4random() % 253 } @@ -87,7 +88,7 @@ open class Internet: Generator { return String(format: "%d.%d.%d.%d", ipRand(), ipRand(), ipRand(), ipRand()) } - open func ipV6Address() -> String { + public func ipV6Address() -> String { var components: [String] = [] for _ in 1..<8 { @@ -97,15 +98,15 @@ open class Internet: Generator { return components.joined(separator: ":") } - open func url() -> String { + public func url() -> String { return "http://\(domainName())/\(username())" } - open func image(width: Int = 320, height: Int = 200) -> String { + public func image(width: Int = 320, height: Int = 200) -> String { return "http://lorempixel.com/\(width)/\(height)" } - open func templateImage(width: Int = 320, height: Int = 200, + public func templateImage(width: Int = 320, height: Int = 200, backColorHex: String = "000000", frontColorHex: String = "ffffff") -> String { return "http://dummyimage.com/\(width)x\(height)/\(backColorHex)/\(frontColorHex)" } diff --git a/Source/Generators/Lorem.swift b/Source/Generators/Lorem.swift index ac49047..69595c0 100644 --- a/Source/Generators/Lorem.swift +++ b/Source/Generators/Lorem.swift @@ -1,12 +1,12 @@ import Foundation -open class Lorem: Generator { +public final class Lorem: Generator { - open func word() -> String { + public func word() -> String { return generate("lorem.words") } - open func words(amount: Int = 3) -> String { + public func words(amount: Int = 3) -> String { var words: [String] = [] for _ in 0.. String { + public func character() -> String { return characters(amount: 1) } - open func characters(amount: Int = 255) -> String { + public func characters(amount: Int = 255) -> String { var chars = "" if amount > 0 { @@ -33,14 +33,14 @@ open class Lorem: Generator { return chars } - open func sentence(wordsAmount: Int = 4) -> String { + public func sentence(wordsAmount: Int = 4) -> String { var sentence = words(amount: wordsAmount) + "." sentence.replaceSubrange(sentence.startIndex...sentence.startIndex, with: String(sentence[sentence.startIndex]).capitalized) return sentence } - open func sentences(amount: Int = 3) -> String { + public func sentences(amount: Int = 3) -> String { var sentences: [String] = [] for _ in 0.. String { + public func paragraph(sentencesAmount: Int = 3) -> String { return sentences(amount: sentencesAmount) } - open func paragraphs(amount: Int = 3) -> String { + public func paragraphs(amount: Int = 3) -> String { var paragraphs: [String] = [] for _ in 0.. String { + public func name() -> String { return generate("name.name") } - open func firstName() -> String { + public func firstName() -> String { return generate("name.first_name") } - open func lastName() -> String { + public func lastName() -> String { return generate("name.last_name") } - open func prefix() -> String { + public func prefix() -> String { return generate("name.prefix") } - open func suffix() -> String { + public func suffix() -> String { return generate("name.suffix") } - open func title() -> String { + public func title() -> String { return generate("name.title.descriptor") + " " + generate("name.title.level") + " " + generate("name.title.job") diff --git a/Source/Generators/Number.swift b/Source/Generators/Number.swift index 3aec18a..9ce6e11 100644 --- a/Source/Generators/Number.swift +++ b/Source/Generators/Number.swift @@ -1,31 +1,31 @@ import Foundation import CoreGraphics -open class Number { +public final class Number { fileprivate var lastUsedId: Int64 = 0 - open func randomBool() -> Bool { + public func randomBool() -> Bool { return randomInt() % 2 == 0 } - open func randomInt(min: Int = 0, max: Int = 1000) -> Int { + public func randomInt(min: Int = 0, max: Int = 1000) -> Int { return min + Int(arc4random_uniform(UInt32(max - min + 1))) } - open func randomFloat(min: Float = 0, max: Float = 1000) -> Float { + public func randomFloat(min: Float = 0, max: Float = 1000) -> Float { return (Float(arc4random()) / Float(UInt32.max)) * (max - min) + min } - open func randomCGFloat(min: CGFloat = 0, max: CGFloat = 1000) -> CGFloat { + public func randomCGFloat(min: CGFloat = 0, max: CGFloat = 1000) -> CGFloat { return CGFloat(Float(arc4random()) / Float(UInt32.max)) * (max - min) + min } - open func randomDouble(min: Double = 0, max: Double = 1000) -> Double { + public func randomDouble(min: Double = 0, max: Double = 1000) -> Double { return (Double(arc4random()) / Double(UInt32.max)) * (max - min) + min } - open func increasingUniqueId() -> Int { + public func increasingUniqueId() -> Int { OSAtomicIncrement64(&lastUsedId) return Int(lastUsedId) } diff --git a/Source/Generators/PhoneNumber.swift b/Source/Generators/PhoneNumber.swift index a66e228..59d4cb0 100644 --- a/Source/Generators/PhoneNumber.swift +++ b/Source/Generators/PhoneNumber.swift @@ -1,29 +1,29 @@ -open class PhoneNumber: Generator { +public final class PhoneNumber: Generator { - open func phoneNumber() -> String { + public func phoneNumber() -> String { return numerify(generate("phone_number.formats")) } - open func cellPhone() -> String { + public func cellPhone() -> String { return numerify(generate("cell_phone.formats")) } // US only - open func areaCode() -> String { + public func areaCode() -> String { return generate("phone_number.area_code") } // US only - open func exchangeCode() -> String { + public func exchangeCode() -> String { return generate("phone_number.exchange_code") } // US only - open func subscriberNumber() -> String { + public func subscriberNumber() -> String { return numerify("####") } - open func numberExtension(_ length: Int) -> String { + public func numberExtension(_ length: Int) -> String { var template = "" for _ in 1...length { diff --git a/Source/Generators/Team.swift b/Source/Generators/Team.swift index 2a61514..d57c876 100644 --- a/Source/Generators/Team.swift +++ b/Source/Generators/Team.swift @@ -1,14 +1,14 @@ -open class Team: Generator { +public final class Team: Generator { - open func name() -> String { + public func name() -> String { return generate("team.name") } - open func creature() -> String { + public func creature() -> String { return generate("team.creature") } - open func state() -> String { + public func state() -> String { return generate("address.state").capitalized } } diff --git a/Tests/Fakery/Data/ParserSpec.swift b/Tests/Fakery/Data/ParserSpec.swift index 97d5e79..a0239c2 100644 --- a/Tests/Fakery/Data/ParserSpec.swift +++ b/Tests/Fakery/Data/ParserSpec.swift @@ -65,7 +65,7 @@ class ParserSpec: QuickSpec { context("when the key is incorrect") { it("returns the empty text") { - if let dummy = parser.fetchRaw("dummy")?.string { + if let dummy = parser.fetchRaw("dummy") as? String { expect(dummy).to(beNil()) } } diff --git a/Tests/Fakery/Generators/CommerceSpec.swift b/Tests/Fakery/Generators/CommerceSpec.swift index a2f5b65..b2bd3f3 100644 --- a/Tests/Fakery/Generators/CommerceSpec.swift +++ b/Tests/Fakery/Generators/CommerceSpec.swift @@ -64,9 +64,9 @@ class CommerceSpec: QuickSpec { } } - describe("#mergeCategories") { + describe("#merge:categories") { it("returns the correct text") { - let text = commerce.mergeCategories(["One", "Two", "Three", "Four"]) + let text = commerce.merge(categories: ["One", "Two", "Three", "Four"]) expect(text).to(equal("One, Two, Three & Four")) } } From fc71e659dcb0d49c4768b2353b88829d7997d983 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:17:27 +0200 Subject: [PATCH 3/9] Update target settings --- Fakery.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Fakery.xcodeproj/project.pbxproj b/Fakery.xcodeproj/project.pbxproj index f8e8e20..ac8a206 100644 --- a/Fakery.xcodeproj/project.pbxproj +++ b/Fakery.xcodeproj/project.pbxproj @@ -1103,6 +1103,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.Fakery"; PRODUCT_NAME = Fakery; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -1121,6 +1122,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.Fakery"; PRODUCT_NAME = Fakery; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -1132,6 +1134,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.FakeryTests"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -1143,6 +1146,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.vadym-markov.FakeryTests"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -1163,6 +1167,7 @@ PRODUCT_NAME = Fakery; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; @@ -1185,6 +1190,7 @@ PRODUCT_NAME = Fakery; SDKROOT = appletvos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.2; }; From 9b104fda552f99ace624a897d9e93b94658ffdcd Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:20:44 +0200 Subject: [PATCH 4/9] Refactor code even more --- Source/Data/Parser.swift | 2 ++ Source/Data/Provider.swift | 9 ++++++--- Source/Faker.swift | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Source/Data/Parser.swift b/Source/Data/Parser.swift index a2a3b3f..4237176 100644 --- a/Source/Data/Parser.swift +++ b/Source/Data/Parser.swift @@ -13,6 +13,8 @@ public final class Parser { var data = [String: Any]() var provider: Provider + // MARK: - Initialization + public init(locale: String = Config.defaultLocale) { self.locale = locale provider = Provider() diff --git a/Source/Data/Provider.swift b/Source/Data/Provider.swift index 77162f8..2256672 100644 --- a/Source/Data/Provider.swift +++ b/Source/Data/Provider.swift @@ -13,10 +13,14 @@ public final class Provider { translation = translationData } else { let bundle = Bundle(for: Provider.self) - var path = bundle.path(forResource: locale, ofType: Config.pathExtension, inDirectory: Config.dirPath) + var path = bundle.path(forResource: locale, + ofType: Config.pathExtension, + inDirectory: Config.dirPath) if path == nil { - path = bundle.path(forResource: locale, ofType: Config.pathExtension, inDirectory: Config.dirFrameworkPath) + path = bundle.path(forResource: locale, + ofType: Config.pathExtension, + inDirectory: Config.dirFrameworkPath) } if let resourcePath = Bundle(for: Provider.self).resourcePath { @@ -27,7 +31,6 @@ public final class Provider { } } - if let path = path { let fileURL = URL(fileURLWithPath: path) diff --git a/Source/Faker.swift b/Source/Faker.swift index f594a67..951fa0d 100644 --- a/Source/Faker.swift +++ b/Source/Faker.swift @@ -22,6 +22,8 @@ public final class Faker { let parser: Parser + // MARK: - Initialization + public init(locale: String = Config.defaultLocale) { self.locale = locale parser = Parser(locale: self.locale) From 057bf5c1991a77e6bc9d412a8d649867cc08d5b3 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:23:10 +0200 Subject: [PATCH 5/9] Update swiftlint --- .swiftlint.yml | 32 ++++++++++++++++++++++ Tests/Fakery/Generators/InternetSpec.swift | 6 ++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .swiftlint.yml diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100644 index 0000000..bc507a3 --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,32 @@ +included: + - Sources + - Tests +excluded: + - Carthage + - Pods + - Packages +opt_in_rules: + - empty_count +disabled_rules: + - valid_docs + - type_name +force_cast: warning +force_try: + severity: warning +line_length: 120 +function_body_length: + - 150 +type_body_length: + warning: 300 + error: 400 +file_length: + warning: 500 + error: 1200 +type_name: + min_length: 3 + max_length: + warning: 40 + error: 50 +variable_name: + min_length: 2 +reporter: "xcode" diff --git a/Tests/Fakery/Generators/InternetSpec.swift b/Tests/Fakery/Generators/InternetSpec.swift index e0f8a45..edc71b1 100644 --- a/Tests/Fakery/Generators/InternetSpec.swift +++ b/Tests/Fakery/Generators/InternetSpec.swift @@ -116,14 +116,16 @@ class InternetSpec: QuickSpec { describe("#ipV4Address") { it("returns the correct text") { let ipV4Address = internet.ipV4Address() - expect(ipV4Address).to(match("((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])")) + expect(ipV4Address).to(match( + "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])")) } } describe("#ipV6Address") { it("returns the correct text") { let ipV6Address = internet.ipV6Address() - expect(ipV6Address).to(match("^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4})")) + expect(ipV6Address).to(match( + "^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4})")) } } From 96d455fe7cd5519fa477937dd459e2953a458d41 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:25:27 +0200 Subject: [PATCH 6/9] Add linting --- Fakery.xcodeproj/project.pbxproj | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Fakery.xcodeproj/project.pbxproj b/Fakery.xcodeproj/project.pbxproj index ac8a206..49daa21 100644 --- a/Fakery.xcodeproj/project.pbxproj +++ b/Fakery.xcodeproj/project.pbxproj @@ -500,6 +500,7 @@ BC827FA41BFA3CE1005F09A4 /* Frameworks */, BC827FA51BFA3CE1005F09A4 /* Headers */, BC827FA61BFA3CE1005F09A4 /* Resources */, + D51B4F371D9AE2BE009FE24D /* SwiftLint */, ); buildRules = ( ); @@ -537,6 +538,7 @@ BCF0DF361BF9F77E00427DB4 /* Frameworks */, BCF0DF371BF9F77E00427DB4 /* Headers */, BCF0DF381BF9F77E00427DB4 /* Resources */, + D51B4F361D9AE2A0009FE24D /* SwiftLint */, ); buildRules = ( ); @@ -574,6 +576,7 @@ BDC291241D9441F2007DA2FC /* Frameworks */, BDC291251D9441F2007DA2FC /* Headers */, BDC291261D9441F2007DA2FC /* Resources */, + D51B4F381D9AE2CD009FE24D /* SwiftLint */, ); buildRules = ( ); @@ -761,6 +764,48 @@ shellPath = /bin/sh; shellScript = "/usr/local/bin/carthage copy-frameworks"; }; + D51B4F361D9AE2A0009FE24D /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; + D51B4F371D9AE2BE009FE24D /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; + D51B4F381D9AE2CD009FE24D /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; + }; D5BA6B7F1D99D429000D5F46 /* Copy frameworks with Carthage */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 3b505719f325b3cc2b1a4fd26248ef7c60e11d33 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 19:40:06 +0200 Subject: [PATCH 7/9] Update travis --- .swift-version | 2 +- .travis.yml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.swift-version b/.swift-version index 8bbe6cf..9f55b2c 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -2.2 +3.0 diff --git a/.travis.yml b/.travis.yml index ec667d6..82d0ef9 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ -osx_image: xcode7.3 +osx_image: xcode8 language: objective-c -xcode_sdk: iphonesimulator9.3 before_install: - brew update From 3904038198b47776375dc14821473d7f92fc95b4 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 20:15:45 +0200 Subject: [PATCH 8/9] Use Simulator --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 82d0ef9..b96144d 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ osx_image: xcode8 language: objective-c +xcode_sdk: iphonesimulator10.0 before_install: - brew update From b533e7a9ee9f72861c8f5d234ab14d829a8ac711 Mon Sep 17 00:00:00 2001 From: Vadym Markov Date: Tue, 27 Sep 2016 21:09:39 +0200 Subject: [PATCH 9/9] Update travis AGAIN --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b96144d..f4f6145 100755 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,6 @@ before_install: script: - xcodebuild clean build -project Fakery.xcodeproj -scheme Fakery-iOS -sdk iphonesimulator -- xcodebuild test -project Fakery.xcodeproj -scheme Fakery-iOS -sdk iphonesimulator +- xcodebuild test -project Fakery.xcodeproj -scheme Fakery-iOS -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6,OS=10.0' - xcodebuild clean build -project Fakery.xcodeproj -scheme Fakery-Mac -sdk macosx - xcodebuild test -project Fakery.xcodeproj -scheme Fakery-Mac -sdk macosx