{"action":"created","comment":{"url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/comments/61325836","id":61325836,"diff_hunk":"@@ -0,0 +1,597 @@\n+#!/usr/bin/env node\n+\"use strict\";\n+\n+/**\n+ * Validation for market data\n+ *\n+ * This script processes all market files and checks if required and\n+ * optional attributes are present and set correctly. The opening hours\n+ * are checked by the opening_hours.js library.\n+ * If attributes are missing or are misconfigured warnings and errors\n+ * are output to the console. The script returns and an exit code of 0\n+ * if no error occured otherwise 1.\n+ */\n+\n+\n+var fs = require('fs');\n+var path = require(\"path\");\n+var colors = require('colors');\n+var moment = require('moment');\n+var opening_hours = require('opening_hours');\n+\n+\n+var MARKETS_DIR_PATH = \"./cities/\";\n+\n+var MAX_LATITUDE = 90.0;\n+var MIN_LATITUDE = -90.0;\n+var MAX_LONGITUDE = 180.0;\n+var MIN_LONGITUDE = -180.0;\n+\n+var exitCode = 0;\n+\n+\n+colors.setTheme({\n+    section: 'blue',\n+    market: 'yellow',\n+    passed: 'green',\n+    error: 'red'\n+});\n+\n+\n+/**\n+ * Reads in the given directory to process market files.\n+ * For each market file a market validator is created and executed.\n+ * Returns an exit code depended on the success or failure of the validation.\n+ */\n+fs.readdir(MARKETS_DIR_PATH, function (err, files) {\n+    if (err) {\n+        throw err;\n+    }\n+\n+    files.map(function(file) {\n+        return path.join(MARKETS_DIR_PATH, file);\n+    }).filter(function(file) {\n+        return fs.statSync(file).isFile();\n+    }).forEach(function(file) {\n+        console.log(\"\\n===> Validating %s ...\".section, file);\n+        var marketValidator = new MarketValidator(file);\n+        marketValidator.validate();\n+        console.log(\"\\n\");\n+    });\n+\n+    process.exit(exitCode);\n+});\n+\n+\n+/**\n+ * Validator for a market file.\n+ * Outputs warnings and errors to the console.\n+ * Updates the global exit code.\n+ *\n+ * - filePath: Path to the market file\n+ */\n+function MarketValidator(filePath) {\n+\n+    this.filePath = filePath;\n+    this.errorsCount = 0;\n+    this.warningsCount = 0;\n+\n+    this.validate = function() {\n+        var data = fs.readFileSync(this.filePath, 'utf8');\n+        var json = JSON.parse(data);\n+        var features = json.features;\n+        var cityName = this.getCityName();\n+\n+        var featuresValidator = new FeaturesValidator(features, cityName);\n+        featuresValidator.validate();\n+        featuresValidator.printIssues();\n+        this.errorsCount += featuresValidator.getErrorsCount();\n+        this.warningsCount += featuresValidator.getWarningsCount();\n+\n+        var metadataValidator = new MetadataValidator(json.metadata);\n+        metadataValidator.validate();\n+        metadataValidator.printWarnings();\n+        metadataValidator.printErrors();\n+        this.errorsCount += metadataValidator.getErrorsCount();\n+        this.warningsCount += metadataValidator.getWarningsCount();\n+\n+        this.printSummary();\n+\n+        if (this.errorsCount !== 0) {\n+            exitCode = 1;\n+        }\n+    };\n+\n+    this.getCityName = function() {\n+        return path.basename(this.filePath, path.extname(this.filePath));\n+    };\n+\n+\n+    this.printSummary = function() {\n+        if (this.errorsCount === 0) {\n+            this.printSuccess();\n+\n+        } else {\n+            this.printFailure();\n+        }\n+    };\n+\n+    this.printSuccess = function() {\n+        if (this.warningsCount === 0) {\n+            console.log(\"\\nValidation PASSED without warnings or errors.\".passed);\n+        } else {\n+            console.log(\"\\nValidation PASSED with %d warning(s) and no errors.\".passed, this.warningsCount);\n+        }\n+    };\n+\n+    this.printFailure = function() {\n+        console.log(\"\\nValidation done. %d warning(s), %d error(s) detected.\".error, this.warningsCount, this.errorsCount);\n+    };\n+\n+}\n+\n+/**\n+ * Validator for an array of features.\n+ * Iterates the given features to validate them. After the validation, issues can be printed.\n+ *\n+ * - features: Array of features\n+ * - cityName: Name of the city the features belong to\n+ */\n+function FeaturesValidator(features, cityName) {\n+\n+    this.features = features;\n+    this.cityName = cityName;\n+    this.errorsCount = 0;\n+    this.warningsCount = 0;\n+    this.featureValidators = [];\n+\n+    this.validate = function() {\n+        for (var i = 0, length = features.length; i < length; ++i) {\n+            var feature = features[i];\n+            this.validateFeature(feature);\n+        }\n+    };\n+\n+    this.printIssues = function() {\n+        for (var i = 0, length = this.featureValidators.length; i < length; ++i) {\n+            var featureValidator = this.featureValidators[i];\n+            featureValidator.printWarnings();\n+            featureValidator.printErrors();\n+        }\n+    };\n+\n+    this.validateFeature = function(feature) {\n+        var featureValidator = new FeatureValidator(feature, this.cityName);\n+        featureValidator.validate();\n+        if (featureValidator.hasErrors()) {\n+            this.errorsCount += featureValidator.getErrorsCount();\n+        }\n+        if (featureValidator.hasWarnings()) {\n+            this.warningsCount += featureValidator.getWarningsCount();\n+        }\n+        this.featureValidators.push(featureValidator);\n+    };\n+\n+    this.getErrorsCount = function() {\n+        return this.errorsCount;\n+    };\n+\n+    this.getWarningsCount = function() {\n+        return this.warningsCount;\n+    };\n+\n+}\n+\n+/**\n+ * Validator for a single feature.\n+ * After the validation, warnings and errors can be printed.\n+ *\n+ * - feature: A single feature\n+ * - cityName: Name of the city the feature belongs to\n+ */\n+function FeatureValidator(feature, cityName) {\n+\n+    this.feature = feature;\n+    this.cityName = cityName;\n+    this.errors = [];\n+    this.warnings = [];\n+\n+    this.validate = function() {\n+        var feature = this.feature;\n+        if (feature === undefined) {\n+            this.errors.push(new CustomIssue(\"Feature cannot be undefined.\"));\n+        } else if (feature === null) {\n+            this.errors.push(new CustomIssue(\"Feature cannot be null.\"));\n+        } else if (feature === {}) {\n+            this.errors.push(new CustomIssue(\"Feature cannot be an empty object.\"));\n+        } else {\n+            this.validateGeometry(feature.geometry);\n+            this.validateProperties(feature.properties);\n+            this.validateType(feature.type);\n+        }\n+    };\n+\n+    this.printErrors = function() {\n+        if (this.hasErrors()) {\n+            this.printMarketTitle();\n+        }\n+        for (var i = 0, length = this.errors.length; i < length; ++i) {\n+            var error = this.errors[i];\n+            console.log(\"Error: %s\", error.toString());\n+        }\n+    };\n+\n+    this.printWarnings = function() {\n+        if (this.hasWarnings()) {\n+            this.printMarketTitle();\n+        }\n+        for (var i = 0, length = this.warnings.length; i < length; ++i) {\n+            var warning = this.warnings[i];\n+            console.log(\"Warning: %s\", warning.toString());\n+        }\n+    };\n+\n+    this.validateProperties = function(properties) {\n+        if (properties === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"properties\"));\n+        } else if (properties === null) {\n+            this.errors.push(new NullAttributeIssue(\"properties\"));\n+        } else if (properties === {}) {\n+            this.errors.push(new EmptyObjectIssue(\"properties\"));\n+        } else {\n+            this.validateTitle(properties.title);\n+            this.validateLocation(properties.location);\n+            var openingHours = properties.opening_hours;\n+            var openingHoursUnclassified = properties.opening_hours_unclassified;\n+            if (openingHours === null) {\n+                this.validateOpeningHoursIsNull(openingHours);\n+                this.validateOpeningHoursUnclassifiedIsNotNull(openingHoursUnclassified);\n+            } else {\n+                this.validateOpeningHours(openingHours);\n+                this.validateOpeningHoursUnclassifiedIsNull(openingHoursUnclassified);\n+            }\n+        }\n+    };\n+\n+    this.validateTitle = function(title) {\n+        if (title === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"title\"));\n+        } else if (title === null) {\n+            this.errors.push(new NullAttributeIssue(\"title\"));\n+        } else if (title.length === 0) {\n+            this.errors.push(new EmptyAttributeIssue(\"title\"));\n+        }\n+    };\n+\n+    this.validateLocation = function(location) {\n+        if (location === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"location\"));\n+        } else if (location === null) {\n+            // Attribute \"location\" is optional.\n+        } else if (location.length === 0) {\n+            this.errors.push(new EmptyAttributeIssue(\"location\"));\n+        }\n+    };\n+\n+    this.validateOpeningHours = function(openingHours) {\n+        if (openingHours === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"opening_hours\"));\n+            return;\n+        }\n+        var oh;\n+        try {\n+            oh = new opening_hours(openingHours);\n+            var warnings = oh.getWarnings();\n+            if (warnings.length > 0) {\n+                this.errors.push(warnings);\n+            }\n+        } catch (error) {\n+            this.errors.push(error.toString());\n+        }\n+    };\n+\n+    this.validateOpeningHoursIsNull = function(openingHours) {\n+        if (openingHours !== null) {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'opening_hours' must be null when 'opening_hours_unclassified' is used.\"));\n+        }\n+    };\n+\n+    this.validateOpeningHoursUnclassifiedIsNull = function(openingHoursUnclassified) {\n+        if (openingHoursUnclassified === undefined) {\n+            // Attribute \"opening_hours_unclassified\" is optional.\n+            return;\n+        }\n+        if (openingHoursUnclassified !== null) {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'opening_hours_unclassified' must be null when 'opening_hours' is used.\"));\n+        }\n+    };\n+\n+    this.validateOpeningHoursUnclassifiedIsNotNull = function(openingHoursUnclassified) {\n+        if (openingHoursUnclassified === undefined) {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'opening_hours_unclassified' cannot be undefined when 'opening_hours' is null.\"));\n+        } else if (openingHoursUnclassified === null) {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'opening_hours_unclassified' cannot be null when 'opening_hours' is null.\"));\n+        } else if (openingHoursUnclassified === \"\") {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'opening_hours_unclassified' cannot be empty when 'opening_hours' is null.\"));\n+        }\n+    };\n+\n+    this.validateGeometry = function(geometry) {\n+        if (geometry === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"geometry\"));\n+        } else if (geometry === null) {\n+            this.errors.push(new NullAttributeIssue(\"geometry\"));\n+        } else if (geometry === {}) {\n+            this.errors.push(new EmptyObjectIssue(\"geometry\"));\n+        } else {\n+            this.validateCoordinates(geometry.coordinates);\n+            this.validateGeometryType(geometry.type);\n+        }\n+    };\n+\n+    this.validateCoordinates = function(coordinates) {\n+        if (coordinates === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"coordinates\"));\n+        } else if (coordinates === null) {\n+            this.errors.push(new NullAttributeIssue(\"coordinates\"));\n+        } else if (coordinates.length !== 2) {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'coordinates' must contain two values not \" + coordinates.length + \".\"));\n+        } else {\n+            var lon = coordinates[0];\n+            if (!longitudeInValidRange(lon)) {\n+                this.errors.push(new LongitudeRangeExceedanceIssue(\"coordinates[0]\", lon));\n+            }\n+            var lat = coordinates[1];\n+            if (!latitudeInValidRange(lat)) {\n+                this.errors.push(new LatitudeRangeExceedanceIssue(\"coordinates[1]\", lat));\n+            }\n+        }\n+    };\n+\n+    this.validateGeometryType = function(type) {\n+        if (type !== \"Point\") {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'geometry.type' must be 'Point' not '\" + type + \"'.\"));\n+        }\n+    };\n+\n+    this.validateType = function(type) {\n+        if (type !== \"Feature\") {\n+            this.errors.push(new CustomIssue(\n+                \"Attribute 'type' must be 'Feature' not '\" + type + \"'.\"));\n+        }\n+    };\n+\n+    this.getErrorsCount = function() {\n+        return this.errors.length;\n+    };\n+\n+    this.getWarningsCount = function() {\n+        return this.warnings.length;\n+    };\n+\n+    this.hasErrors = function() {\n+        return this.errors.length > 0;\n+    };\n+\n+    this.hasWarnings = function() {\n+        return this.warnings.length > 0;\n+    };\n+\n+    this.printMarketTitle = function() {\n+        console.log(\"\\n%s: %s\".market,\n+            this.cityName.toUpperCase(),\n+            this.feature.properties.title);\n+    };\n+\n+}\n+\n+/**\n+ * Validator for a the \"metadata\" attribute.\n+ * After the validation, warnings and errors can be printed.\n+ *\n+ * - metadata: The \"metadata\" attribute\n+ */\n+function MetadataValidator(metadata) {\n+\n+    this.metadata = metadata;\n+    this.errors = [];\n+    this.warnings = [];\n+\n+    this.validate = function() {\n+        var metadata = this.metadata;\n+        if (metadata === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"metadata\"));\n+        } else if (metadata === null) {\n+            this.errors.push(new NullAttributeIssue(\"metadata\"));\n+        } else {\n+            this.validateDataSource(metadata.data_source);\n+        }\n+    };\n+\n+    this.printErrors = function() {\n+        for (var i = 0, length = this.errors.length; i < length; ++i) {\n+            var error = this.errors[i];\n+            console.log(error.toString());\n+        }\n+    };\n+\n+    this.printWarnings = function() {\n+        for (var i = 0, length = this.warnings.length; i < length; ++i) {\n+            var warning = this.warnings[i];\n+            console.log(warning.toString());\n+        }\n+    };\n+\n+    this.validateDataSource = function(dataSource) {\n+        if (dataSource === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"data_source\"));\n+        } else if (dataSource === null) {\n+            this.errors.push(new NullAttributeIssue(\"data_source\"));\n+        } else {\n+            this.validateTitle(dataSource.title);\n+            this.validateUrl(dataSource.url);\n+        }\n+    };\n+\n+    this.validateTitle = function(title) {\n+        if (title === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"title\"));\n+        } else if (title === null) {\n+            this.errors.push(new NullAttributeIssue(\"title\"));\n+        } else if (title.length === 0) {\n+            this.errors.push(new EmptyAttributeIssue(\"title\"));\n+        }\n+    };\n+\n+    this.validateUrl = function(url) {\n+        if (url === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"url\"));\n+        } else if (url === null) {\n+            this.errors.push(new NullAttributeIssue(\"url\"));\n+        } else if (url.length === 0) {\n+            this.errors.push(new EmptyAttributeIssue(\"url\"));\n+        }\n+    };\n+\n+    this.validateMapInitialization = function(mapInitialization) {\n+        if (mapInitialization === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"map_initialization\"));\n+        } else if (mapInitialization === null) {\n+            this.errors.push(new NullAttributeIssue(\"map_initialization\"));\n+        } else {\n+            this.validateCoordinates(mapInitialization.coordinates);\n+            this.validateZoomLevel(mapInitialization.zoom_level);\n+        }\n+    };\n+\n+    this.validateCoordinates = function(coordinates) {\n+        if (coordinates === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"coordinates\"));\n+        } else if (coordinates === null) {\n+            this.errors.push(new NullAttributeIssue(\"coordinates\"));\n+        } else if (coordinates.length === 2) {\n+            this.errors.push(\n+                \"Attribute 'coordinates' must contain two values not \" + coordinates.length + \".\");\n+        } else {\n+            var lon = coordinates[0];\n+            if (!longitudeInValidRange(lon)) {\n+                this.errors.push(new LongitudeRangeExceedanceIssue(\"coordinates[0]\", lon));\n+            }\n+            var lat = coordinates[1];\n+            if (!latitudeInValidRange(lat)) {\n+                this.errors.push(new LatitudeRangeExceedanceIssue(\"coordinates[1]\", lat));\n+            }\n+        }\n+    };\n+\n+    this.validateZoomLevel = function(zoomLevel) {\n+        if (zoomLevel === undefined) {\n+            this.errors.push(new UndefinedAttributeIssue(\"zoom_level\"));\n+        } else if (zoomLevel === null) {\n+            this.errors.push(new NullAttributeIssue(\"zoom_level\"));\n+        } else if (zoomLevel < 1 || zoomLevel > 18) {\n+            this.errors.push(new RangeExceedanceIssue(\"zoom_level\", 1, 18, zoomLevel));\n+        }\n+    };\n+\n+    this.getErrorsCount = function() {\n+        return this.errors.length;\n+    };\n+\n+    this.getWarningsCount = function() {\n+        return this.warnings.length;\n+    };\n+\n+    this.hasErrors = function() {\n+        return this.errors.length > 0;\n+    };\n+\n+    this.hasWarnings = function() {\n+        return this.warnings.length > 0;\n+    };\n+\n+}\n+\n+\n+function latitudeInValidRange(lat) {\n+    return (lat > MIN_LATITUDE && lat <= MAX_LATITUDE);\n+}\n+\n+function longitudeInValidRange(lon) {\n+    return (lon > MIN_LONGITUDE && lon <= MAX_LONGITUDE);\n+}\n+\n+\n+function CustomIssue(message) {\n+\n+    this.message = message;\n+\n+    this.toString = function() {\n+        return this.message;\n+    };\n+}\n+\n+function UndefinedAttributeIssue(attributeName) {\n+\n+    this.attributeName = attributeName;\n+\n+    this.toString = function() {\n+        return \"Attribute '\" + this.attributeName + \"' cannot be undefined.\";\n+    };\n+}\n+\n+\n+function NullAttributeIssue(attributeName) {\n+\n+    this.attributeName = attributeName;\n+\n+    this.toString = function() {\n+        return \"Attribute '\" + this.attributeName + \"' cannot be null.\";\n+    };\n+}\n+\n+function EmptyAttributeIssue(attributeName) {\n+\n+    this.attributeName = attributeName;\n+\n+    this.toString = function() {\n+        return \"Attribute '\" + this.attributeName + \"' cannot be empty.\";\n+    };\n+}\n+\n+function EmptyObjectIssue(attributeName) {","path":"validation/markets-validator.js","position":569,"original_position":569,"commit_id":"9a6ad06576bb7ba9a0501ae3c2d68e5414577d5c","original_commit_id":"9a6ad06576bb7ba9a0501ae3c2d68e5414577d5c","user":{"login":"torfsen","id":2877717,"avatar_url":"https://avatars.githubusercontent.com/u/2877717?v=3","gravatar_id":"","url":"https://api.github.com/users/torfsen","html_url":"https://github.com/torfsen","followers_url":"https://api.github.com/users/torfsen/followers","following_url":"https://api.github.com/users/torfsen/following{/other_user}","gists_url":"https://api.github.com/users/torfsen/gists{/gist_id}","starred_url":"https://api.github.com/users/torfsen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/torfsen/subscriptions","organizations_url":"https://api.github.com/users/torfsen/orgs","repos_url":"https://api.github.com/users/torfsen/repos","events_url":"https://api.github.com/users/torfsen/events{/privacy}","received_events_url":"https://api.github.com/users/torfsen/received_events","type":"User","site_admin":false},"body":"Please document this function.","created_at":"2016-04-27T20:01:56Z","updated_at":"2016-04-27T20:01:57Z","html_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63#discussion_r61325836","pull_request_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63","_links":{"self":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/comments/61325836"},"html":{"href":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63#discussion_r61325836"},"pull_request":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63"}}},"pull_request":{"url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63","id":67090372,"html_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63","diff_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63.diff","patch_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63.patch","issue_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/63","number":63,"state":"open","locked":false,"title":"Validate markets data.","user":{"login":"johnjohndoe","id":144518,"avatar_url":"https://avatars.githubusercontent.com/u/144518?v=3","gravatar_id":"","url":"https://api.github.com/users/johnjohndoe","html_url":"https://github.com/johnjohndoe","followers_url":"https://api.github.com/users/johnjohndoe/followers","following_url":"https://api.github.com/users/johnjohndoe/following{/other_user}","gists_url":"https://api.github.com/users/johnjohndoe/gists{/gist_id}","starred_url":"https://api.github.com/users/johnjohndoe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johnjohndoe/subscriptions","organizations_url":"https://api.github.com/users/johnjohndoe/orgs","repos_url":"https://api.github.com/users/johnjohndoe/repos","events_url":"https://api.github.com/users/johnjohndoe/events{/privacy}","received_events_url":"https://api.github.com/users/johnjohndoe/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-04-19T21:09:52Z","updated_at":"2016-04-27T20:01:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e2c3b3ba3b9bbe7b5d68bad496360646f51c53de","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63/commits","review_comments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63/comments","review_comment_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/63/comments","statuses_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/statuses/9a6ad06576bb7ba9a0501ae3c2d68e5414577d5c","head":{"label":"wo-ist-markt:markets-validation-44","ref":"markets-validation-44","sha":"9a6ad06576bb7ba9a0501ae3c2d68e5414577d5c","user":{"login":"wo-ist-markt","id":17050186,"avatar_url":"https://avatars.githubusercontent.com/u/17050186?v=3","gravatar_id":"","url":"https://api.github.com/users/wo-ist-markt","html_url":"https://github.com/wo-ist-markt","followers_url":"https://api.github.com/users/wo-ist-markt/followers","following_url":"https://api.github.com/users/wo-ist-markt/following{/other_user}","gists_url":"https://api.github.com/users/wo-ist-markt/gists{/gist_id}","starred_url":"https://api.github.com/users/wo-ist-markt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wo-ist-markt/subscriptions","organizations_url":"https://api.github.com/users/wo-ist-markt/orgs","repos_url":"https://api.github.com/users/wo-ist-markt/repos","events_url":"https://api.github.com/users/wo-ist-markt/events{/privacy}","received_events_url":"https://api.github.com/users/wo-ist-markt/received_events","type":"Organization","site_admin":false},"repo":{"id":51015602,"name":"wo-ist-markt.github.io","full_name":"wo-ist-markt/wo-ist-markt.github.io","owner":{"login":"wo-ist-markt","id":17050186,"avatar_url":"https://avatars.githubusercontent.com/u/17050186?v=3","gravatar_id":"","url":"https://api.github.com/users/wo-ist-markt","html_url":"https://github.com/wo-ist-markt","followers_url":"https://api.github.com/users/wo-ist-markt/followers","following_url":"https://api.github.com/users/wo-ist-markt/following{/other_user}","gists_url":"https://api.github.com/users/wo-ist-markt/gists{/gist_id}","starred_url":"https://api.github.com/users/wo-ist-markt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wo-ist-markt/subscriptions","organizations_url":"https://api.github.com/users/wo-ist-markt/orgs","repos_url":"https://api.github.com/users/wo-ist-markt/repos","events_url":"https://api.github.com/users/wo-ist-markt/events{/privacy}","received_events_url":"https://api.github.com/users/wo-ist-markt/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io","description":"A small visualization of the weekly markets in different cities.","fork":false,"url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io","forks_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/forks","keys_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/teams","hooks_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/hooks","issue_events_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/events","assignees_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/tags","blobs_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/languages","stargazers_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/stargazers","contributors_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/contributors","subscribers_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/subscribers","subscription_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/subscription","commits_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/merges","archive_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/downloads","issues_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/labels{/name}","releases_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/deployments","created_at":"2016-02-03T17:03:27Z","updated_at":"2016-04-21T11:09:16Z","pushed_at":"2016-04-27T20:00:53Z","git_url":"git://github.com/wo-ist-markt/wo-ist-markt.github.io.git","ssh_url":"git@github.com:wo-ist-markt/wo-ist-markt.github.io.git","clone_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io.git","svn_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io","homepage":"http://wo-ist-markt.de","size":511,"stargazers_count":8,"watchers_count":8,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":24,"mirror_url":null,"open_issues_count":30,"forks":24,"open_issues":30,"watchers":8,"default_branch":"master"}},"base":{"label":"wo-ist-markt:master","ref":"master","sha":"f54ec19a17d992643387edb10de661da986a8559","user":{"login":"wo-ist-markt","id":17050186,"avatar_url":"https://avatars.githubusercontent.com/u/17050186?v=3","gravatar_id":"","url":"https://api.github.com/users/wo-ist-markt","html_url":"https://github.com/wo-ist-markt","followers_url":"https://api.github.com/users/wo-ist-markt/followers","following_url":"https://api.github.com/users/wo-ist-markt/following{/other_user}","gists_url":"https://api.github.com/users/wo-ist-markt/gists{/gist_id}","starred_url":"https://api.github.com/users/wo-ist-markt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wo-ist-markt/subscriptions","organizations_url":"https://api.github.com/users/wo-ist-markt/orgs","repos_url":"https://api.github.com/users/wo-ist-markt/repos","events_url":"https://api.github.com/users/wo-ist-markt/events{/privacy}","received_events_url":"https://api.github.com/users/wo-ist-markt/received_events","type":"Organization","site_admin":false},"repo":{"id":51015602,"name":"wo-ist-markt.github.io","full_name":"wo-ist-markt/wo-ist-markt.github.io","owner":{"login":"wo-ist-markt","id":17050186,"avatar_url":"https://avatars.githubusercontent.com/u/17050186?v=3","gravatar_id":"","url":"https://api.github.com/users/wo-ist-markt","html_url":"https://github.com/wo-ist-markt","followers_url":"https://api.github.com/users/wo-ist-markt/followers","following_url":"https://api.github.com/users/wo-ist-markt/following{/other_user}","gists_url":"https://api.github.com/users/wo-ist-markt/gists{/gist_id}","starred_url":"https://api.github.com/users/wo-ist-markt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wo-ist-markt/subscriptions","organizations_url":"https://api.github.com/users/wo-ist-markt/orgs","repos_url":"https://api.github.com/users/wo-ist-markt/repos","events_url":"https://api.github.com/users/wo-ist-markt/events{/privacy}","received_events_url":"https://api.github.com/users/wo-ist-markt/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io","description":"A small visualization of the weekly markets in different cities.","fork":false,"url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io","forks_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/forks","keys_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/teams","hooks_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/hooks","issue_events_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/events","assignees_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/tags","blobs_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/languages","stargazers_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/stargazers","contributors_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/contributors","subscribers_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/subscribers","subscription_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/subscription","commits_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/merges","archive_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/downloads","issues_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/labels{/name}","releases_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/deployments","created_at":"2016-02-03T17:03:27Z","updated_at":"2016-04-21T11:09:16Z","pushed_at":"2016-04-27T20:00:53Z","git_url":"git://github.com/wo-ist-markt/wo-ist-markt.github.io.git","ssh_url":"git@github.com:wo-ist-markt/wo-ist-markt.github.io.git","clone_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io.git","svn_url":"https://github.com/wo-ist-markt/wo-ist-markt.github.io","homepage":"http://wo-ist-markt.de","size":511,"stargazers_count":8,"watchers_count":8,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":24,"mirror_url":null,"open_issues_count":30,"forks":24,"open_issues":30,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63"},"html":{"href":"https://github.com/wo-ist-markt/wo-ist-markt.github.io/pull/63"},"issue":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/63"},"comments":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/issues/63/comments"},"review_comments":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63/comments"},"review_comment":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/pulls/63/commits"},"statuses":{"href":"https://api.github.com/repos/wo-ist-markt/wo-ist-markt.github.io/statuses/9a6ad06576bb7ba9a0501ae3c2d68e5414577d5c"}}}}