Skip to content

Commit

Permalink
Changed how dates are displayed to use a "human readable" format (1 m…
Browse files Browse the repository at this point in the history
…inute ago, etc).
  • Loading branch information
omh committed Aug 23, 2009
1 parent 9d025da commit 37362a4
Show file tree
Hide file tree
Showing 10 changed files with 539 additions and 277 deletions.
366 changes: 106 additions & 260 deletions Clyppan.xcodeproj/oh.perspectivev3

Large diffs are not rendered by default.

162 changes: 151 additions & 11 deletions Clyppan.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

46 changes: 46 additions & 0 deletions OMHHumanReadableDate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* @file OMHHumanRedableDate.h
* @author Ole Morten Halvorsen
*
* @section LICENSE
* Copyright (c) 2009, Ole Morten Halvorsen
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* - Neither the name of Clyppan nor the names of its contributors may be used to endorse or
* promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#import <Cocoa/Cocoa.h>

#define MINUTE_IN_SECONDS 60
#define HOUR_IN_SECONDS (60 * MINUTE_IN_SECONDS)
#define DAY_IN_SECONDS (24 * HOUR_IN_SECONDS)
#define WEEK_IN_SECONDS (7 * DAY_IN_SECONDS)

@interface OMHHumanReadableDate : NSObject
{
}

+ (NSString *) dateToHumanReadableString:(NSDate *)date;
+ (NSString *) dateToHumanReadableString:(NSDate *)date format:(NSString *)format;

@end
89 changes: 89 additions & 0 deletions OMHHumanReadableDate.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/**
* @file OMHHumanRedableDate.h
* @author Ole Morten Halvorsen
*
* @section LICENSE
* Copyright (c) 2009, Ole Morten Halvorsen
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* - Neither the name of Clyppan nor the names of its contributors may be used to endorse or
* promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#import "OMHHumanReadableDate.h"


@implementation OMHHumanReadableDate

+ (NSString *) dateToHumanReadableString:(NSDate *)date
{
return [self dateToHumanReadableString:date format:@"%i %@ ago"];
}

+ (NSString *) dateToHumanReadableString:(NSDate *)date format:(NSString *)format
{
// TODO: Add X months ago
NSTimeInterval secondsSinceNow = [[NSDate date] timeIntervalSinceDate:date];

NSLog( @"Seconds: %f", secondsSinceNow );

// if date less than a minute return "less than a minute ago"
if ( secondsSinceNow < MINUTE_IN_SECONDS )
return @"less than a minute ago";

NSInteger timePart = 0;
NSString *timeType = nil;
if ( secondsSinceNow <= HOUR_IN_SECONDS )
{
timeType = @"minutes";
timePart = (NSInteger) round( secondsSinceNow / 60 );
if ( timePart == 1 )
timeType = @"minute";
}

if ( secondsSinceNow <= DAY_IN_SECONDS && secondsSinceNow > HOUR_IN_SECONDS )
{
timeType = @"hours";
timePart = (NSInteger) round( secondsSinceNow / 3600 );
if ( timePart == 1 )
timeType = @"hour";
}

if ( secondsSinceNow <= WEEK_IN_SECONDS && secondsSinceNow > DAY_IN_SECONDS )
{
timeType = @"days";
timePart = (NSInteger) round( secondsSinceNow / ( 3600 * 24 ) );
if ( timePart == 1 )
timeType = @"day";
}

if ( timePart != 0 )
return [NSString stringWithFormat:format, timePart, timeType];


// if date less than a week ago return "x days ago"

return [date descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"
timeZone:nil
locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
}
@end
16 changes: 16 additions & 0 deletions OMHHumanReadableDateTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// OMHHumanReadableDateTest.h
// Clyppan
//
// Created by Ole Morten Halvorsen on 22/08/2009.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import <SenTestingKit/SenTestingKit.h>


@interface OMHHumanReadableDateTest : SenTestCase {

}

@end
105 changes: 105 additions & 0 deletions OMHHumanReadableDateTest.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
//
// OMHHumanReadableDateTest.m
// Clyppan
//
// Created by Ole Morten Halvorsen on 22/08/2009.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "OMHHumanReadableDateTest.h"
#import "OMHHumanReadableDate.h"

@implementation OMHHumanReadableDateTest

- (void) testLessThanAMinute
{
NSDate *date = [NSDate date];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"less than a minute ago", @"Less than a minute ago" );
}

- (void) test59SecondsAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 59];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"less than a minute ago", @"Less than a minute ago" );
}

- (void) test1MinuteAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 60];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"1 minute ago", @"1 Minute ago" );
}

- (void) test2Minutes59secondsAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 179];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"3 minutes ago", @"2 Minutes 59 seconds ago" );
}

- (void) test3MinutesAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 180];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"3 minutes ago", @"3 Minutes ago" );
}

- (void) test59MinutesAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (59 * 60)];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"59 minutes ago", @"59 Minutes ago" );
}

- (void) test1HourAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 3600];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"1 hour ago", @"1 hour ago" );
}

- (void) test2HoursAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 7199];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"2 hours ago", @"2 hours ago" );
}

- (void) test1DayAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (3600 * 24)];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"1 day ago", @"1 day ago" );
}

- (void) test2DaysAgo
{
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (2 * 3600 * 24)];
NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];

STAssertEqualObjects( string, @"2 days ago", @"2 days ago" );
}



@end
Binary file modified Resources/clyppan-small.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 3 additions & 5 deletions Source/OMHClipping.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@


#import "OMHClipping.h"

#import "OMHHumanReadableDate.h"

@interface OMHClipping( private )

Expand Down Expand Up @@ -138,11 +138,9 @@ - (NSImage *) image

- (NSString *) meta
{
NSString *dateString = [self.created descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"
timeZone:nil
locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
NSString *dateString = [OMHHumanReadableDate dateToHumanReadableString:self.created];

return [NSString stringWithFormat:@"Added on %@ from %@", dateString, self.createdFromApp];
return [NSString stringWithFormat:@"Added %@ from %@", dateString, self.createdFromApp];
}

#pragma mark -
Expand Down
2 changes: 1 addition & 1 deletion Source/OMHClippingController.m
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ - (void) markObjectAsCurrent:(OMHClipping *)object;
[self markObjectAsCurrentWithoutClipboard:object];

NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[pb setString:[self.currentActiveItem.content string] forType:NSStringPboardType];

Expand Down
22 changes: 22 additions & 0 deletions Unit tests-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

0 comments on commit 37362a4

Please sign in to comment.