From e72e0d79ebd519e8325b00d6eefcc38292171ebd Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 23 Jun 2017 10:59:04 +0100 Subject: [PATCH 01/12] Change laravel tinkering --- .env.example | 2 -- .psysh.php | 3 +++ composer.json | 1 + composer.lock | 53 ++++++++++++++++++++++++++++++++++++++++++++++- tinker.config.php | 38 --------------------------------- 5 files changed, 56 insertions(+), 41 deletions(-) create mode 100644 .psysh.php delete mode 100644 tinker.config.php diff --git a/.env.example b/.env.example index 72c19df3..57ea1e36 100644 --- a/.env.example +++ b/.env.example @@ -52,5 +52,3 @@ TWITTER_ACCESS_TOKEN_SECRET= SCOUT_DRIVER=pgsql PIWIK=false - -PSYSH_CONFIG=tinker.config.php diff --git a/.psysh.php b/.psysh.php new file mode 100644 index 00000000..d237947d --- /dev/null +++ b/.psysh.php @@ -0,0 +1,3 @@ +files()->name('*.php')->in(base_path().'/app'); - foreach ($finder as $file) { - $namespace = 'App\\'; - if ($relativePath = $file->getRelativePath()) { - $namespace .= strtr($relativePath, '/', '\\') . '\\'; - } - $class = $namespace . $file->getBasename('.php'); - try { - $r = new \ReflectionClass($class); - if ($r->isSubclassOf('Illuminate\\Database\\Eloquent\\Model')) { - class_alias($class, $file->getBasename('.php')); - } - } catch (Exception $e) { - // - } - } - } -} - -aliasModels(); - -return [ - 'startupMessage' => 'Using local config file (tinker.config.php)', - - 'commands' => [ - // new \App\Tinker\TestCommand, - ], -]; From 3d734201a22d34da4d7d815dc5819c20675b48f4 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Tue, 27 Jun 2017 17:40:37 +0100 Subject: [PATCH 02/12] When a place already exists, return an instance of that place, not a collection of length 1 --- app/Services/PlaceService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index 95dd1418..d6cd526d 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -49,7 +49,7 @@ class PlaceService if (array_key_exists('url', $checkin['properties']) && ends_with(parse_url($checkin['properties']['url'][0], PHP_URL_HOST), 'foursquare.com')) { $place = Place::where('foursquare', $checkin['properties']['url'][0])->get(); if (count($place) === 1) { - return $place; + return $place->first(); } } if (array_key_exists('name', $checkin['properties']) === false) { From 8ae5d4e770fe7268c121a3db2c6de726d60e7da7 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Thu, 29 Jun 2017 12:34:25 +0100 Subject: [PATCH 03/12] Conoslidate external URLs for a place into a single JSON column --- app/Services/PlaceService.php | 6 +++- composer.lock | 20 +++++------ ..._update_places_table_add_external_urls.php | 34 +++++++++++++++++++ database/seeds/PlacesTableSeeder.php | 17 ++++++---- package-lock.json | 6 ++-- package.json | 2 +- 6 files changed, 63 insertions(+), 22 deletions(-) create mode 100644 database/migrations/2017_06_27_164743_update_places_table_add_external_urls.php diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index d6cd526d..5b21054c 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -47,7 +47,11 @@ class PlaceService { //check if the place exists if from swarm if (array_key_exists('url', $checkin['properties']) && ends_with(parse_url($checkin['properties']['url'][0], PHP_URL_HOST), 'foursquare.com')) { - $place = Place::where('foursquare', $checkin['properties']['url'][0])->get(); + $place = Place::where( + 'external_urls', + '@>', + json_encode('foursquare' => $checkin['properties']['url'][0] + )->get(); if (count($place) === 1) { return $place->first(); } diff --git a/composer.lock b/composer.lock index 24d8b3f7..0c532174 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.30.1", + "version": "3.30.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "d234cb5e111945eb4bfca7eda0eef07a25750b29" + "reference": "20539a38dc643a2700f80ae8647dbd1a05d3f7a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d234cb5e111945eb4bfca7eda0eef07a25750b29", - "reference": "d234cb5e111945eb4bfca7eda0eef07a25750b29", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/20539a38dc643a2700f80ae8647dbd1a05d3f7a9", + "reference": "20539a38dc643a2700f80ae8647dbd1a05d3f7a9", "shasum": "" }, "require": { @@ -84,7 +84,7 @@ "s3", "sdk" ], - "time": "2017-06-22T22:40:58+00:00" + "time": "2017-06-23T18:54:40+00:00" }, { "name": "barnabywalters/mf-cleaner", @@ -2728,16 +2728,16 @@ }, { "name": "psy/psysh", - "version": "v0.8.7", + "version": "v0.8.8", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "be969b9dc89dcaefdb9a3117fa91fa38bca19f50" + "reference": "fe65c30cbc55c71e61ba3a38b5a581149be31b8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/be969b9dc89dcaefdb9a3117fa91fa38bca19f50", - "reference": "be969b9dc89dcaefdb9a3117fa91fa38bca19f50", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/fe65c30cbc55c71e61ba3a38b5a581149be31b8e", + "reference": "fe65c30cbc55c71e61ba3a38b5a581149be31b8e", "shasum": "" }, "require": { @@ -2797,7 +2797,7 @@ "interactive", "shell" ], - "time": "2017-06-20T12:51:31+00:00" + "time": "2017-06-24T06:16:19+00:00" }, { "name": "ramsey/uuid", diff --git a/database/migrations/2017_06_27_164743_update_places_table_add_external_urls.php b/database/migrations/2017_06_27_164743_update_places_table_add_external_urls.php new file mode 100644 index 00000000..bd58db29 --- /dev/null +++ b/database/migrations/2017_06_27_164743_update_places_table_add_external_urls.php @@ -0,0 +1,34 @@ +jsonb('external_urls')->nullable(); + $table->index('external_urls'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('places', function (Blueprint $table) { + $table->dropIndex('places_external_urls_index'); + $table->dropColumn('external_urls'); + }); + } +} diff --git a/database/seeds/PlacesTableSeeder.php b/database/seeds/PlacesTableSeeder.php index 1fe4bea8..cef1ebb6 100644 --- a/database/seeds/PlacesTableSeeder.php +++ b/database/seeds/PlacesTableSeeder.php @@ -1,6 +1,8 @@ insert([ - 'name' => 'The Bridgewater Pub', - 'slug' => 'the-bridgewater-pub', - 'description' => 'A lovely local pub with a decent selection of cask ales', - 'location' => 'POINT(-2.3805 53.4983)', - 'created_at' => '2016-01-12 16:19:00', - 'updated_at' => '2016-01-12 16:19:00', + $place = new Place(); + $place->name = 'The Bridgewater Pub'; + $place->description = 'A lovely local pub with a decent selection of cask ales'; + $place->location = new Point('53.4983', '-2.3805'); + $place->external_urls = json_encode([ + 'foursqaure' => 'https://foursqaure.com/v/123435/the-bridgewater-pub', + 'osm' => 'https://www.openstreetmap.org/way/987654', ]); + $place->save(); } } diff --git a/package-lock.json b/package-lock.json index 04964a83..91e22361 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4329,9 +4329,9 @@ } }, "webStorage": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/webStorage/-/webStorage-1.2.3.tgz", - "integrity": "sha1-CHN87eWk2ouophKKYoQHB0Cwxxg=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/webStorage/-/webStorage-1.2.4.tgz", + "integrity": "sha1-/jNN8N5uLe58i9A2uxVaw115FTY=" }, "webworkify": { "version": "1.4.0", diff --git a/package.json b/package.json index 1cfbde8b..3a5f43dc 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "mapbox-gl": "^0.38.0", "marked": "^0.3.6", "normalize.css": "^7.0.0", - "webStorage": "^1.2.3" + "webStorage": "^1.2.4" }, "devDependencies": { "babel-cli": "^6.18.0", From 31ae5b749b0a50e2c36f4883420cee164081d78a Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Thu, 29 Jun 2017 13:59:02 +0100 Subject: [PATCH 04/12] Fix syntax error --- app/Services/PlaceService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index 5b21054c..98158167 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -50,7 +50,7 @@ class PlaceService $place = Place::where( 'external_urls', '@>', - json_encode('foursquare' => $checkin['properties']['url'][0] + json_encode(['foursquare' => $checkin['properties']['url'][0]]) )->get(); if (count($place) === 1) { return $place->first(); From 4afb6a3ae9f88b0ce96a40652a2bfe8ad0b586f4 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 13:21:40 +0100 Subject: [PATCH 05/12] Transition to using a json column for all external urls of a place --- app/Place.php | 40 +++++++++++++++++++++++++++++++++++ app/Services/PlaceService.php | 12 +++-------- changelog.md | 3 +++ tests/Feature/SwarmTest.php | 2 +- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/app/Place.php b/app/Place.php index 0e1e0c9b..52576b81 100644 --- a/app/Place.php +++ b/app/Place.php @@ -76,6 +76,19 @@ class Place extends Model return $query->where($field, '<=', $distance)->orderBy($field); } + public function scopeWhereExternalURL(Builder $query, string $url) + { + $type = $this->getType($url); + if ($type === null) { + // we haven’t set a type, therefore result must be empty set + // id can’t be null, so this will return empty set + return $query->whereNull('id'); + } + return $query->where('external_urls', '@>', json_encode([ + $type => $url + ])); + } + /** * Get the latitude from the `location` property. * @@ -115,4 +128,31 @@ class Place extends Model { return config('app.shorturl') . '/places/' . $this->slug; } + + public function setExternalUrlsAttribute($value) + { + $type = $this->getType($value); + if ($type === null) { + throw new \Exception('Unkown external url type'); + } + $already = []; + if (array_key_exists('external_urls', $this->attributes)) { + $already = json_decode($this->attributes['external_urls'], true); + } + $already[$type] = $value; + $this->attributes['external_urls'] = json_encode($already); + } + + private function getType(string $url): ?string + { + $host = parse_url($url, PHP_URL_HOST); + if (ends_with($host, 'foursquare.com') === true) { + return 'foursquare'; + } + if (ends_with($host, 'openstreetmap.org') === true) { + return 'osm'; + } + + return null; + } } diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index 98158167..2a823f33 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -46,12 +46,8 @@ class PlaceService public function createPlaceFromCheckin(array $checkin): Place { //check if the place exists if from swarm - if (array_key_exists('url', $checkin['properties']) && ends_with(parse_url($checkin['properties']['url'][0], PHP_URL_HOST), 'foursquare.com')) { - $place = Place::where( - 'external_urls', - '@>', - json_encode(['foursquare' => $checkin['properties']['url'][0]]) - )->get(); + if (array_key_exists('url', $checkin['properties'])) { + $place = Place::whereExternalURL($checkin['properties']['url'][0])->get(); if (count($place) === 1) { return $place->first(); } @@ -64,9 +60,7 @@ class PlaceService } $place = new Place(); $place->name = $checkin['properties']['name'][0]; - if (ends_with(parse_url($checkin['properties']['url'][0], PHP_URL_HOST), 'foursquare.com')) { - $place->foursquare = $checkin['properties']['url'][0]; - } + $place->external_urls = $checkin['properties']['url'][0]; $place->location = new Point( (float) $checkin['properties']['latitude'][0], (float) $checkin['properties']['longitude'][0] diff --git a/changelog.md b/changelog.md index 29a0c216..8a1cd4d1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,8 @@ # Changelog +## Version {next} + - Transition to using a JSON column for external urls of places + ## Version 0.5.19 (2017-06-27) - Fix error in App\\WebMention.php diff --git a/tests/Feature/SwarmTest.php b/tests/Feature/SwarmTest.php index 16ae8cbe..9f395adf 100644 --- a/tests/Feature/SwarmTest.php +++ b/tests/Feature/SwarmTest.php @@ -44,7 +44,7 @@ class SwarmTest extends TestCase ->assertStatus(201) ->assertJson(['response' => 'created']); $this->assertDatabaseHas('places', [ - 'foursquare' => 'https://foursquare.com/v/123456' + 'external_urls' => '{"foursquare": "https://foursquare.com/v/123456"}' ]); $this->assertDatabaseHas('notes', [ 'swarm_url' => 'https://www.swarmapp.com/checkin/abc' From e540eb767f2089c627588e4d4de6c9c5fe0962b7 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 13:39:14 +0100 Subject: [PATCH 06/12] Add a helper artisan command to update place model structure --- app/Console/Commands/UpdatePlacesURLs.php | 58 +++++++++++++++++++++++ app/Console/Kernel.php | 1 + changelog.md | 1 + 3 files changed, 60 insertions(+) create mode 100644 app/Console/Commands/UpdatePlacesURLs.php diff --git a/app/Console/Commands/UpdatePlacesURLs.php b/app/Console/Commands/UpdatePlacesURLs.php new file mode 100644 index 00000000..97a28f97 --- /dev/null +++ b/app/Console/Commands/UpdatePlacesURLs.php @@ -0,0 +1,58 @@ +places = Place::all(); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + foreach ($this->places as $place) { + if ($place->foursqaure !== null) { + $place->external_urls = $place->foursquare; + } + } + + $this->info('All Places have had their external URLs values updated to the new structure.'); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 0a0aa08d..ebbc97f5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,6 +17,7 @@ class Kernel extends ConsoleKernel Commands\ParseCachedWebMentions::class, Commands\ReDownloadWebMentions::class, Commands\GenerateToken::class, + Commands\UpdatePlacesURLs::class, ]; /** diff --git a/changelog.md b/changelog.md index 8a1cd4d1..a83e59ba 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## Version {next} - Transition to using a JSON column for external urls of places + - Add a command to update external url structure of places ## Version 0.5.19 (2017-06-27) - Fix error in App\\WebMention.php From b0c53749439d0fd9ae0f280ff6a6e7ce08723cb5 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 13:45:39 +0100 Subject: [PATCH 07/12] Fix styleci issues, try and fix a travis issue --- .travis.yml | 8 ++++---- app/Place.php | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index f37b0761..f2524158 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,6 +38,10 @@ matrix: - php: nightly before_install: + - cp .env.travis .env + - echo 'error_log = "/tmp/php.error.log"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini + - psql -U travis -c 'create database travis_ci_test' + - psql -U travis -d travis_ci_test -c 'create extension postgis' - mkdir travis-phantomjs - wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 -O $PWD/travis-phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 - tar -xvf $PWD/travis-phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis-phantomjs @@ -51,10 +55,6 @@ install: - travis/install-nginx.sh before_script: - - echo 'error_log = "/tmp/php.error.log"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini - - psql -U travis -c 'create database travis_ci_test' - - psql -U travis -d travis_ci_test -c 'create extension postgis' - - cp .env.travis .env - php artisan key:generate - php artisan migrate - php artisan db:seed diff --git a/app/Place.php b/app/Place.php index 52576b81..cc7a3341 100644 --- a/app/Place.php +++ b/app/Place.php @@ -84,8 +84,9 @@ class Place extends Model // id can’t be null, so this will return empty set return $query->whereNull('id'); } + return $query->where('external_urls', '@>', json_encode([ - $type => $url + $type => $url, ])); } From cfea8c29c99f3fd508c1fc3ab7ba619764789c48 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 13:54:50 +0100 Subject: [PATCH 08/12] Test if new conosle command is causing travis issues --- app/Console/Kernel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index ebbc97f5..40a3d77c 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,7 +17,7 @@ class Kernel extends ConsoleKernel Commands\ParseCachedWebMentions::class, Commands\ReDownloadWebMentions::class, Commands\GenerateToken::class, - Commands\UpdatePlacesURLs::class, + //Commands\UpdatePlacesURLs::class, ]; /** From c2912781bfa8746002ecaa6e98ffea5e6994e5e4 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 14:01:26 +0100 Subject: [PATCH 09/12] Allow databases to be seeded again --- app/Place.php | 8 ++++---- database/seeds/PlacesTableSeeder.php | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/Place.php b/app/Place.php index cc7a3341..b594f752 100644 --- a/app/Place.php +++ b/app/Place.php @@ -130,17 +130,17 @@ class Place extends Model return config('app.shorturl') . '/places/' . $this->slug; } - public function setExternalUrlsAttribute($value) + public function setExternalUrlsAttribute($url) { - $type = $this->getType($value); + $type = $this->getType($url); if ($type === null) { - throw new \Exception('Unkown external url type'); + throw new \Exception('Unkown external url type ' . $url); } $already = []; if (array_key_exists('external_urls', $this->attributes)) { $already = json_decode($this->attributes['external_urls'], true); } - $already[$type] = $value; + $already[$type] = $url; $this->attributes['external_urls'] = json_encode($already); } diff --git a/database/seeds/PlacesTableSeeder.php b/database/seeds/PlacesTableSeeder.php index cef1ebb6..4b787536 100644 --- a/database/seeds/PlacesTableSeeder.php +++ b/database/seeds/PlacesTableSeeder.php @@ -17,10 +17,8 @@ class PlacesTableSeeder extends Seeder $place->name = 'The Bridgewater Pub'; $place->description = 'A lovely local pub with a decent selection of cask ales'; $place->location = new Point('53.4983', '-2.3805'); - $place->external_urls = json_encode([ - 'foursqaure' => 'https://foursqaure.com/v/123435/the-bridgewater-pub', - 'osm' => 'https://www.openstreetmap.org/way/987654', - ]); + $place->external_urls = 'https://foursquare.com/v/123435/the-bridgewater-pub'; + $place->external_urls = 'https://www.openstreetmap.org/way/987654'; $place->save(); } } From c0ad5c3f7d92e30196316349832ec1a6cdeae38e Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 14:05:32 +0100 Subject: [PATCH 10/12] Add back the console command --- app/Console/Kernel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 40a3d77c..ebbc97f5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,7 +17,7 @@ class Kernel extends ConsoleKernel Commands\ParseCachedWebMentions::class, Commands\ReDownloadWebMentions::class, Commands\GenerateToken::class, - //Commands\UpdatePlacesURLs::class, + Commands\UpdatePlacesURLs::class, ]; /** From 3188ee2ba3b6914b217ac6717c335c701be8f3d7 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 14:10:43 +0100 Subject: [PATCH 11/12] Remove helper function --- app/Console/Commands/UpdatePlacesURLs.php | 58 ----------------------- app/Console/Kernel.php | 1 - changelog.md | 1 - 3 files changed, 60 deletions(-) delete mode 100644 app/Console/Commands/UpdatePlacesURLs.php diff --git a/app/Console/Commands/UpdatePlacesURLs.php b/app/Console/Commands/UpdatePlacesURLs.php deleted file mode 100644 index 97a28f97..00000000 --- a/app/Console/Commands/UpdatePlacesURLs.php +++ /dev/null @@ -1,58 +0,0 @@ -places = Place::all(); - } - - /** - * Execute the console command. - * - * @return mixed - */ - public function handle() - { - foreach ($this->places as $place) { - if ($place->foursqaure !== null) { - $place->external_urls = $place->foursquare; - } - } - - $this->info('All Places have had their external URLs values updated to the new structure.'); - } -} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index ebbc97f5..0a0aa08d 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,7 +17,6 @@ class Kernel extends ConsoleKernel Commands\ParseCachedWebMentions::class, Commands\ReDownloadWebMentions::class, Commands\GenerateToken::class, - Commands\UpdatePlacesURLs::class, ]; /** diff --git a/changelog.md b/changelog.md index a83e59ba..8a1cd4d1 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,6 @@ ## Version {next} - Transition to using a JSON column for external urls of places - - Add a command to update external url structure of places ## Version 0.5.19 (2017-06-27) - Fix error in App\\WebMention.php From 91b82854865336be33c735fa9056107728539103 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 30 Jun 2017 14:47:25 +0100 Subject: [PATCH 12/12] Bump version number to 0.5.20 --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 8a1cd4d1..186985ca 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,6 @@ # Changelog -## Version {next} +## Version 0.5.20 (2017-06-30) - Transition to using a JSON column for external urls of places ## Version 0.5.19 (2017-06-27)