Skip to content

Commit

Permalink
Methods that don't use a comma for the delimiter should not have "CSV…
Browse files Browse the repository at this point in the history
…" as part of the name.
  • Loading branch information
davedelong committed Jul 12, 2014
1 parent 6ea41c4 commit 556f4f0
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 34 deletions.
45 changes: 32 additions & 13 deletions CHCSVParser/CHCSVParser/CHCSVParser.h
Expand Up @@ -29,6 +29,10 @@
#define NS_DESIGNATED_INITIALIZER
#endif

#ifndef CHCSV_DEPRECATED
#define CHCSV_DEPRECATED(...) __attribute__((deprecated("" #__VA_ARGS__)))
#endif

extern NSString * const CHCSVErrorDomain;

typedef NS_ENUM(NSInteger, CHCSVErrorCode) {
Expand Down Expand Up @@ -63,13 +67,13 @@ typedef NS_ENUM(NSInteger, CHCSVErrorCode) {

@property (readonly) NSUInteger totalBytesRead;

- (id)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter NS_DESIGNATED_INITIALIZER;

- (id)initWithCSVString:(NSString *)csv;
- (id)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter;
- (instancetype)initWithCSVString:(NSString *)csv;
- (instancetype)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter;

- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath;
- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter;
- (instancetype)initWithContentsOfCSVFile:(NSString *)csvFilePath;
- (instancetype)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter;

- (void)parse;
- (void)cancelParsing;
Expand Down Expand Up @@ -114,21 +118,36 @@ typedef NS_OPTIONS(NSUInteger, CHCSVParserOptions) {

@interface NSArray (CHCSVAdditions)

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error;
+ (instancetype)arrayWithContentsOfCSVURL:(NSURL *)fileURL;
+ (instancetype)arrayWithContentsOfCSVURL:(NSURL *)fileURL options:(CHCSVParserOptions)options;
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL delimiter:(unichar)delimiter;
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL options:(CHCSVParserOptions)options delimiter:(unichar)delimiter;
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error;

- (NSString *)CSVString;

// Deprecated methods

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath CHCSV_DEPRECATED("Use +arrayWithContentsOfCSVURL: instead");
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter CHCSV_DEPRECATED("Use +arrayWithContentsOfDelimitedURL:delimiter: instead");
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options CHCSV_DEPRECATED("Use +arrayWithContentsOfCSVURL:options: instead");
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter CHCSV_DEPRECATED("Use +arrayWithContentsOfDelimitedURL:options:delimiter: instead");
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error CHCSV_DEPRECATED("Use +arrayWithContentsOfDelimitedURL:options:delimiter:error: instead");

@end

@interface NSString (CHCSVAdditions)

- (NSArray *)CSVComponents;
- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter;
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options;
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter;
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error;
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter;
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter options:(CHCSVParserOptions)options;
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter options:(CHCSVParserOptions)options error:(NSError *__autoreleasing *)error;

// Deprecated methods

- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter CHCSV_DEPRECATED("Use -componentsSeparatedByDelimiter: instead");
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter CHCSV_DEPRECATED("Use -componentsSeparatedByDelimiter:options: instead");
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error CHCSV_DEPRECATED("Use -componentsSeparatedByDelimiter:options:error: instead");

@end
74 changes: 55 additions & 19 deletions CHCSVParser/CHCSVParser/CHCSVParser.m
Expand Up @@ -754,25 +754,25 @@ - (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber {

@implementation NSArray (CHCSVAdditions)

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath {
return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:COMMA error:nil];
+ (instancetype)arrayWithContentsOfCSVURL:(NSURL *)fileURL {
return [self arrayWithContentsOfDelimitedURL:fileURL options:0 delimiter:COMMA error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter {
return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:delimiter error:nil];
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL delimiter:(unichar)delimiter {
return [self arrayWithContentsOfDelimitedURL:fileURL options:0 delimiter:delimiter error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options {
return [self arrayWithContentsOfCSVFile:csvFilePath options:options delimiter:COMMA error:nil];
+ (instancetype)arrayWithContentsOfCSVURL:(NSURL *)fileURL options:(CHCSVParserOptions)options {
return [self arrayWithContentsOfDelimitedURL:fileURL options:options delimiter:COMMA error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
return [self arrayWithContentsOfCSVFile:csvFilePath options:options delimiter:delimiter error:nil];
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL options:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
return [self arrayWithContentsOfDelimitedURL:fileURL options:options delimiter:delimiter error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error {
NSParameterAssert(csvFilePath);
NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:csvFilePath];
+ (instancetype)arrayWithContentsOfDelimitedURL:(NSURL *)fileURL options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error {
NSParameterAssert(fileURL);
NSInputStream *stream = [NSInputStream inputStreamWithURL:fileURL];

return _CHCSVParserParse(stream, options, delimiter, error);
}
Expand All @@ -791,34 +791,70 @@ - (NSString *)CSVString {
return [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];
}

// Deprecated methods

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath {
return [self arrayWithContentsOfDelimitedURL:[NSURL fileURLWithPath:csvFilePath] options:0 delimiter:COMMA error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter {
return [self arrayWithContentsOfDelimitedURL:[NSURL fileURLWithPath:csvFilePath] options:0 delimiter:delimiter error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options {
return [self arrayWithContentsOfDelimitedURL:[NSURL fileURLWithPath:csvFilePath] options:options delimiter:COMMA error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
return [self arrayWithContentsOfDelimitedURL:[NSURL fileURLWithPath:csvFilePath] options:options delimiter:delimiter error:nil];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error {
return [self arrayWithContentsOfDelimitedURL:[NSURL fileURLWithPath:csvFilePath] options:options delimiter:delimiter error:error];
}

@end

@implementation NSString (CHCSVAdditions)


- (NSArray *)CSVComponents {
return [self CSVComponentsWithOptions:0 delimiter:COMMA];
return [self componentsSeparatedByDelimiter:COMMA options:0 error:nil];
}

- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter {
return [self CSVComponentsWithOptions:0 delimiter:delimiter];
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options {
return [self componentsSeparatedByDelimiter:COMMA options:options error:nil];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options {
return [self CSVComponentsWithOptions:options delimiter:COMMA];
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter {
return [self componentsSeparatedByDelimiter:delimiter options:0 error:nil];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
return [self CSVComponentsWithOptions:options delimiter:delimiter error:nil];
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter options:(CHCSVParserOptions)options {
return [self componentsSeparatedByDelimiter:delimiter options:options error:nil];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error {
- (NSArray *)componentsSeparatedByDelimiter:(unichar)delimiter options:(CHCSVParserOptions)options error:(NSError *__autoreleasing *)error {
NSData *csvData = [self dataUsingEncoding:NSUTF8StringEncoding];
NSInputStream *stream = [NSInputStream inputStreamWithData:csvData];

return _CHCSVParserParse(stream, options, delimiter, error);
}

// Deprecated methods

- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter {
return [self componentsSeparatedByDelimiter:delimiter options:0 error:nil];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
return [self componentsSeparatedByDelimiter:delimiter options:options error:nil];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter error:(NSError *__autoreleasing *)error {
return [self componentsSeparatedByDelimiter:delimiter options:options error:error];
}

@end

@implementation CHCSVOrderedDictionary {
Expand Down
4 changes: 2 additions & 2 deletions Unit Tests/UnitTests.m
Expand Up @@ -70,7 +70,7 @@ - (void)testGithubIssue50Workaround {
NSString *file = [NSTemporaryDirectory() stringByAppendingPathComponent:NSStringFromSelector(_cmd)];
[csv writeToFile:file atomically:NO encoding:NSUTF8StringEncoding error:nil];

NSArray *actual = [NSArray arrayWithContentsOfCSVFile:file];
NSArray *actual = [NSArray arrayWithContentsOfCSVURL:[NSURL fileURLWithPath:file]];

NSArray *expected = @[@[@"TRẦN",@"species_code",@"Scientific name",@"Author name",@"Common name",@"Family",@"Description",@"Habitat",@"\"Leaf size min (cm, 0 decimal digit)\"",@"\"Leaf size max (cm, 0 decimal digit)\"",@"Distribution",@"Current National Conservation Status",@"Growth requirements",@"Horticultural features",@"Uses",@"Associated fauna",@"Reference",@"species_id"]];
XCTAssertEqualObjects(actual, expected, @"failed");
Expand Down Expand Up @@ -283,7 +283,7 @@ - (void)testFirstLineAsKeys_MismatchedFieldCount {
NSString *csv = FIELD1 COMMA FIELD2 COMMA FIELD3 NEWLINE FIELD1 COMMA FIELD2 COMMA FIELD3 COMMA FIELD1;

NSError *error = nil;
(void)[csv CSVComponentsWithOptions:CHCSVParserOptionsUsesFirstLineAsKeys delimiter:[COMMA characterAtIndex:0] error:&error];
(void)[csv componentsSeparatedByDelimiter:[COMMA characterAtIndex:0] options:CHCSVParserOptionsUsesFirstLineAsKeys error:&error];
XCTAssertNotNil(error, @"Expected error");
XCTAssertEqualObjects(error.domain, CHCSVErrorDomain, @"Unexpected error");
XCTAssertEqual(error.code, CHCSVErrorCodeIncorrectNumberOfFields, @"Unexpected error");
Expand Down

0 comments on commit 556f4f0

Please sign in to comment.