commit
1d3f134408
|
@ -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:
|
|
@ -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 🔶
|
||||
-->
|
|
@ -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
|
||||
}
|
||||
|
||||
-->
|
|
@ -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
|
||||
|
|
10
circle.yml
10
circle.yml
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}]
|
||||
}
|
||||
}
|
|
@ -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} ✨"
|
|
@ -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
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue