diff --git a/Gemfile b/Gemfile
index 4aec6d77..0dc3e37e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,5 +2,6 @@
source 'https://rubygems.org'
+gem 'rack-rewrite'
gem 'sinatra'
gem 'sinatra-param'
diff --git a/Gemfile.lock b/Gemfile.lock
index f7c23855..8eff4a50 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -4,6 +4,7 @@ GEM
rack (1.5.2)
rack-protection (1.5.3)
rack
+ rack-rewrite (1.5.0)
sinatra (1.4.5)
rack (~> 1.4)
rack-protection (~> 1.4)
@@ -16,5 +17,6 @@ PLATFORMS
ruby
DEPENDENCIES
+ rack-rewrite
sinatra
sinatra-param
diff --git a/app.rb b/app.rb
index b9b915be..dc3380e3 100644
--- a/app.rb
+++ b/app.rb
@@ -11,7 +11,7 @@ class LedgerRbApp < Sinatra::Base
helpers Sinatra::Param
get '/' do
- 'OH HAI!'
+ send_file 'public/app/index.html'
end
get '/api/ledger/accounts/?' do
@@ -42,5 +42,4 @@ class LedgerRbApp < Sinatra::Base
Ledger.version
end
-
end
diff --git a/config.ru b/config.ru
index b4ae79a9..f2f4f899 100644
--- a/config.ru
+++ b/config.ru
@@ -6,4 +6,9 @@ configure :development do
Sinatra::Application.reset!
use Rack::Reloader
end
+
+use Rack::Rewrite do
+ rewrite %r{^(/.*(css|js|ttf|woff|html|png|jpg|jpeg|gif)$)}, '/app/$1'
+end
+
run LedgerRbApp
diff --git a/public/.bowerrc b/public/.bowerrc
new file mode 100644
index 00000000..8c58c8ef
--- /dev/null
+++ b/public/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "app/bower_components"
+}
\ No newline at end of file
diff --git a/public/.gitignore b/public/.gitignore
new file mode 100644
index 00000000..b702acc6
--- /dev/null
+++ b/public/.gitignore
@@ -0,0 +1,7 @@
+logs/*
+!.gitkeep
+node_modules/
+bower_components/
+tmp
+.DS_Store
+.idea
\ No newline at end of file
diff --git a/public/.jshintrc b/public/.jshintrc
new file mode 100644
index 00000000..da408042
--- /dev/null
+++ b/public/.jshintrc
@@ -0,0 +1,6 @@
+{
+ "globalstrict": true,
+ "globals": {
+ "angular": false
+ }
+}
\ No newline at end of file
diff --git a/public/.travis.yml b/public/.travis.yml
new file mode 100644
index 00000000..a368e661
--- /dev/null
+++ b/public/.travis.yml
@@ -0,0 +1,14 @@
+language: node_js
+node_js:
+ - 0.10
+
+before_script:
+ - export DISPLAY=:99.0
+ - sh -e /etc/init.d/xvfb start
+ - npm start > /dev/null &
+ - npm run update-webdriver
+ - sleep 1 # give server time to start
+
+script:
+ - node_modules/.bin/karma start test/karma.conf.js --no-auto-watch --single-run --reporters=dots --browsers=Firefox
+ - node_modules/.bin/protractor test/protractor-conf.js --browser=firefox
diff --git a/public/LICENSE b/public/LICENSE
new file mode 100644
index 00000000..9ced3319
--- /dev/null
+++ b/public/LICENSE
@@ -0,0 +1,22 @@
+The MIT License
+
+Copyright (c) 2010-2014 Google, Inc. http://angularjs.org
+
+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.
+
diff --git a/public/README.md b/public/README.md
new file mode 100644
index 00000000..ccf4794a
--- /dev/null
+++ b/public/README.md
@@ -0,0 +1,292 @@
+# angular-ui-seed — the seed for AngularJS apps
+
+This project seed is an application skeleton for a typical [AngularJS](http://angularjs.org/) web app.
+You can use it to quickly bootstrap your angular webapp projects and dev environment for these
+projects. It uses angular [ui-router](https://github.com/angular-ui/ui-router) to create multiple named views as well as nested views.
+
+The seed contains a sample AngularJS application and is preconfigured to install the Angular
+framework and a bunch of development and testing tools for instant web development gratification.
+
+The seed app doesn't do much, just shows how to wire two controllers and views together.
+
+
+## Getting Started
+
+To get you started you can simply clone the angular-ui-seed repository and install the dependencies:
+
+### Prerequisites
+
+You need git to clone the angular-ui-seed repository. You can get it from
+[http://git-scm.com/](http://git-scm.com/).
+
+We also use a number of node.js tools to initialize and test angular-ui-seed. You must have node.js and
+its package manager (npm) installed. You can get them from [http://nodejs.org/](http://nodejs.org/).
+
+### Clone angular-ui-seed
+
+Clone the angular-ui-seed repository using [git][git]:
+
+```
+git clone https://github.com/dokko1230/angular-ui-seed.git
+cd angular-ui-seed
+```
+
+### Install Dependencies
+
+We have two kinds of dependencies in this project: tools and angular framework code. The tools help
+us manage and test the application.
+
+* We get the tools we depend upon via `npm`, the [node package manager][npm].
+* We get the angular code via `bower`, a [client-side code package manager][bower].
+
+We have preconfigured `npm` to automatically run `bower` so we can simply do:
+
+```
+npm install
+```
+
+Behind the scenes this will also call `bower install`. You should find that you have two new
+folders in your project.
+
+* `node_modules` - contains the npm packages for the tools we need
+* `app/bower_components` - contains the angular framework files
+
+*Note that the `bower_components` folder would normally be installed in the root folder but
+angular-ui-seed changes this location through the `.bowerrc` file. Putting it in the app folder makes
+it easier to serve the files by a webserver.*
+
+### Run the Application
+
+We have preconfigured the project with a simple development web server. The simplest way to start
+this server is:
+
+```
+npm start
+```
+
+Now browse to the app at `http://localhost:8000/app/index.html`.
+
+
+
+## Directory Layout
+
+ app/ --> all of the files to be used in production
+ css/ --> css files
+ app.css --> default stylesheet
+ img/ --> image files
+ index.html --> app layout file (the main html template file of the app)
+ js/ --> javascript files
+ core/ --> core files
+ controllers/ --> core controllers
+ AppCtrl.js
+ NavbarCtrl.js
+ directives/ --> core directives
+ VersionDirective.js
+ filters/ --> core filters
+ VersionFilter.js
+ services/ --> core services
+ VersionService.js
+ templates/ --> core templates
+ 404.tpl.html
+ main.tpl.html
+ navbar.tpl.html
+ state.js --> core state
+ main/ --> main files
+ controllers/ --> main controllers
+ AboutCtrl.js
+ ContactCtrl.js
+ HomeCtrl.js
+ templates/ --> main templates
+ home.tpl.html
+ about.tpl.html
+ contact.tpl.html
+ state.js --> main state
+
+ app.js --> application
+
+ test/ --> test config and source files
+ protractor-conf.js --> config file for running e2e tests with Protractor
+ e2e/ --> end-to-end specs
+ scenarios.js
+ karma.conf.js --> config file for running unit tests with Karma
+ unit/ --> unit level specs/tests
+ controllersSpec.js --> specs for controllers
+ directivessSpec.js --> specs for directives
+ filtersSpec.js --> specs for filters
+ servicesSpec.js --> specs for services
+
+
+## Testing
+
+There are two kinds of tests in the angular-ui-seed application: Unit tests and End to End tests.
+
+### Running Unit Tests
+
+The angular-ui-seed app comes preconfigured with unit tests. These are written in
+[Jasmine][jasmine], which we run with the [Karma Test Runner][karma]. We provide a Karma
+configuration file to run them.
+
+* the configuration is found at `test/karma.conf.js`
+* the unit tests are found in `test/unit/`.
+
+The easiest way to run the unit tests is to use the supplied npm script:
+
+```
+npm test
+```
+
+This script will start the Karma test runner to execute the unit tests. Moreover, Karma will sit and
+watch the source and test files for changes and then re-run the tests whenever any of them change.
+This is the recommended strategy; if your unit tests are being run every time you save a file then
+you receive instant feedback on any changes that break the expected code functionality.
+
+You can also ask Karma to do a single run of the tests and then exit. This is useful if you want to
+check that a particular version of the code is operating as expected. The project contains a
+predefined script to do this:
+
+```
+npm run test-single-run
+```
+
+
+### End to end testing
+
+The angular-ui-seed app comes with end-to-end tests, again written in [Jasmine][jasmine]. These tests
+are run with the [Protractor][protractor] End-to-End test runner. It uses native events and has
+special features for Angular applications.
+
+* the configuration is found at `test/protractor-conf.js`
+* the end-to-end tests are found in `test/e2e/`
+
+Protractor simulates interaction with our web app and verifies that the application responds
+correctly. Therefore, our web server needs to be serving up the application, so that Protractor
+can interact with it.
+
+```
+npm start
+```
+
+In addition, since Protractor is built upon WebDriver we need to install this. The angular-ui-seed
+project comes with a predefined script to do this:
+
+```
+npm run update-webdriver
+```
+
+This will download and install the latest version of the stand-alone WebDriver tool.
+
+Once you have ensured that the development web server hosting our application is up and running
+and WebDriver is updated, you can run the end-to-end tests using the supplied npm script:
+
+```
+npm run protractor
+```
+
+This script will execute the end-to-end tests against the application being hosted on the
+development server.
+
+
+## Updating Angular
+
+Previously we recommended that you merge in changes to angular-ui-seed into your own fork of the project.
+Now that the angular framework library code and tools are acquired through package managers (npm and
+bower) you can use these tools instead to update the dependencies.
+
+You can update the tool dependencies by running:
+
+```
+npm update
+```
+
+This will find the latest versions that match the version ranges specified in the `package.json` file.
+
+You can update the Angular dependencies by running:
+
+```
+bower update
+```
+
+This will find the latest versions that match the version ranges specified in the `bower.json` file.
+
+
+## Serving the Application Files
+
+While angular is client-side-only technology and it's possible to create angular webapps that
+don't require a backend server at all, we recommend serving the project files using a local
+webserver during development to avoid issues with security restrictions (sandbox) in browsers. The
+sandbox implementation varies between browsers, but quite often prevents things like cookies, xhr,
+etc to function properly when an html page is opened via `file://` scheme instead of `http://`.
+
+
+### Running the App during Development
+
+The angular-ui-seed project comes preconfigured with a local development webserver. It is a node.js
+tool called [http-server][http-server]. You can start this webserver with `npm start` but you may choose to
+install the tool globally:
+
+```
+sudo npm install -g http-server
+```
+
+Then you can start your own development web server to serve static files from a folder by
+running:
+
+```
+http-server
+```
+
+Alternatively, you can choose to configure your own webserver, such as apache or nginx. Just
+configure your server to serve the files under the `app/` directory.
+
+
+### Running the App in Production
+
+This really depends on how complex is your app and the overall infrastructure of your system, but
+the general rule is that all you need in production are all the files under the `app/` directory.
+Everything else should be omitted.
+
+Angular apps are really just a bunch of static html, css and js files that just need to be hosted
+somewhere they can be accessed by browsers.
+
+If your Angular app is talking to the backend server via xhr or other means, you need to figure
+out what is the best way to host the static files to comply with the same origin policy if
+applicable. Usually this is done by hosting the files by the backend server or through
+reverse-proxying the backend server(s) and webserver(s).
+
+
+## Continuous Integration
+
+### Travis CI
+
+[Travis CI][travis] is a continuous integration service, which can monitor GitHub for new commits
+to your repository and execute scripts such as building the app or running tests. The angular-ui-seed
+project contains a Travis configuration file, `.travis.yml`, which will cause Travis to run your
+tests when you push to GitHub.
+
+You will need to enable the integration between Travis and GitHub. See the Travis website for more
+instruction on how to do this.
+
+### CloudBees
+
+CloudBees have provided a CI/deployment setup:
+
+
+
+
+If you run this, you will get a cloned version of this repo to start working on in a private git repo,
+along with a CI service (in Jenkins) hosted that will run unit and end to end tests in both Firefox and Chrome.
+
+
+## Contact
+
+For more information on AngularJS please check out http://angularjs.org/
+
+[git]: http://git-scm.com/
+[bower]: http://bower.io
+[npm]: https://www.npmjs.org/
+[node]: http://nodejs.org
+[protractor]: https://github.com/angular/protractor
+[jasmine]: http://pivotal.github.com/jasmine/
+[karma]: http://karma-runner.github.io
+[travis]: https://travis-ci.org/
+[http-server]: https://github.com/nodeapps/http-server
diff --git a/public/app/css/.gitkeep b/public/app/css/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/public/app/css/app.css b/public/app/css/app.css
new file mode 100644
index 00000000..16d65505
--- /dev/null
+++ b/public/app/css/app.css
@@ -0,0 +1,29 @@
+/* app css stylesheet */
+
+body {
+ margin: 0;
+ padding: 0;
+}
+
+.container {
+ width: 960px;
+ margin: 0 auto;
+}
+
+.main {
+ clear:both;
+}
+
+.nav {
+ list-style-type: none;
+ padding: 0;
+}
+
+.nav li {
+ float: left;
+ margin-right: 10px;
+}
+
+.nav:after {
+ clear:both;
+}
\ No newline at end of file
diff --git a/public/app/img/.gitkeep b/public/app/img/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/public/app/index.html b/public/app/index.html
new file mode 100644
index 00000000..592ae523
--- /dev/null
+++ b/public/app/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
This is about
\ No newline at end of file diff --git a/public/app/js/main/templates/contact.tpl.html b/public/app/js/main/templates/contact.tpl.html new file mode 100644 index 00000000..7e853f26 --- /dev/null +++ b/public/app/js/main/templates/contact.tpl.html @@ -0,0 +1 @@ +This is contact
\ No newline at end of file diff --git a/public/app/js/main/templates/home.tpl.html b/public/app/js/main/templates/home.tpl.html new file mode 100644 index 00000000..7731373b --- /dev/null +++ b/public/app/js/main/templates/home.tpl.html @@ -0,0 +1 @@ +This is home
\ No newline at end of file diff --git a/public/bower.json b/public/bower.json new file mode 100644 index 00000000..8ccb73c0 --- /dev/null +++ b/public/bower.json @@ -0,0 +1,14 @@ +{ + "name": "angular-ui-seed", + "description": "A starter project for AngularJS", + "version": "0.0.2", + "homepage": "https://github.com/dokko1230/angular-ui-seed", + "license": "MIT", + "dependencies": { + "angular": "latest", + "angular-ui-router": "~0.2.10", + "angular-loader": "1.2.x", + "angular-mocks": "~1.2.x", + "html5-boilerplate": "~4.3.0" + } +} diff --git a/public/package.json b/public/package.json new file mode 100644 index 00000000..1ca0b7e3 --- /dev/null +++ b/public/package.json @@ -0,0 +1,34 @@ +{ + "name": "angular-ui-seed", + "private": true, + "version": "0.0.0", + "description": "A starter project for AngularJS", + "repository": "https://github.com/dokko1230/angular-ui-seed", + "license": "MIT", + "devDependencies": { + "karma": "~0.10", + "protractor": "~0.20.1", + "http-server": "^0.6.1", + "bower": "^1.3.1", + "shelljs": "^0.2.6", + "karma-junit-reporter": "^0.2.2" + }, + "scripts": { + "postinstall": "bower install", + + "prestart": "npm install", + "start": "http-server -a localhost -p 8000", + + "pretest": "npm install", + "test": "karma start test/karma.conf.js", + "test-single-run": "karma start test/karma.conf.js --single-run", + + "preupdate-webdriver": "npm install", + "update-webdriver": "webdriver-manager update", + + "preprotractor": "npm run update-webdriver", + "protractor": "protractor test/protractor-conf.js", + + "update-index-async": "node -e \"require('shelljs/global'); sed('-i', /\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@\\n' + cat('app/bower_components/angular-loader/angular-loader.min.js') + '\\n//@@NG_LOADER_END@@', 'app/index-async.html');\"" + } +} diff --git a/public/test/e2e/scenarios.js b/public/test/e2e/scenarios.js new file mode 100644 index 00000000..4421663a --- /dev/null +++ b/public/test/e2e/scenarios.js @@ -0,0 +1,42 @@ +'use strict'; + +/* https://github.com/angular/protractor/blob/master/docs/getting-started.md */ + +describe('my app', function() { + + browser.get('index.html'); + + it('should automatically redirect to /home when location hash/fragment is empty', function() { + expect(browser.getLocationAbsUrl()).toMatch("/home"); + }); + + + describe('home', function() { + + beforeEach(function() { + browser.get('index.html#/home'); + }); + + + it('should render home when user navigates to /home', function() { + expect(element.all(by.css('[ui-view] p')).first().getText()). + toMatch(/This is home/); + }); + + }); + + + describe('about', function() { + + beforeEach(function() { + browser.get('index.html#/about'); + }); + + + it('should render about when user navigates to /about', function() { + expect(element.all(by.css('[ui-view] p')).first().getText()). + toMatch(/This is about/); + }); + + }); +}); diff --git a/public/test/karma.conf.js b/public/test/karma.conf.js new file mode 100644 index 00000000..8ed9e874 --- /dev/null +++ b/public/test/karma.conf.js @@ -0,0 +1,33 @@ +module.exports = function(config){ + config.set({ + + basePath : '../', + + files : [ + 'app/bower_components/angular/angular.js', + 'app/bower_components/angular-ui-router/release/angular-ui-router.js', + 'app/bower_components/angular-mocks/angular-mocks.js', + 'app/js/**/*.js', + 'test/unit/**/*.js' + ], + + autoWatch : true, + + frameworks: ['jasmine'], + + browsers : ['Chrome'], + + plugins : [ + 'karma-chrome-launcher', + 'karma-firefox-launcher', + 'karma-jasmine', + 'karma-junit-reporter' + ], + + junitReporter : { + outputFile: 'test_out/unit.xml', + suite: 'unit' + } + + }); +}; diff --git a/public/test/protractor-conf.js b/public/test/protractor-conf.js new file mode 100644 index 00000000..7720db5f --- /dev/null +++ b/public/test/protractor-conf.js @@ -0,0 +1,19 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + baseUrl: 'http://localhost:8000/app/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/test/unit/controllersSpec.js b/public/test/unit/controllersSpec.js new file mode 100644 index 00000000..a03b9663 --- /dev/null +++ b/public/test/unit/controllersSpec.js @@ -0,0 +1,20 @@ +'use strict'; + +/* jasmine specs for controllers go here */ + +describe('controllers', function(){ + beforeEach(module('app')); + + + it('should ....', inject(function($controller) { + //spec body + var AppCtrl = $controller('AppCtrl', { $scope: {} }); + expect(AppCtrl).toBeDefined(); + })); + + it('should ....', inject(function($controller) { + //spec body + var HomeCtrl = $controller('HomeCtrl', { $scope: {} }); + expect(HomeCtrl).toBeDefined(); + })); +}); diff --git a/public/test/unit/directivesSpec.js b/public/test/unit/directivesSpec.js new file mode 100644 index 00000000..2e03848c --- /dev/null +++ b/public/test/unit/directivesSpec.js @@ -0,0 +1,19 @@ +'use strict'; + +/* jasmine specs for directives go here */ + +describe('directives', function() { + beforeEach(module('app')); + + describe('app-version', function() { + it('should print current version', function() { + module(function($provide) { + $provide.value('version', 'TEST_VER'); + }); + inject(function($compile, $rootScope) { + var element = $compile('')($rootScope); + expect(element.text()).toEqual('TEST_VER'); + }); + }); + }); +}); diff --git a/public/test/unit/filtersSpec.js b/public/test/unit/filtersSpec.js new file mode 100644 index 00000000..ed5cfac1 --- /dev/null +++ b/public/test/unit/filtersSpec.js @@ -0,0 +1,19 @@ +'use strict'; + +/* jasmine specs for filters go here */ + +describe('filter', function() { + beforeEach(module('app')); + + + describe('interpolate', function() { + beforeEach(module(function($provide) { + $provide.value('version', 'TEST_VER'); + })); + + + it('should replace VERSION', inject(function(interpolateFilter) { + expect(interpolateFilter('before %VERSION% after')).toEqual('before TEST_VER after'); + })); + }); +}); diff --git a/public/test/unit/servicesSpec.js b/public/test/unit/servicesSpec.js new file mode 100644 index 00000000..98845394 --- /dev/null +++ b/public/test/unit/servicesSpec.js @@ -0,0 +1,13 @@ +'use strict'; + +/* jasmine specs for services go here */ + +describe('service', function() { + beforeEach(module('app')); + + describe('version', function() { + it('should return current version', inject(function(version) { + expect(version).toEqual('0.1'); + })); + }); +});