Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
public/node_modules
35 changes: 23 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,29 @@
# hackathon
The ReactEurope hackathon.
News Reader using touchstonejs, flask, redis, reddit and twitter apis

The theme of the hackathon will be posted here on Friday June 26th 2015 at 2pm UTC.
## Installation

We have two challenge, you need to pick one:
- Challenge #1: build a mobile app using the meetup api that shows all reactjs meetup around the world, prize is a GoPro hero 4 sponsored by [RedBadger](http://red-badger.com/)
- Challenge #2: build an app using [touchstone.js](http://touchstonejs.io/), prize is €700 credit on Apple Store.
Go to public/ and
```
npm install
```
```
npm start
```

[See our blog post for more details on the challenges](https://medium.com/@patcito/hackathon-challenges-are-in-you-can-start-right-now-4905874b0ae2).
in the root directory start the Flask server with

Once the theme is posted, you will need to:
- fork this repo.
- create a directory containing your project.
- do a pull request once you're done, before Monday 29th of June, 2pm UTC if you will not be able to attend the hackathon at Mozilla office. **REQUIRED: In your pull request title, make to specify "challenge RedBadger" or "challenge Thinkmill" at the start of your PR's title**.
- you will still be able to update your pull request until July 1st 4pm UTC just like people attending the hackathon at Mozilla office.
**REQUIRED: In your pull request title, make to specify "challenge RedBadger" or "challenge Thinkmill" at the start of your PR's title. What could help: screenshots and a screencast in your PR, they can be posted as commets after the deadline**.
- The two winners will get 5 minutes each to present their app at the start of the lightning session on the 2nd of July at 6pm.
```
python main.py
```

NOTE : Requires Python 2.7+ and a running redis-server

## Screenshots

![First Screenshot"](https://github.com/RakanNimer/hackathon/blob/master/screenshots/1.png?raw=true "First Screenshot")

![Second Screenshot"](https://github.com/RakanNimer/hackathon/blob/master/screenshots/2.png?raw=true "Second Screenshot")

![Third Screenshot"](https://github.com/RakanNimer/hackathon/blob/master/screenshots/3.png?raw=true "Third Screenshot")
1 change: 1 addition & 0 deletions hackathon
Submodule hackathon added at 7b3a6d
46 changes: 46 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from flask import Flask
import flask
from reddit import Submissions
from reddit import Submission
import redis
import json

try:
from flask.ext.cors import CORS # The typical way to import flask-cors
except ImportError:
# Path hack allows examples to be run without installation.
import os
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.sys.path.insert(0, parentdir)

from flask.ext.cors import CORS

r = redis.StrictRedis(host='localhost', port=6379, db=0)

app = Flask(__name__)
cors = CORS(app)
@app.route("/")

def hello():
if r.get('worldnews') is None :
submissions = Submissions();
submissions.getFromReddit('worldnews',10)
urlsInTweets = submissions.getFromTwitter()

r.set('worldnews', json.dumps(urlsInTweets))
return flask.jsonify(result=urlsInTweets)
else :
urlsInTweets = r.get('worldnews')
submissions = json.loads(urlsInTweets)
return flask.jsonify(result=submissions)
# submissionsInfo = {'result' : result}
# return flask.jsonify(result=submissionsInfo)

#submissions = Submissions().getFromReddit('worldnews',10)
#a = submissions.getFromTwitter()

#submission.getTweetLinksFromHashtags()

if __name__ == "__main__":
app.debug = True
app.run(threaded=True)
8 changes: 8 additions & 0 deletions other.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener

ckey="Up4TEdBjNLbYX9FTVNvHmLWTl"
csecret="L5B5M0ZrCFsQoRLzAoCE2H4xc7miVcddT7Z3fsJN726Fz5NuMT"
atoken="984449647-Z84gfx0YPshxVGW3IVEBx1atsvaKHZpXWRwSTgPI"
asecret="6iAefPifIlWNQPZgmLJ2eTdVUuJKUhlrYnUqQdfLBQKtR"
22 changes: 22 additions & 0 deletions public/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
(The MIT License)

Copyright (c) 2015 Thinkmill Pty Ltd.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1 change: 1 addition & 0 deletions public/Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: node server.js
24 changes: 24 additions & 0 deletions public/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
TouchstoneJS Starter
====================

Reference TouchstoneJS App with examples of all UI components.

To build and preview locally, run the `gulp dev` task. It will build the app with browserify, and start a preview server at [localhost:8000](http://localhost:8000).

The source for the app is in the `/src` folder; `/www` and `/platforms` are managed by cordova.

To build for iOS, run `gulp prepare` then build the XCode project `/platforms/ios/Touchstone`.

More documentation and examples to come soon.


# Feedback / Questions?

Let us know! Contact us at [thinkmill.com.au](http://www.thinkmill.com.au/) or open an issue.

We're busily building the TouchstoneJS framework and welcome any ideas / contributions / PRs.


# License

MIT. Copyright (c) 2015 Thinkmill Pty Ltd.
16 changes: 16 additions & 0 deletions public/config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.thinkmill.touchstonejs-starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Touchstone</name>
<description>
Touchstone Starter App
</description>
<author email="hello@thinkmill.com.au" href="http://www.thinkmill.com.au">
Thinkmill Team
</author>
<content src="index.html" />
<access origin="*" />
<preference name="DisallowOverscroll" value="true"/>
<feature name="StatusBar">
<param name="ios-package" value="CDVStatusBar" onload="true" />
</feature>
</widget>
6 changes: 6 additions & 0 deletions public/gulpfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/**
* Gulp tasks are added by the touchstonejs-tasks package
* See https://github.com/JedWatson/touchstonejs-tasks
*/

require('touchstonejs-tasks')(require('gulp'));
196 changes: 196 additions & 0 deletions public/hooks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
-->
# Cordova Hooks

Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system to customize cordova commands. Hook scripts could be defined by adding them to the special predefined folder (`/hooks`) or via configuration files (`config.xml` and `plugin.xml`) and run serially in the following order:
* Application hooks from `/hooks`;
* Application hooks from `config.xml`;
* Plugin hooks from `plugins/.../plugin.xml`.

__Remember__: Make your scripts executable.

__Note__: `.cordova/hooks` directory is also supported for backward compatibility, but we don't recommend using it as it is deprecated.

## Supported hook types
The following hook types are supported:

after_build/
after_compile/
after_docs/
after_emulate/
after_platform_add/
after_platform_rm/
after_platform_ls/
after_plugin_add/
after_plugin_ls/
after_plugin_rm/
after_plugin_search/
after_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed
after_prepare/
after_run/
after_serve/
before_build/
before_compile/
before_docs/
before_emulate/
before_platform_add/
before_platform_rm/
before_platform_ls/
before_plugin_add/
before_plugin_ls/
before_plugin_rm/
before_plugin_search/
before_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed
before_plugin_uninstall/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being uninstalled
before_prepare/
before_run/
before_serve/
pre_package/ <-- Windows 8 and Windows Phone only.

## Ways to define hooks
### Via '/hooks' directory
To execute custom action when corresponding hook type is fired, use hook type as a name for a subfolder inside 'hooks' directory and place you script file here, for example:

# script file will be automatically executed after each build
hooks/after_build/after_build_custom_action.js


### Config.xml

Hooks can be defined in project's `config.xml` using `<hook>` elements, for example:

<hook type="before_build" src="scripts/appBeforeBuild.bat" />
<hook type="before_build" src="scripts/appBeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/appBeforePluginInstall.js" />

<platform name="wp8">
<hook type="before_build" src="scripts/wp8/appWP8BeforeBuild.bat" />
<hook type="before_build" src="scripts/wp8/appWP8BeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/wp8/appWP8BeforePluginInstall.js" />
...
</platform>

<platform name="windows8">
<hook type="before_build" src="scripts/windows8/appWin8BeforeBuild.bat" />
<hook type="before_build" src="scripts/windows8/appWin8BeforeBuild.js" />
<hook type="before_plugin_install" src="scripts/windows8/appWin8BeforePluginInstall.js" />
...
</platform>

### Plugin hooks (plugin.xml)

As a plugin developer you can define hook scripts using `<hook>` elements in a `plugin.xml` like that:

<hook type="before_plugin_install" src="scripts/beforeInstall.js" />
<hook type="after_build" src="scripts/afterBuild.js" />

<platform name="wp8">
<hook type="before_plugin_install" src="scripts/wp8BeforeInstall.js" />
<hook type="before_build" src="scripts/wp8BeforeBuild.js" />
...
</platform>

`before_plugin_install`, `after_plugin_install`, `before_plugin_uninstall` plugin hooks will be fired exclusively for the plugin being installed/uninstalled.

## Script Interface

### Javascript

If you are writing hooks in Javascript you should use the following module definition:
```javascript
module.exports = function(context) {
...
}
```

You can make your scipts async using Q:
```javascript
module.exports = function(context) {
var Q = context.requireCordovaModule('q');
var deferral = new Q.defer();

setTimeout(function(){
console.log('hook.js>> end');
deferral.resolve();
}, 1000);

return deferral.promise;
}
```

`context` object contains hook type, executed script full path, hook options, command-line arguments passed to Cordova and top-level "cordova" object:
```json
{
"hook": "before_plugin_install",
"scriptLocation": "c:\\script\\full\\path\\appBeforePluginInstall.js",
"cmdLine": "The\\exact\\command\\cordova\\run\\with arguments",
"opts": {
"projectRoot":"C:\\path\\to\\the\\project",
"cordova": {
"platforms": ["wp8"],
"plugins": ["com.plugin.withhooks"],
"version": "0.21.7-dev"
},
"plugin": {
"id": "com.plugin.withhooks",
"pluginInfo": {
...
},
"platform": "wp8",
"dir": "C:\\path\\to\\the\\project\\plugins\\com.plugin.withhooks"
}
},
"cordova": {...}
}

```
`context.opts.plugin` object will only be passed to plugin hooks scripts.

You can also require additional Cordova modules in your script using `context.requireCordovaModule` in the following way:
```javascript
var Q = context.requireCordovaModule('q');
```

__Note__: new module loader script interface is used for the `.js` files defined via `config.xml` or `plugin.xml` only.
For compatibility reasons hook files specified via `/hooks` folders are run via Node child_process spawn, see 'Non-javascript' section below.

### Non-javascript

Non-javascript scripts are run via Node child_process spawn from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:

* CORDOVA_VERSION - The version of the Cordova-CLI.
* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
* CORDOVA_HOOK - Path to the hook that is being executed.
* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)

If a script returns a non-zero exit code, then the parent cordova command will be aborted.

## Writing hooks

We highly recommend writting your hooks using Node.js so that they are
cross-platform. Some good examples are shown here:

[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)

Also, note that even if you are working on Windows, and in case your hook scripts aren't bat files (which is recommended, if you want your scripts to work in non-Windows operating systems) Cordova CLI will expect a shebang line as the first line for it to know the interpreter it needs to use to launch the script. The shebang line should match the following example:

#!/usr/bin/env [name_of_interpreter_executable]
Loading