Added angular skeleton, serve ti from sinatra
This commit is contained in:
parent
d550310cf2
commit
92e77b9141
40 changed files with 743 additions and 2 deletions
1
Gemfile
1
Gemfile
|
@ -2,5 +2,6 @@
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'rack-rewrite'
|
||||||
gem 'sinatra'
|
gem 'sinatra'
|
||||||
gem 'sinatra-param'
|
gem 'sinatra-param'
|
||||||
|
|
|
@ -4,6 +4,7 @@ GEM
|
||||||
rack (1.5.2)
|
rack (1.5.2)
|
||||||
rack-protection (1.5.3)
|
rack-protection (1.5.3)
|
||||||
rack
|
rack
|
||||||
|
rack-rewrite (1.5.0)
|
||||||
sinatra (1.4.5)
|
sinatra (1.4.5)
|
||||||
rack (~> 1.4)
|
rack (~> 1.4)
|
||||||
rack-protection (~> 1.4)
|
rack-protection (~> 1.4)
|
||||||
|
@ -16,5 +17,6 @@ PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
rack-rewrite
|
||||||
sinatra
|
sinatra
|
||||||
sinatra-param
|
sinatra-param
|
||||||
|
|
3
app.rb
3
app.rb
|
@ -11,7 +11,7 @@ class LedgerRbApp < Sinatra::Base
|
||||||
helpers Sinatra::Param
|
helpers Sinatra::Param
|
||||||
|
|
||||||
get '/' do
|
get '/' do
|
||||||
'OH HAI!'
|
send_file 'public/app/index.html'
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/api/ledger/accounts/?' do
|
get '/api/ledger/accounts/?' do
|
||||||
|
@ -42,5 +42,4 @@ class LedgerRbApp < Sinatra::Base
|
||||||
|
|
||||||
Ledger.version
|
Ledger.version
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,4 +6,9 @@ configure :development do
|
||||||
Sinatra::Application.reset!
|
Sinatra::Application.reset!
|
||||||
use Rack::Reloader
|
use Rack::Reloader
|
||||||
end
|
end
|
||||||
|
|
||||||
|
use Rack::Rewrite do
|
||||||
|
rewrite %r{^(/.*(css|js|ttf|woff|html|png|jpg|jpeg|gif)$)}, '/app/$1'
|
||||||
|
end
|
||||||
|
|
||||||
run LedgerRbApp
|
run LedgerRbApp
|
||||||
|
|
3
public/.bowerrc
Normal file
3
public/.bowerrc
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"directory": "app/bower_components"
|
||||||
|
}
|
7
public/.gitignore
vendored
Normal file
7
public/.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
logs/*
|
||||||
|
!.gitkeep
|
||||||
|
node_modules/
|
||||||
|
bower_components/
|
||||||
|
tmp
|
||||||
|
.DS_Store
|
||||||
|
.idea
|
6
public/.jshintrc
Normal file
6
public/.jshintrc
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"globalstrict": true,
|
||||||
|
"globals": {
|
||||||
|
"angular": false
|
||||||
|
}
|
||||||
|
}
|
14
public/.travis.yml
Normal file
14
public/.travis.yml
Normal file
|
@ -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
|
22
public/LICENSE
Normal file
22
public/LICENSE
Normal file
|
@ -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.
|
||||||
|
|
292
public/README.md
Normal file
292
public/README.md
Normal file
|
@ -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:
|
||||||
|
|
||||||
|
<a href="https://grandcentral.cloudbees.com/?CB_clickstart=https://raw.github.com/CloudBees-community/angular-js-clickstart/master/clickstart.json">
|
||||||
|
<img src="https://d3ko533tu1ozfq.cloudfront.net/clickstart/deployInstantly.png"/></a>
|
||||||
|
|
||||||
|
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
|
0
public/app/css/.gitkeep
Normal file
0
public/app/css/.gitkeep
Normal file
29
public/app/css/app.css
Normal file
29
public/app/css/app.css
Normal file
|
@ -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;
|
||||||
|
}
|
0
public/app/img/.gitkeep
Normal file
0
public/app/img/.gitkeep
Normal file
52
public/app/index.html
Normal file
52
public/app/index.html
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!--[if lt IE 7]> <html lang="en" ng-app="app" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
||||||
|
<!--[if IE 7]> <html lang="en" ng-app="app" class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
||||||
|
<!--[if IE 8]> <html lang="en" ng-app="app" class="no-js lt-ie9"> <![endif]-->
|
||||||
|
<!--[if gt IE 8]><!--> <html lang="en" ng-app="app" class="no-js"> <!--<![endif]-->
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>My AngularJS App</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link type="text/css" rel="stylesheet" href="bower_components/html5-boilerplate/css/normalize.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="bower_components/html5-boilerplate/css/main.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="css/app.css"/>
|
||||||
|
<script src="bower_components/html5-boilerplate/js/vendor/modernizr-2.6.2.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!--[if lt IE 7]>
|
||||||
|
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
|
||||||
|
<![endif]-->
|
||||||
|
|
||||||
|
<div ui-view="navbar"></div>
|
||||||
|
|
||||||
|
<div class="main" ui-view="main"></div>
|
||||||
|
|
||||||
|
<!-- In production use:
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/x.x.x/angular.min.js"></script>
|
||||||
|
-->
|
||||||
|
<script src="bower_components/angular/angular.js"></script>
|
||||||
|
<script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
|
||||||
|
|
||||||
|
<!-- APP -->
|
||||||
|
<script src="js/app.js"></script>
|
||||||
|
<script src="js/core/services/VersionService.js"></script>
|
||||||
|
<script src="js/core/filters/VersionFilter.js"></script>
|
||||||
|
<script src="js/core/directives/VersionDirective.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- CORE -->
|
||||||
|
<script src="js/core/state.js"></script>
|
||||||
|
<script src="js/core/controllers/AppCtrl.js"></script>
|
||||||
|
<script src="js/core/controllers/NavbarCtrl.js"></script>
|
||||||
|
|
||||||
|
<!-- MAIN -->
|
||||||
|
<script src="js/main/state.js"></script>
|
||||||
|
<script src="js/main/controllers/HomeCtrl.js"></script>
|
||||||
|
<script src="js/main/controllers/AboutCtrl.js"></script>
|
||||||
|
<script src="js/main/controllers/ContactCtrl.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
1
public/app/js/app.js
Normal file
1
public/app/js/app.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
var app = angular.module('app', ['ui.router']);
|
3
public/app/js/core/controllers/AppCtrl.js
Normal file
3
public/app/js/core/controllers/AppCtrl.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app.controller('AppCtrl', function($scope) {
|
||||||
|
|
||||||
|
});
|
3
public/app/js/core/controllers/NavbarCtrl.js
Normal file
3
public/app/js/core/controllers/NavbarCtrl.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app.controller('NavbarCtrl', function($scope) {
|
||||||
|
$scope.items = ['Home', 'About', 'Contact'];
|
||||||
|
});
|
5
public/app/js/core/directives/VersionDirective.js
Normal file
5
public/app/js/core/directives/VersionDirective.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
app.directive('appVersion', ['version', function(version) {
|
||||||
|
return function(scope, elm, attrs) {
|
||||||
|
elm.text(version);
|
||||||
|
};
|
||||||
|
}]);
|
5
public/app/js/core/filters/VersionFilter.js
Normal file
5
public/app/js/core/filters/VersionFilter.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
app.filter('interpolate', ['version', function(version) {
|
||||||
|
return function(text) {
|
||||||
|
return String(text).replace(/\%VERSION\%/mg, version);
|
||||||
|
};
|
||||||
|
}]);
|
1
public/app/js/core/services/VersionService.js
Normal file
1
public/app/js/core/services/VersionService.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
app.value('version', '0.1');
|
27
public/app/js/core/state.js
Normal file
27
public/app/js/core/state.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Application Level State
|
||||||
|
app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
|
||||||
|
|
||||||
|
$urlRouterProvider.when('', '/home');
|
||||||
|
|
||||||
|
|
||||||
|
$stateProvider
|
||||||
|
.state('app', {
|
||||||
|
url: '',
|
||||||
|
controller: 'AppCtrl',
|
||||||
|
views: {
|
||||||
|
'navbar': {
|
||||||
|
templateUrl: 'js/core/templates/navbar.tpl.html',
|
||||||
|
controller: 'NavbarCtrl'
|
||||||
|
},
|
||||||
|
'main': {
|
||||||
|
templateUrl: 'js/core/templates/main.tpl.html'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.state('404', {
|
||||||
|
url: '/404',
|
||||||
|
templateUrl: 'js/core/templates/404.tpl.html',
|
||||||
|
controller: 'AppCtrl'
|
||||||
|
});
|
||||||
|
|
||||||
|
}]);
|
1
public/app/js/core/templates/404.tpl.html
Normal file
1
public/app/js/core/templates/404.tpl.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<div>404 Error</div>
|
6
public/app/js/core/templates/main.tpl.html
Normal file
6
public/app/js/core/templates/main.tpl.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div ui-view></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
11
public/app/js/core/templates/navbar.tpl.html
Normal file
11
public/app/js/core/templates/navbar.tpl.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<ul class="nav">
|
||||||
|
<li ng-repeat="item in items" class="navbar-item" ui-sref-active="navbar-active">
|
||||||
|
<a ui-sref="app.{{ item | lowercase }}">{{ item }}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
3
public/app/js/main/controllers/AboutCtrl.js
Normal file
3
public/app/js/main/controllers/AboutCtrl.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app.controller('AboutCtrl', ['$scope', function($scope) {
|
||||||
|
|
||||||
|
}]);
|
3
public/app/js/main/controllers/ContactCtrl.js
Normal file
3
public/app/js/main/controllers/ContactCtrl.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app.controller('ContactCtrl', ['$scope', function($scope) {
|
||||||
|
|
||||||
|
}]);
|
3
public/app/js/main/controllers/HomeCtrl.js
Normal file
3
public/app/js/main/controllers/HomeCtrl.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app.controller('HomeCtrl', ['$scope', function($scope) {
|
||||||
|
|
||||||
|
}]);
|
21
public/app/js/main/state.js
Normal file
21
public/app/js/main/state.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Sub-application/main Level State
|
||||||
|
app.config(['$stateProvider', function($stateProvider) {
|
||||||
|
|
||||||
|
$stateProvider
|
||||||
|
.state('app.home', {
|
||||||
|
url: '/home',
|
||||||
|
templateUrl: 'js/main/templates/home.tpl.html',
|
||||||
|
controller: 'HomeCtrl'
|
||||||
|
})
|
||||||
|
.state('app.about', {
|
||||||
|
url: '/about',
|
||||||
|
templateUrl: 'js/main/templates/about.tpl.html',
|
||||||
|
controller: 'AboutCtrl'
|
||||||
|
})
|
||||||
|
.state('app.contact', {
|
||||||
|
url: '/contact',
|
||||||
|
templateUrl: 'js/main/templates/contact.tpl.html',
|
||||||
|
controller: 'ContactCtrl'
|
||||||
|
});
|
||||||
|
|
||||||
|
}]);
|
1
public/app/js/main/templates/about.tpl.html
Normal file
1
public/app/js/main/templates/about.tpl.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<p>This is about</p>
|
1
public/app/js/main/templates/contact.tpl.html
Normal file
1
public/app/js/main/templates/contact.tpl.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<p>This is contact</p>
|
1
public/app/js/main/templates/home.tpl.html
Normal file
1
public/app/js/main/templates/home.tpl.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<p>This is home</p>
|
14
public/bower.json
Normal file
14
public/bower.json
Normal file
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
34
public/package.json
Normal file
34
public/package.json
Normal file
|
@ -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');\""
|
||||||
|
}
|
||||||
|
}
|
42
public/test/e2e/scenarios.js
Normal file
42
public/test/e2e/scenarios.js
Normal file
|
@ -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/);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
33
public/test/karma.conf.js
Normal file
33
public/test/karma.conf.js
Normal file
|
@ -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'
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
19
public/test/protractor-conf.js
Normal file
19
public/test/protractor-conf.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
exports.config = {
|
||||||
|
allScriptsTimeout: 11000,
|
||||||
|
|
||||||
|
specs: [
|
||||||
|
'e2e/*.js'
|
||||||
|
],
|
||||||
|
|
||||||
|
capabilities: {
|
||||||
|
'browserName': 'chrome'
|
||||||
|
},
|
||||||
|
|
||||||
|
baseUrl: 'http://localhost:8000/app/',
|
||||||
|
|
||||||
|
framework: 'jasmine',
|
||||||
|
|
||||||
|
jasmineNodeOpts: {
|
||||||
|
defaultTimeoutInterval: 30000
|
||||||
|
}
|
||||||
|
};
|
20
public/test/unit/controllersSpec.js
Normal file
20
public/test/unit/controllersSpec.js
Normal file
|
@ -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();
|
||||||
|
}));
|
||||||
|
});
|
19
public/test/unit/directivesSpec.js
Normal file
19
public/test/unit/directivesSpec.js
Normal file
|
@ -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('<span app-version></span>')($rootScope);
|
||||||
|
expect(element.text()).toEqual('TEST_VER');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
19
public/test/unit/filtersSpec.js
Normal file
19
public/test/unit/filtersSpec.js
Normal file
|
@ -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');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
13
public/test/unit/servicesSpec.js
Normal file
13
public/test/unit/servicesSpec.js
Normal file
|
@ -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');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue