Javier Cicchelli 9bcdaa697b [Setup] Basic project structure (#1)
This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended.

To summarise this work:
- [x] created a new **Xcode** project;
- [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project;
- [x] created the `Locations` app and also, its `Libraries` package;
- [x] created the `Shared` package to share dependencies between the apps;
- [x] added a `Makefile` file and implemented some **environment** and **help** commands.

Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Reviewed-on: rock-n-code/deep-linking-assignment#1
2023-04-08 18:37:13 +00:00

111 lines
4.7 KiB
Objective-C

#import "WMFAnnouncement.h"
#import <WMF/WMFComparison.h>
#import <WMF/NSURL+WMFExtras.h>
#import <WMF/NSDateFormatter+WMFExtensions.h>
#import <WMF/NSString+WMFHTMLParsing.h>
@implementation WMFAnnouncement
@synthesize actionURL = _actionURL;
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
WMF_SAFE_KEYPATH(WMFAnnouncement.new, identifier): @"id",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, type): @"type",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, startTime): @"start_time",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, endTime): @"end_time",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, platforms): @"platforms",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, countries): @"countries",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, placement): @"placement",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, text): @"text",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, actionTitle): @"action.title",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, actionURLString): @"action.url",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, captionHTML): @"caption_HTML",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, imageURL): @[@"image", @"image_url"],
WMF_SAFE_KEYPATH(WMFAnnouncement.new, imageHeight): @"image_height",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, negativeText): @"negative_text",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, loggedIn): @"logged_in",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, readingListSyncEnabled): @"reading_list_sync_enabled",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, beta): @"beta",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, domain): @"domain",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, articleTitles): @"articleTitles",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, displayDelay): @"displayDelay",
WMF_SAFE_KEYPATH(WMFAnnouncement.new, percentReceivingExperiment): @"percent_receiving_experiment"
};
}
+ (NSInteger)version {
return 4;
}
- (NSURL *)actionURL {
if (!_actionURL) {
_actionURL = [NSURL wmf_optionalURLWithString: self.actionURLString];
}
return _actionURL;
}
+ (NSValueTransformer *)imageURLJSONTransformer {
return [MTLValueTransformer
transformerUsingForwardBlock:^NSURL *(NSDictionary *value,
BOOL *success,
NSError *__autoreleasing *error) {
NSString *urlString = value[@"image"] ?: value[@"image_url"];
return [NSURL wmf_optionalURLWithString:urlString];
}
reverseBlock:^NSDictionary *(NSURL *URL,
BOOL *success,
NSError *__autoreleasing *error) {
NSString *urlString = [URL absoluteString];
if (!urlString) {
return @{};
}
return @{@"image_url": urlString};
}];
}
+ (NSValueTransformer *)startTimeJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *value, BOOL *success, NSError *__autoreleasing *error) {
NSDate *date = [[NSDateFormatter wmf_iso8601Formatter] dateFromString:value];
return date;
}];
}
+ (NSValueTransformer *)endTimeJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *value, BOOL *success, NSError *__autoreleasing *error) {
NSDate *date = [[NSDateFormatter wmf_iso8601Formatter] dateFromString:value];
return date;
}];
}
+ (NSDictionary *)allowedSecureCodingClassesByPropertyKey {
//Add NSString to list of allowed classes for NSArray properties.
//This fixes the "[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving safe plist type 'NSString' for key 'NS.objects', even though it was not explicitly included in the client allowed classes set" console error in iOS 15
NSDictionary *superAllowedClassesDict = [super allowedSecureCodingClassesByPropertyKey];
NSMutableDictionary *allowedClassesDict = [[NSMutableDictionary alloc] initWithDictionary:superAllowedClassesDict];
NSArray *keysToCheck = @[@"countries", @"platforms", @"articleTitles"];
for (NSString *key in keysToCheck) {
NSObject *object = [allowedClassesDict objectForKey:key];
if ([object isKindOfClass:[NSArray class]]) {
NSMutableArray *allowedClasses = [NSMutableArray arrayWithArray:(NSArray *)object];
[allowedClasses addObject:[NSString class]];
[allowedClassesDict setObject:[NSArray arrayWithArray:allowedClasses] forKey:key];
}
}
return [NSDictionary dictionaryWithDictionary:allowedClassesDict];
}
// No languageVariantCodePropagationSubelementKeys
+ (NSArray<NSString *> *)languageVariantCodePropagationURLKeys {
return @[@"imageURL",
@"actionURL"];
}
@end