Merge pull request #275 from dkhamsing/structure

New Repo Structure
This commit is contained in:
dkhamsing 2016-05-11 09:00:56 -07:00
commit 1d3f134408
9 changed files with 410 additions and 126 deletions

53
.github/CONTRIBUTING.md vendored Normal file
View File

@ -0,0 +1,53 @@
To contribute to`open-source-ios-apps`, please update the **contents.json** file (this will generate the README)
## New category
Please [open an issue](https://github.com/dkhamsing/open-source-ios-apps/issues) and contact
@dkhamsing, @kvnbautista or @scribblemaniac
## New app
Adding a `JSON` entry
### New entries go to the end of the file
At the end of **contents.json**, add an entry at `}]`
```js
"stars": 100
}] // here
}
```
Insert a comma between `}` and `]` and create a new entry with the format below.
### Format
At minimum
```js
{
"title": "MrCode",
"category": "github",
"description": "GitHub iPhone app that can cache Markdown content",
"source": "https://github.com/haolloyin/MrCode" // note, no comma on last line
}
```
Optionally
```js
{
"title": "App name",
"category": ["github", "parse"],
"description": "Describe what this app does",
"lang": "zho",
"source": "https://github.com/user/repo",
"homepage": "https://awesome-url",
"itunes": "https://itunes.apple.com/app/id1234567890",
"tags": ["swift"],
"stars": 200 // number of GitHub stars
}
```
Thanks for contributing :tada:

View File

@ -1,20 +0,0 @@
<!-- Thanks for contributing to open-source-ios-apps 😊 -->
<!-- When making an addition: -->
1. [ ] Project URL:
2. [ ] One project per pull request
3. [ ] Insert the project in alphabetical order
4. [ ] Avoid iOS or open-source in description as it is assumed
5. [ ] Use this commit title format if applicable: Add app-name by @github-username
6. [ ] Use approved format for your entry (use 🔶 for Swift projects)
<!-- Approved Format
- App name: Short description 🔶
- source url, i.e. https://github.com/username/project
- https://itunes.apple.com/app/app-name/id-zzz
or
- [App name](source url): Short description 🔶
-->

42
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,42 @@
<!-- Thanks for contributing to open-source-ios-apps 😊 -->
**Please do not edit the README, instead make changes to `contents.json` **
<!-- To create a new category, please open an issue (see CONTRIBUTING) -->
<!-- When making an addition: -->
1. [ ] Project URL:
2. [ ] One project per pull request
3. [ ] Insert the project in alphabetical order
4. [ ] Avoid iOS or open-source in description as it is assumed
5. [ ] Use this commit title format if applicable: Add app-name by @github-username
6. [ ] Use approved format for your entry (use 🔶 for Swift projects)
<!-- Approved Format
At minimum
{
"title": "MrCode",
"category": "github",
"description": "GitHub iPhone app that can cache Markdown content",
"source": "https://github.com/haolloyin/MrCode" // note, no comma on last line
}
Optionally
{
"title": "MrCode",
"category": ["github", "parse"],
"description": "GitHub iPhone app that can cache Markdown content",
"lang": "zho",
"source": "https://github.com/haolloyin/MrCode",
"homepage": "https://awesome-url",
"itunes": "https://itunes.apple.com/app/id1234567890",
"tags": ["swift"],
"stars": 200
}
-->

View File

@ -1,5 +1,9 @@
# Open-Source iOS Apps
<!--
⚠️ This README is generated, please do not update. To contribute, make changes to contents.json ⚠️
-->
A collaborative list of open-source iOS apps, your [contribution](https://github.com/dkhamsing/open-source-ios-apps/issues) [is](https://github.com/dkhamsing/open-source-ios-apps/pulls) [welcome](#contact) :smile:
Jump to

View File

@ -4,8 +4,16 @@ machine:
test:
pre:
- gem install awesome_bot
- sudo pip install json-spec
override:
- awesome_bot README.md --white-list developer.apple
- awesome_bot contents.json --white-list developer.apple
- json validate --schema-file=schema.json --document-file=contents.json
general:
artifacts:
- "ab-results.json"
deployment:
master:
branch: master
commands:
- ruby convert.md
- ./deploy.sh

View File

@ -1,8 +1,8 @@
{
"title": "Open-Source iOS Apps",
"description": "A collaborative list of open-source iOS apps, your [contribution](https://github.com/dkhamsing/open-source-ios-apps/issues) [is](https://github.com/dkhamsing/open-source-ios-apps/pulls) [welcome](#contact) :smile:",
"description": "<!-- \n⚠ This README is generated, please do not update. To contribute, make changes to contents.json ⚠️ \n--> \n\nA collaborative list of open-source iOS apps, your [contribution](https://github.com/dkhamsing/open-source-ios-apps/issues) [is](https://github.com/dkhamsing/open-source-ios-apps/pulls) [welcome](#contact) :smile:",
"header": "```\n🔶 Swift projects\n\nProjects that are not in English have a flag\n🇨🇳 Project is in Chinese\n🇪🇸 Project is in Spanish, etc\n\n 100+ Stars: 🔥\n 200+ Stars: 🔥🔥\n 500+ Stars: 🔥🔥🔥\n1000+ Stars: 🔥🔥🔥🔥\n2000+ Stars: 🔥🔥🔥🔥🔥\n```",
"footer": "## Bonus\n\nSee [archive](archive.md), [mac-apps](https://github.com/jeffreyjackson/mac-apps), [awesome-osx](https://github.com/iCHAIT/awesome-osx) and [android-apps](https://github.com/pcqpcq/open-source-android-apps).\n\n## Thanks\n\nThis list was inspired by [awesome-ios](https://github.com/vsouza/awesome-ios) and [awesome-swift](https://github.com/matteocrippa/awesome-swift).\n\n## Contact\n\n- [github.com/dkhamsing](https://github.com/dkhamsing)\n- [twitter.com/dkhamsing](https://twitter.com/dkhamsing)\n\n[Cherry]: https://github.com/kenshin03/Cherry\n[Done]: https://github.com/FancyPixel/done-swift\n[HN Reader]: https://github.com/Dimillian/SwiftHN\n[HN Reader on the App Store]: https://itunes.apple.com/app/hn-reader-hacker-news-reader/id919243741\n[iBeaconTasks]: https://github.com/TomekB/iBeaconTasks\n[extvplayer]: https://github.com/IGRSoft/exTVPlayer\n[Firefox]: https://github.com/mozilla/firefox-ios\n[Firefox on the App Store]: https://itunes.apple.com/app/firefox-web-browser/id989804926\n[Jim]: https://github.com/kylejm/Jim\n[KTPomodoro]: https://github.com/kenshin03/KTPomodoro\n[NortalTechDay]: https://github.com/mikkoj/NortalTechDay\n[ParseDeveloperDay]: https://github.com/ParsePlatform/ParseDeveloperDay\n[Provenance]: https://github.com/jasarien/Provenance\n[RealmToDo]: https://github.com/pietbrauer/RealmToDo\n[Toggl Timer]: https://github.com/toggl/mobile\n[Toggl Timer on the App Store]: https://itunes.apple.com/app/toggl-timer/id885767775\n[Tropos]: https://github.com/thoughtbot/Tropos\n[Tropos on the App Store]: https://itunes.apple.com/app/tropos-weather-forecasts-for/id955209376 \n[VLC]: https://github.com/videolan/vlc\n[VLC on the App Store]: https://itunes.apple.com/app/vlc-for-ios/id650377962\n[VLC videolan.org]: http://www.videolan.org/vlc/download-ios.html\n[WeatherApp]: https://github.com/jsphkhan/ReactNativeExamples/tree/master/ios/WeatherApp",
"footer": "## Bonus\n\nSee [archive](archive.md), [mac-apps](https://github.com/jeffreyjackson/mac-apps), [awesome-osx](https://github.com/iCHAIT/awesome-osx) and [android-apps](https://github.com/pcqpcq/open-source-android-apps).\n\n## Thanks\n\nThis list was inspired by [awesome-ios](https://github.com/vsouza/awesome-ios) and [awesome-swift](https://github.com/matteocrippa/awesome-swift). Thanks to all the [contributors](https://github.com/dkhamsing/open-source-ios-apps/graphs/contributors) 🎉 \n\n## Contact\n\n- [github.com/dkhamsing](https://github.com/dkhamsing)\n- [twitter.com/dkhamsing](https://twitter.com/dkhamsing)\n",
"categories": [{
"title": "Apple TV",
"id": "apple-tv"
@ -110,7 +110,7 @@
"id": "ionic",
"parent": "special"
}, {
"title": "parse",
"title": "Parse",
"id": "parse",
"parent": "special"
}, {
@ -151,12 +151,12 @@
"tags": ["swift"]
}, {
"title": "EX Player",
"category": "apple-tv",
"description": "Watch video from ex.ua on your TV",
"category": ["apple-tv", "media"],
"description": "Watch video from ex.ua",
"source": "https://github.com/IGRSoft/exTVPlayer"
}, {
"title": "Provenance",
"category": "apple-tv",
"category": ["apple-tv", "games"],
"description": "Frontend for multiple emulators, currently supporting Sega Genesis, SNES, NES, GB/GBC, & more",
"source": "https://github.com/jasarien/Provenance",
"stars": 1000
@ -238,7 +238,7 @@
"stars": 100
}, {
"title": "Done",
"category": "apple-watch",
"category": ["apple-watch", "realm"],
"description": "Data sharing between a WatchKit app and its main app using Realm",
"source": "https://github.com/FancyPixel/done-swift",
"tags": ["swift"]
@ -278,8 +278,8 @@
"tags": ["swift"]
}, {
"title": "HN Reader",
"category": "apple-watch",
"description": "Hacker News Reader ([HN Reader on the App Store][])",
"category": ["apple-watch", "hacker-news"],
"description": "Hacker News Reader",
"source": "https://github.com/Dimillian/SwiftHN",
"itunes": "https://itunes.apple.com/app/hn-reader-hacker-news-reader/id919243741",
"stars": 500,
@ -388,7 +388,7 @@
}, {
"title": "Brave",
"category": "browser",
"description": "[Firefox][]-based browser with ad blocking built in (also blocks tracking pixels/cookies)",
"description": "Firefox-based browser with ad blocking built in (also blocks tracking pixels/cookies)",
"source": "https://github.com/brave/browser-ios",
"stars": 200,
"tags": ["swift"]
@ -400,7 +400,7 @@
"itunes": "https://itunes.apple.com/app/endless-browser/id974745755"
}, {
"title": "Firefox",
"category": "browser",
"category": ["browser", "official"],
"description": "Official Firefox app",
"source": "https://github.com/mozilla/firefox-ios",
"itunes": "https://itunes.apple.com/app/firefox-web-browser/id989804926",
@ -505,13 +505,13 @@
"tags": ["swift"]
}, {
"title": "NortalTechDay",
"category": "conference",
"category": ["conference", "react-native"],
"description": "Nortal TechDay 2015 app",
"source": "https://github.com/mikkoj/NortalTechDay",
"stars": 100
}, {
"title": "ParseDeveloperDay",
"category": "conference",
"category": ["conference", "react-native"],
"description": "Parse 2013 developer conference app",
"source": "https://github.com/ParsePlatform/ParseDeveloperDay"
}, {
@ -833,12 +833,6 @@
"description": "iOS Game created in SpriteKit",
"source": "https://github.com/Mav3r1ck/Orbit7",
"tags": ["swift"]
}, {
"title": "Provenance",
"category": "games",
"description": "Frontend for multiple emulators, currently supporting Sega Genesis, SNES, NES, GB/GBC, & more",
"source": "https://github.com/jasarien/Provenance",
"stars": 1000
}, {
"title": "Sakura Fly",
"category": "games",
@ -904,7 +898,7 @@
"tags": ["swift"]
}, {
"title": "Jim",
"category": "health",
"category": ["health", "parse"],
"description": "Track your gym workouts",
"source": "https://github.com/kylejm/Jim",
"tags": ["swift"]
@ -1021,7 +1015,7 @@
"tags": ["swift"]
}, {
"title": "iBeaconTasks",
"category": "location",
"category": ["location", "parse"],
"description": "iBeacon TODO reminder app based on Parse",
"source": "https://github.com/TomekB/iBeaconTasks"
}, {
@ -1080,8 +1074,8 @@
}, {
"title": "Smart Traveller (UberGuide)",
"category": "location",
"description": "(https://github.com/hACKbUSTER/UberGuide-iOS): Simple and comfortable way to explore a city using Uber API",
"source": "UberGuide",
"description": "Simple and comfortable way to explore a city using Uber API",
"source": "https://github.com/hACKbUSTER/UberGuide-iOS",
"stars": 100
}, {
"title": "VisitBCN",
@ -1156,11 +1150,6 @@
"source": "https://github.com/coderyi/Eleven",
"itunes": "https://itunes.apple.com/app/elevenplayer/id1033773648",
"stars": 200
}, {
"title": "EX Player",
"category": "media",
"description": "Watch video from ex.ua on iOS device",
"source": "https://github.com/IGRSoft/exTVPlayer"
}, {
"title": "Filterpedia",
"category": "media",
@ -1333,7 +1322,7 @@
"itunes": "https://itunes.apple.com/app/upupu/id508401854"
}, {
"title": "VLC",
"category": "media",
"category": ["media", "official"],
"description": "Media Player",
"source": "https://github.com/videolan/vlc",
"homepage": "https://www.videolan.org/",
@ -1453,14 +1442,6 @@
"source": "https://github.com/NikantVohra/HackerNewsClient-iOS",
"itunes": "https://itunes.apple.com/app/hn-app/id983203003",
"tags": ["swift"]
}, {
"title": "HN Reader",
"category": "hacker-news",
"description": "Hacker News Reader",
"source": "https://github.com/Dimillian/SwiftHN",
"itunes": "https://itunes.apple.com/app/hn-reader-hacker-news-reader/id919243741",
"stars": 500,
"tags": ["swift"]
}, {
"title": "News/YC",
"category": "hacker-news",
@ -1495,22 +1476,6 @@
"description": "Official DuckDuckGo app",
"source": "https://github.com/duckduckgo/ios/",
"itunes": "https://itunes.apple.com/app/duckduckgo-search-stories/id663592361"
}, {
"title": "Firefox",
"category": "official",
"description": "Official Firefox app",
"source": "https://github.com/mozilla/firefox-ios",
"itunes": "https://itunes.apple.com/app/firefox-web-browser/id989804926",
"stars": 2000,
"tags": ["swift"]
}, {
"title": "VLC",
"category": "official",
"description": "Official VLC app",
"source": "https://github.com/videolan/vlc",
"homepage": "https://www.videolan.org/",
"itunes": "https://itunes.apple.com/app/vlc-for-ios/id650377962",
"stars": 1000
}, {
"title": "WhiteHouse",
"category": "official",
@ -1670,7 +1635,7 @@
"title": "FreeOTP Authenticator",
"category": "security",
"description": "Two-Factor Authentication",
"homepage": "https://fedorahosted.org/freeotp/browser/ios",
"source": "https://fedorahosted.org/freeotp/browser/ios",
"itunes": "https://itunes.apple.com/app/freeotp/id872559395"
}, {
"title": "MasterPassword",
@ -1744,7 +1709,7 @@
"tags": ["swift"]
}, {
"title": "RealmToDo",
"category": "tasks",
"category": ["tasks", "realm"],
"description": "A small todo list with Realm integration",
"source": "https://github.com/pietbrauer/RealmToDo",
"tags": ["swift"]
@ -1816,15 +1781,15 @@
"tags": ["swift"]
}, {
"title": "Tropos",
"category": "weather",
"category": ["weather", "reactivecocoa"],
"description": "A weather app using ReactiveCocoa and Forecast.io",
"source": "https://github.com/thoughtbot/Tropos",
"itunes": "https://itunes.apple.com/app/tropos-weather-forecasts-for/id955209376",
"stars": 1000
}, {
"title": "WeatherApp",
"category": "weather",
"description": "Weather app using React Native",
"category": ["weather", "react-native"],
"description": "Weather app by jsphkhan using React Native",
"source": "https://github.com/jsphkhan/ReactNativeExamples/tree/master/ios/WeatherApp"
}, {
"title": "WeatherMap",
@ -2236,17 +2201,6 @@
"category": "parse",
"description": "Simple app to record how much things cost using Parse",
"source": "https://github.com/dkhamsing/how-much"
}, {
"title": "iBeaconTasks",
"category": "parse",
"description": "iBeacon TODO reminder app based on Parse",
"source": "https://github.com/TomekB/iBeaconTasks"
}, {
"title": "Jim",
"category": "parse",
"description": "Track your gym workouts",
"source": "https://github.com/kylejm/Jim",
"tags": ["swift"]
}, {
"title": "Parse-Challenge-App",
"category": "parse",
@ -2254,11 +2208,6 @@
"source": "https://github.com/TomekB/Parse-Challenge-App",
"itunes": "https://itunes.apple.com/app/lets-challenge-me/id944004497",
"stars": 100
}, {
"title": "ParseDeveloperDay",
"category": "parse",
"description": "2013 Developer Conference App",
"source": "https://github.com/ParsePlatform/ParseDeveloperDay"
}, {
"title": "ParseStore",
"category": "parse",
@ -2381,12 +2330,6 @@
"category": "react-native",
"description": "News app using YouTube playlists",
"source": "https://github.com/bradoyler/newswatch-react-native"
}, {
"title": "NortalTechDay",
"category": "react-native",
"description": "Conference app",
"source": "https://github.com/mikkoj/NortalTechDay",
"stars": 100
}, {
"title": "PocketNode",
"category": "react-native",
@ -2443,11 +2386,6 @@
"category": "react-native",
"description": "by JakeLin",
"source": "https://github.com/JakeLin/ReactNativeWeather"
}, {
"title": "WeatherApp",
"category": "react-native",
"description": "by jsphkhan",
"source": "https://github.com/jsphkhan/ReactNativeExamples/tree/master/ios/WeatherApp"
}, {
"title": "BrewMobile",
"category": "reactivecocoa",
@ -2506,13 +2444,6 @@
"description": "Google image search using RAC 4.0 and Swift 2.1",
"source": "https://github.com/Adlai-Holler/SwiftRACGoogleImages",
"tags": ["swift"]
}, {
"title": "Tropos",
"category": "reactivecocoa",
"description": "A weather app using ReactiveCocoa and Forecast.io ([Tropos on the App Store][])",
"source": "https://github.com/thoughtbot/Tropos",
"itunes": "https://itunes.apple.com/app/tropos-weather-forecasts-for/id955209376",
"stars": 1000
}, {
"title": "GitHub API Client",
"category": "rxswift",
@ -2527,18 +2458,6 @@
"source": "https://github.com/artsy/eidolon",
"stars": 1000,
"tags": ["swift"]
}, {
"title": "Done",
"category": "realm",
"description": "Data sharing between a WatchKit app and its main app using Realm",
"source": "https://github.com/FancyPixel/done-swift",
"tags": ["swift"]
}, {
"title": "RealmToDo",
"category": "realm",
"description": "A small todo list with Realm integration",
"source": "https://github.com/pietbrauer/RealmToDo",
"tags": ["swift"]
}, {
"title": "Contacts",
"category": "viper",
@ -2567,4 +2486,4 @@
"itunes": "https://itunes.apple.com/app/toggl-timer/id885767775",
"stars": 100
}]
}
}

121
convert.rb Normal file
View File

@ -0,0 +1,121 @@
require 'json'
OUTPUT = 'README.md'
def output_stars(number)
case number
when 100...200
'🔥'
when 200...500
'🔥🔥'
when 500...1000
'🔥🔥🔥'
when 1000...2000
'🔥🔥🔥🔥'
when 2000...100000
'🔥🔥🔥🔥🔥'
end
end
def output_flag(lang)
case lang
when 'jpn'
'🇯🇵'
when 'ltz'
'🇱🇺'
when 'por'
'🇧🇷'
when 'spa'
'🇪🇸'
when 'zho'
'🇨🇳'
end
end
def apps_for_cat(apps, id)
s = apps.select do |a|
cat = a['category']
cat.class == Array ? cat.include?(id) : (cat == id)
end
s.sort_by { |k, v| k['title'] }
end
def output_apps(apps)
o = ''
apps.each do |a|
name = a['title']
link = a['source']
itunes = a['itunes']
homepage = a['homepage']
desc = a['description']
tags = a['tags']
stars = a['stars']
lang = a['lang']
o << "- #{name}"
if desc.nil?
o << ' '
else
o << ": #{desc} " if desc.size>0
end
unless tags.nil?
o << "🔶" if tags.include? 'swift'
end
unless lang.nil?
o << output_flag(lang)
end
unless stars.nil?
o << output_stars(stars)
end
o << "\n"
o << " - #{link}\n"
o << " - #{homepage}\n" unless homepage.nil?
o << " - #{itunes}\n" unless itunes.nil?
end
o
end
c = File.read 'contents.json'
j = JSON.parse c
t = j['title']
desc = j['description']
h = j['header']
f = j['footer']
cats = j['categories']
apps = j['projects']
output = '# ' + t
output << "\n\n"
output << desc
output << "\n \nJump to \n \n"
cats.each do |c|
temp = "#{' ' unless c['parent']==nil }- [#{c['title']}](\##{c['id']}) \n"
output << temp
end
output << "- [Bonus](#bonus)"
output << "\n \n"
output << h
output << "\n"
cats.each do |c|
temp = "\n#\##{'#' unless c['parent']==nil } #{c['title']} \n \n"
output << temp
cat_apps = apps_for_cat(apps, c['id'])
output << output_apps(cat_apps)
end
output << "\n"
output << f
File.open(OUTPUT, 'w') { |f| f.write output }
puts "wrote #{OUTPUT}"

14
deploy.sh Normal file
View File

@ -0,0 +1,14 @@
#!/bin/bash
set -e
git config user.name "Travis CI"
git config user.email "dkhamsing@users.noreply.github.com"
git checkout master
git add README.md
git commit -m "[auto] [ci skip] Generate README"
git push --quiet "https://${GH_TOKEN}@github.com/dkhamsing/open-source-ios-apps" master:master > /dev/null 2>&1

143
schema.json Normal file
View File

@ -0,0 +1,143 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"$id": "https://raw.githubusercontent.com/dkhamsing/open-source-ios-apps/master/schema.json",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"header": {
"type": "string"
},
"footer": {
"type": "string"
},
"categories": {
"type": "array",
"uniqueItems": true,
"items": {
"title": "Category Object",
"description": "A category to group project objects under.",
"properties": {
"title": {
"title": "Category Title",
"description": "A human-readable identifier for the category.",
"type": "string"
},
"id": {
"title": "Category Identifier",
"description": "A short identifier designed for programs. It should only contain lowercase alphanumeric characters and a - (dash) for replacing spaces.",
"type": "string",
"pattern": "^[^A-Z_ ]+$"
},
"description": {
"title": "Category Description",
"description": "A description of the category meant to be provided to the user.",
"type": "string",
"default": ""
},
"parent": {
"title": "Category Parent",
"description": "Makes the current category a subcategory of the category with an id that matches this value.",
"type": ["string", "null"],
"default": null
}
},
"required": ["title", "id"],
"additionalProperties": false
}
},
"projects": {
"type": "array",
"uniqueItems": true,
"items": {
"title": "Project Object",
"description": "An object that holds all the information for a specific project.",
"properties": {
"title": {
"title": "Project Title",
"description": "The official title of the project.",
"type": "string"
},
"category": {
"title": "Project Category",
"description": "The category or list of categories that the project falls under. If it is a list, the categories should be ordered from most to least relevant/applicable to the project.",
"type": ["string", "array"],
"items": {
"type": "string"
}
},
"description": {
"title": "Project Description",
"description": "A brief 1 sentence summary of the project.",
"type": "string"
},
"lang": {
"title": "Project Language",
"description": "A three-character ISO 639-2 code representing the primary language of the project, or a list of such codes, with the primary language first.",
"type": ["string", "array"],
"minLength": 3,
"maxLength": 3,
"minItems": 1,
"items": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"default": "eng"
},
"country": {
"title": "Project Country",
"description": "The country that the project operates out of or the country the project is designed for (if designed for a specific location). Null if country is unclear/unspecified.",
"type": ["string", "null"],
"minLength": 2,
"maxLength": 2,
"default": null
},
"source": {
"title": "Project Source",
"description": "A URL where the source code to the project can be found.",
"type": "string",
"pattern": "^https?:\\/\\/.*?\\..*$"
},
"homepage": {
"title": "Project Homepage",
"description": "The URL for the project's homepage.",
"type": ["string", "null"],
"pattern": "^https?:\\/\\/.*?\\..*$",
"default": null
},
"itunes": {
"title": "Project iTunes Page",
"description": "The URL for iTunes page for the project's app.",
"type": ["string", "null"],
"pattern": "^https:\\/\\/itunes\\.apple\\.com\\/(in\\/)?app\\/([^\\/]+\\/)?id[0-9]+$",
"default": null
},
"stars": {
"title": "Project Stars",
"description": "The number of stars a project has on Github, or null if the project is not a Github project.",
"type": ["null", "number"],
"multipleOf": 1.0,
"minimum": 0,
"default": null
},
"tags": {
"title": "Project Tags",
"description": "A place to put any metadata for a project. The items can be any type.",
"type": "array",
"default": []
}
},
"required": ["title", "category", "source"],
"additionalProperties": false
}
}
},
"required": ["title", "categories", "projects"],
"additionalProperties": false
}