├── .gitignore ├── .coveralls.yml ├── src ├── Exceptions │ └── InvalidLocationException.php ├── Interfaces │ ├── CacheDriverInterface.php │ └── DataRetrieverInterface.php ├── example.php ├── Objects │ ├── UkBankHoliday.php │ ├── CacheDrivers │ │ ├── LaravelCacheDriver.php │ │ └── DOFileCacheDriver.php │ └── DataRetrievers │ │ └── GovUkDataRetriever.php └── Factories │ └── UkBankHolidayFactory.php ├── .travis.yml ├── tests ├── Unit │ ├── includes │ │ └── MockLaravelCache │ │ │ └── Cache.php │ ├── LaravelCacheDriverTest.php │ └── HolidayRetrievalByLocationTest.php └── Functional │ └── BasicUsageTest.php ├── composer.json ├── phpunit.xml ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | composer.lock 3 | cache/*.cache 4 | .idea -------------------------------------------------------------------------------- /.coveralls.yml: -------------------------------------------------------------------------------- 1 | coverage_clover: tests/Logs/clover.xml 2 | json_path: tests/Logs/coveralls-upload.json 3 | service_name: travis-ci -------------------------------------------------------------------------------- /src/Exceptions/InvalidLocationException.php: -------------------------------------------------------------------------------- 1 | title = $title; 14 | $this->date = $date; 15 | $this->notes = $notes; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Objects/CacheDrivers/LaravelCacheDriver.php: -------------------------------------------------------------------------------- 1 | assertTrue(is_array($holidays), 'Holidays should be an array.'); 11 | $this->assertTrue(count($holidays) > 0, 'Holidays array should have at least 1 value.'); 12 | 13 | $holiday = $holidays[0]; 14 | 15 | $this->assertEquals('RapidWeb\UkBankHolidays\Objects\UkBankHoliday', get_class($holiday)); 16 | } 17 | 18 | public function testEnglandWales() 19 | { 20 | require_once __DIR__.'/includes/MockLaravelCache/Cache.php'; 21 | $this->checkHolidaysArrayFormat(UkBankHolidayFactory::getAll('england-and-wales')); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tests/Functional/BasicUsageTest.php: -------------------------------------------------------------------------------- 1 | assertTrue(is_array($holidays), 'Holidays should be an array.'); 13 | $this->assertEquals(1, count($holidays), 'Holidays array should have 1 value.'); 14 | 15 | $holiday = $holidays[0]; 16 | 17 | $this->assertEquals('RapidWeb\UkBankHolidays\Objects\UkBankHoliday', get_class($holiday)); 18 | 19 | $this->assertEquals('New Year’s Day', $holiday->title); 20 | $this->assertEquals('2017-01-02', $holiday->date); 21 | $this->assertEquals('Substitute day', $holiday->notes); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rapidwebltd/php-uk-bank-holidays", 3 | "description": "This library enables developers to easily retrieve UK Bank Holiday details. Holidays can be retrieved for England & Wales, Scotland, and Northern Ireland. Information about these holidays can optionally be restricted by month or date.", 4 | "license": "LGPL-3.0-only", 5 | "keywords": [ 6 | "bank holidays", 7 | "uk bank holidays", 8 | "library", 9 | "PHP library", 10 | "PHP uk bank holidays library" 11 | ], 12 | "require": { 13 | "php": ">=5.6", 14 | "divineomega/do-file-cache-psr-6": "^2.0" 15 | }, 16 | "require-dev": { 17 | "phpunit/phpunit": "^5.7", 18 | "php-coveralls/php-coveralls": "^2.1" 19 | }, 20 | "autoload": { 21 | "psr-4": { 22 | "RapidWeb\\UkBankHolidays\\": "./src/" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Unit 14 | 15 | 16 | ./tests/Functional 17 | 18 | 19 | 20 | 21 | src 22 | 23 | src/example.php 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/Objects/CacheDrivers/DOFileCacheDriver.php: -------------------------------------------------------------------------------- 1 | cache = new CacheItemPool(); 17 | $this->cache->changeConfig( 18 | [ 19 | 'cacheDirectory' => '/tmp/php-uk-bank-holidays-cache/', 20 | 'gzipCompression' => true, 21 | ] 22 | ); 23 | } 24 | 25 | public function set($key, $value) 26 | { 27 | $cacheItem = $this->cache->getItem($key); 28 | $cacheItem->set($value); 29 | $cacheItem->expiresAfter(self::CACHE_EXPIRY_IN_SECONDS); 30 | $this->cache->save($cacheItem); 31 | } 32 | 33 | public function get($key) 34 | { 35 | return $this->cache->getItem($key)->get(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/Unit/HolidayRetrievalByLocationTest.php: -------------------------------------------------------------------------------- 1 | assertTrue(is_array($holidays), 'Holidays should be an array.'); 12 | $this->assertTrue(count($holidays) > 0, 'Holidays array should have at least 1 value.'); 13 | 14 | $holiday = $holidays[0]; 15 | 16 | $this->assertEquals('RapidWeb\UkBankHolidays\Objects\UkBankHoliday', get_class($holiday)); 17 | } 18 | 19 | public function testEnglandWales() 20 | { 21 | $this->checkHolidaysArrayFormat(UkBankHolidayFactory::getAll('england-and-wales')); 22 | } 23 | 24 | public function testScotland() 25 | { 26 | $this->checkHolidaysArrayFormat(UkBankHolidayFactory::getAll('scotland')); 27 | } 28 | 29 | public function testNorthernIreland() 30 | { 31 | $this->checkHolidaysArrayFormat(UkBankHolidayFactory::getAll('northern-ireland')); 32 | } 33 | 34 | public function testInvalidLocation() 35 | { 36 | $this->expectException(InvalidLocationException::class); 37 | $this->checkHolidaysArrayFormat(UkBankHolidayFactory::getAll('rensid-flapsop')); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Factories/UkBankHolidayFactory.php: -------------------------------------------------------------------------------- 1 | retrieve($location); 20 | 21 | return $dates; 22 | } 23 | 24 | public static function getByMonth($year, $month, $location = 'england-and-wales') 25 | { 26 | $dates = self::getAll($location); 27 | $dateRange = []; 28 | foreach ($dates as $date) { 29 | if (date('Y', strtotime($date->date)) == $year && date('m', strtotime($date->date)) == $month) { 30 | $dateRange[] = $date; 31 | } 32 | } 33 | 34 | return $dateRange; 35 | } 36 | 37 | public static function getByDate($year, $month, $day, $location = 'england-and-wales') 38 | { 39 | $dates = self::getByMonth($year, $month, $location); 40 | $dateRange = []; 41 | foreach ($dates as $date) { 42 | if (date('d', strtotime($date->date)) == $day) { 43 | $dateRange[] = $date; 44 | } 45 | } 46 | 47 | return $dateRange; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Objects/DataRetrievers/GovUkDataRetriever.php: -------------------------------------------------------------------------------- 1 | setupCache(); 22 | } 23 | 24 | private function setupCache() 25 | { 26 | if (class_exists('Illuminate\Support\Facades\Cache')) { 27 | $this->setCacheDriver(new LaravelCacheDriver()); 28 | } else { 29 | $this->setCacheDriver(new DOFileCacheDriver()); 30 | } 31 | } 32 | 33 | public function setCacheDriver(CacheDriverInterface $cache) 34 | { 35 | $this->cache = $cache; 36 | } 37 | 38 | public function retrieve($location) 39 | { 40 | if (!in_array($location, $this->acceptableLocations)) { 41 | throw new InvalidLocationException('Invalid location specified. Acceptable locations: '.implode(', ', $this->acceptableLocations)); 42 | } 43 | 44 | if (!($data = $this->cache->get($this->cacheKey))) { 45 | $retrievedData = file_get_contents('https://www.gov.uk/bank-holidays.json'); 46 | 47 | if (!$retrievedData) { 48 | throw new Exception('Unable to retrieve JSON data.'); 49 | } 50 | 51 | $data = json_decode($retrievedData, true); 52 | 53 | if (!$data) { 54 | throw new Exception('Unable to decode JSON data.'); 55 | } 56 | 57 | $this->cache->set($this->cacheKey, $data); 58 | } 59 | 60 | if (!isset($data[$location]) || !isset($data[$location]['events'])) { 61 | throw new Exception('Unable to locate events for the specified location.'); 62 | } 63 | 64 | $bankHolidayDates = []; 65 | 66 | foreach ($data[$location]['events'] as $holidayDate) { 67 | $bankHolidayDate = new UkBankHoliday($holidayDate['title'], $holidayDate['date'], $holidayDate['notes']); 68 | $bankHolidayDates[] = $bankHolidayDate; 69 | } 70 | 71 | return $bankHolidayDates; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP UK Bank Holidays 2 | 3 | [![Build Status](https://travis-ci.org/rapidwebltd/php-uk-bank-holidays.svg?branch=master)](https://travis-ci.org/rapidwebltd/php-uk-bank-holidays) 4 | [![Coverage Status](https://coveralls.io/repos/github/rapidwebltd/php-uk-bank-holidays/badge.svg?branch=master)](https://coveralls.io/github/rapidwebltd/php-uk-bank-holidays?branch=master) 5 | [![StyleCI](https://styleci.io/repos/84812494/shield?branch=master)](https://styleci.io/repos/84812494) 6 | [![Packagist](https://img.shields.io/packagist/dt/rapidwebltd/php-uk-bank-holidays.svg)](https://packagist.org/packages/rapidwebltd/php-uk-bank-holidays/stats) 7 | 8 | This library lets developers easily retrieve UK bank holiday details. Holidays can be retrieved for 9 | England & Wales, Scotland, and Northern Ireland. Information about these holidays can optionally be 10 | restricted by month or date. 11 | 12 | ## Installation 13 | To install, just run the following composer command. 14 | 15 | `composer require rapidwebltd/php-uk-bank-holidays` 16 | 17 | Remember to include the `vendor/autoload.php` file if your framework does not do this for you. 18 | 19 | ## Usage 20 | 21 | Retrieving bank holidays for a specific date can be done as follows. By default this will bring 22 | back holidays from England & Wales. 23 | 24 | ```php 25 | use RapidWeb\UkBankHolidays\Factories\UkBankHolidayFactory; 26 | 27 | $holidays = UkBankHolidayFactory::getByDate(2017, 01, 2); 28 | 29 | var_dump($holidays); 30 | ``` 31 | 32 | ### UKBankHoliday object 33 | 34 | All `UkBankHolidayFactory` methods will return an array of `UkBankHoliday` objects. The following 35 | snippet shows an example object for the 2017 New Year's Day bank holiday, which occurs on the 2nd 36 | of January 2017. 37 | 38 | ```php 39 | array(1) { 40 | [0]=> 41 | object(RapidWeb\UkBankHolidays\Objects\UkBankHoliday)#46 (4) { 42 | ["title"]=> 43 | string(16) "New Year’s Day" 44 | ["date"]=> 45 | string(10) "2017-01-02" 46 | ["notes"]=> 47 | string(14) "Substitute day" 48 | } 49 | } 50 | ``` 51 | 52 | This object contains a title for the holiday, the date it occurs, and government provided notes 53 | regarding the holiday, if available. All of these are publicly accessible. 54 | 55 | ### Location restriction 56 | 57 | If you wish to retrieve bank holidays from Scotland or Northern Ireland, make use of the 4th optional 58 | argument, as follows. 59 | 60 | ```php 61 | $englandWalesHolidays = UkBankHolidayFactory::getByDate(2017, 01, 2, 'england-and-wales'); 62 | $scotlandHolidays = UkBankHolidayFactory::getByDate(2017, 01, 2, 'scotland'); 63 | $northernIrelandHolidays = UkBankHolidayFactory::getByDate(2017, 01, 2, 'northern-ireland'); 64 | 65 | $allHolidays = array_merge($englandWalesHolidays, $scotlandHolidays, $northernIrelandHolidays); 66 | ``` 67 | 68 | ### Date-based restrictions 69 | 70 | You can use this library to retrieve all holidays or alternatively holidays restricted by month or date. 71 | This is easily done using the `getAll`, `getByMonth` and `getByDate` methods respectively. 72 | 73 | See the following examples. 74 | 75 | ```php 76 | $allHolidays = UkBankHolidayFactory::getAll(); 77 | $januaryHolidays = UkBankHolidayFactory::getByMonth(2017, 01); 78 | $newYearsHolidays = UkBankHolidayFactory::getByDate(2017, 01, 2); 79 | ``` 80 | 81 | All of these methods accept an additional optional argument to specify the location of the holidays you wish to 82 | retrieve. For more details, see the location restriction section above. 83 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | --------------------------------------------------------------------------------