├── test
├── dummy
│ ├── log
│ │ └── .gitkeep
│ ├── app
│ │ ├── mailers
│ │ │ └── .gitkeep
│ │ ├── models
│ │ │ └── .gitkeep
│ │ ├── assets
│ │ │ ├── javascripts
│ │ │ │ ├── templates
│ │ │ │ │ ├── test.js.hjs
│ │ │ │ │ ├── hairy.mustache.hbs
│ │ │ │ │ └── new_lines.js.hjs
│ │ │ │ ├── non-ember.module.es6
│ │ │ │ ├── store.module.es6
│ │ │ │ ├── mixins
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── views
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── routes
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── components
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── controllers
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── services
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── transforms
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── adapters
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── initializers
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── serializers
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── instance-initializers
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── helpers
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── models
│ │ │ │ │ └── user.module.es6
│ │ │ │ ├── router.module.es6
│ │ │ │ └── application.js
│ │ │ └── stylesheets
│ │ │ │ ├── home.css
│ │ │ │ └── application.css
│ │ ├── helpers
│ │ │ ├── home_helper.rb
│ │ │ └── application_helper.rb
│ │ ├── views
│ │ │ ├── home
│ │ │ │ └── index.html.erb
│ │ │ └── layouts
│ │ │ │ └── application.html.erb
│ │ └── controllers
│ │ │ ├── home_controller.rb
│ │ │ └── application_controller.rb
│ ├── public
│ │ ├── favicon.ico
│ │ ├── 422.html
│ │ ├── 404.html
│ │ └── 500.html
│ ├── config
│ │ ├── initializers
│ │ │ ├── assets.rb
│ │ │ ├── mime_types.rb
│ │ │ ├── inflections.rb
│ │ │ ├── backtrace_silencers.rb
│ │ │ ├── session_store.rb
│ │ │ ├── wrap_parameters.rb
│ │ │ └── secret_token.rb
│ │ ├── engine.rb
│ │ ├── environment.rb
│ │ ├── locales
│ │ │ └── en.yml
│ │ ├── boot.rb
│ │ ├── database.yml
│ │ ├── environments
│ │ │ ├── development.rb
│ │ │ ├── test.rb
│ │ │ └── production.rb
│ │ ├── application.rb
│ │ └── routes.rb
│ ├── config.ru
│ ├── Rakefile
│ └── script
│ │ └── rails
├── test_helper.rb
├── es6_module_test.rb
├── generators
│ ├── template_generator_test.rb
│ ├── route_generator_test.rb
│ ├── adapter_generator_test.rb
│ ├── service_generator_test.rb
│ ├── initializer_generator_test.rb
│ ├── instance_initializer_generator_test.rb
│ ├── controller_generator_test.rb
│ ├── view_generator_test.rb
│ ├── bootstrap_generator_engine_test.rb
│ ├── resource_generator_test.rb
│ ├── model_generator_test.rb
│ ├── component_generator_test.rb
│ ├── bootstrap_generator_test.rb
│ └── install_generator_test.rb
├── precompile_test.rb
└── hjstemplate_test.rb
├── lib
├── ember-rails.rb
├── generators
│ ├── templates
│ │ ├── component.template.hbs
│ │ ├── application.hbs
│ │ ├── template.hbs
│ │ ├── service.em
│ │ ├── service.coffee
│ │ ├── service.js
│ │ ├── service.module.es6
│ │ ├── environment.em
│ │ ├── environment.coffee
│ │ ├── environment.js
│ │ ├── router.em
│ │ ├── router.coffee
│ │ ├── initializer.module.es6
│ │ ├── route.em
│ │ ├── route.module.es6
│ │ ├── component.js
│ │ ├── controller.em
│ │ ├── initializer.em
│ │ ├── component.module.es6
│ │ ├── controller.module.es6
│ │ ├── object_controller.em
│ │ ├── route.coffee
│ │ ├── route.js
│ │ ├── router.js
│ │ ├── array_controller.em
│ │ ├── component.em
│ │ ├── controller.js
│ │ ├── initializer.coffee
│ │ ├── component.coffee
│ │ ├── instance-initializer.module.es6
│ │ ├── application_adapter.coffee
│ │ ├── controller.coffee
│ │ ├── object_controller.coffee
│ │ ├── object_controller.js
│ │ ├── object_controller.module.es6
│ │ ├── array_controller.coffee
│ │ ├── adapter.em
│ │ ├── environment.module.es6
│ │ ├── initializer.js
│ │ ├── adapter.coffee
│ │ ├── adapter.js
│ │ ├── instance-initializer.em
│ │ ├── view.coffee
│ │ ├── view.em
│ │ ├── view.module.es6
│ │ ├── instance-initializer.coffee
│ │ ├── view.js
│ │ ├── application_adapter.module.es6
│ │ ├── instance-initializer.js
│ │ ├── array_controller.js
│ │ ├── array_controller.module.es6
│ │ ├── application_adapter.em
│ │ ├── application_adapter.js
│ │ ├── router.module.es6
│ │ ├── app.em
│ │ ├── app.coffee
│ │ ├── app.js
│ │ ├── model.em
│ │ ├── application.em
│ │ ├── application.coffee
│ │ ├── model.coffee
│ │ ├── app.module.es6
│ │ ├── model.js
│ │ ├── model.module.es6
│ │ ├── application.es6
│ │ └── application.js
│ └── ember
│ │ ├── template_generator.rb
│ │ ├── adapter_generator.rb
│ │ ├── route_generator.rb
│ │ ├── service_generator.rb
│ │ ├── initializer_generator.rb
│ │ ├── instance_initializer_generator.rb
│ │ ├── view_generator.rb
│ │ ├── resource_generator.rb
│ │ ├── component_generator.rb
│ │ ├── controller_generator.rb
│ │ ├── resource_override.rb
│ │ ├── model_generator.rb
│ │ ├── generator_helpers.rb
│ │ ├── bootstrap_generator.rb
│ │ └── install_generator.rb
├── ember
│ └── rails
│ │ ├── version.rb
│ │ └── engine.rb
└── ember_rails.rb
├── Gemfile
├── app
└── assets
│ └── javascripts
│ └── ember-rails
│ ├── module_prefix.module.es6.erb
│ ├── shims.js
│ └── application.module.es6
├── .gitignore
├── gemfiles
├── rails32_ember_113.gemfile
├── rails32_ember_latest.gemfile
├── rails40_ember_113.gemfile
├── rails40_ember_latest.gemfile
├── rails41_ember_113.gemfile
├── rails41_ember_latest.gemfile
├── rails42_ember_113.gemfile
├── rails42_ember_latest.gemfile
├── rails50_ember_113.gemfile
├── rails50_ember_latest.gemfile
├── sprockets_3.gemfile
├── rails32_ember_18.gemfile
├── rails40_ember_18.gemfile
├── rails41_ember_18.gemfile
├── rails42_ember_18.gemfile
├── sprockets_rails_3.gemfile
└── rails50_ember_18.gemfile
├── Rakefile
├── CODE_OF_CONDUCT.md
├── LICENSE
├── ember-rails.gemspec
├── .travis.yml
├── CHANGELOG.md
└── README.md
/test/dummy/log/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/dummy/app/mailers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/dummy/app/models/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/test/dummy/public/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lib/ember-rails.rb:
--------------------------------------------------------------------------------
1 | require 'ember_rails'
2 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 | gemspec
3 |
--------------------------------------------------------------------------------
/lib/generators/templates/component.template.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/templates/test.js.hjs:
--------------------------------------------------------------------------------
1 | {{test}}
2 |
--------------------------------------------------------------------------------
/test/dummy/app/helpers/home_helper.rb:
--------------------------------------------------------------------------------
1 | module HomeHelper
2 | end
3 |
--------------------------------------------------------------------------------
/test/dummy/app/helpers/application_helper.rb:
--------------------------------------------------------------------------------
1 | module ApplicationHelper
2 | end
3 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/non-ember.module.es6:
--------------------------------------------------------------------------------
1 | export default 'non ember';
2 |
--------------------------------------------------------------------------------
/lib/generators/templates/application.hbs:
--------------------------------------------------------------------------------
1 | <%= application_name %>
2 |
3 | {{outlet}}
--------------------------------------------------------------------------------
/lib/ember/rails/version.rb:
--------------------------------------------------------------------------------
1 | module Ember
2 | module Rails
3 | VERSION = '0.20.5'
4 | end
5 | end
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/templates/hairy.mustache.hbs:
--------------------------------------------------------------------------------
1 | This is a great
2 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/templates/new_lines.js.hjs:
--------------------------------------------------------------------------------
1 | {{#if something}}
2 | {{something}}
3 | {{/if}}
4 |
--------------------------------------------------------------------------------
/test/dummy/app/views/home/index.html.erb:
--------------------------------------------------------------------------------
1 | Home#index
2 | Find me in app/views/home/index.html.erb
3 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/assets.rb:
--------------------------------------------------------------------------------
1 | Rails.application.config.assets.precompile += %w( templates/test.js )
2 |
--------------------------------------------------------------------------------
/lib/generators/templates/template.hbs:
--------------------------------------------------------------------------------
1 | <%= class_name %>
2 |
3 | Your content here.
4 |
5 | {{outlet}}
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/service.em:
--------------------------------------------------------------------------------
1 | class <%= application_name.camelize %>.<%= class_name %>Service extends Ember.Service
2 |
--------------------------------------------------------------------------------
/test/dummy/app/controllers/home_controller.rb:
--------------------------------------------------------------------------------
1 | class HomeController < ApplicationController
2 | def index
3 | end
4 |
5 | end
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/service.coffee:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.<%= class_name %>Service = Ember.Service.extend({
2 |
3 | })
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/service.js:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.<%= class_name %>Service = Ember.Service.extend({
2 |
3 | });
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/service.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Service.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/store.module.es6:
--------------------------------------------------------------------------------
1 | import DS from 'ember-data';
2 |
3 | export default DS.Store.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/app/assets/javascripts/ember-rails/module_prefix.module.es6.erb:
--------------------------------------------------------------------------------
1 | export default <%= Rails.application.config.ember.module_prefix.to_json %>;
2 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/mixins/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Mixin.create({
4 | });
5 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/views/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.View.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/routes/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Route.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/controllers/application_controller.rb:
--------------------------------------------------------------------------------
1 | class ApplicationController < ActionController::Base
2 | protect_from_forgery
3 | end
4 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/components/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Component.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/controllers/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Controller.extend({
4 | });
5 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/services/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Service.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/transforms/user.module.es6:
--------------------------------------------------------------------------------
1 | import DS from 'ember-data';
2 |
3 | export default DS.Transform.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/adapters/user.module.es6:
--------------------------------------------------------------------------------
1 | import DS from 'ember-data';
2 |
3 | export default DS.ActiveModelAdapter.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.gem
2 | .bundle
3 | Gemfile.lock
4 | gemfiles/*.lock
5 | pkg/*
6 | *.rbc
7 | *.log
8 | test/dummy/tmp
9 | .DS_Store
10 | *.swp
11 | *.swo
12 |
--------------------------------------------------------------------------------
/gemfiles/rails32_ember_113.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 3.2'
4 | gem 'ember-source', '~> 1.13.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails32_ember_latest.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 3.2'
4 | gem 'ember-source', '~> 2.2.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails40_ember_113.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.0.0'
4 | gem 'ember-source', '~> 1.13.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails40_ember_latest.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.0.0'
4 | gem 'ember-source', '~> 2.2.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails41_ember_113.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.1.0'
4 | gem 'ember-source', '~> 1.13.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails41_ember_latest.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.1.0'
4 | gem 'ember-source', '~> 2.2.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails42_ember_113.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.2.0'
4 | gem 'ember-source', '~> 1.13.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails42_ember_latest.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.2.0'
4 | gem 'ember-source', '~> 2.2.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/initializers/user.module.es6:
--------------------------------------------------------------------------------
1 | export default {
2 | name: 'ping',
3 | initialize() {
4 | console.log('ping');
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/serializers/user.module.es6:
--------------------------------------------------------------------------------
1 | import DS from 'ember-data';
2 |
3 | export default DS.ActiveModelSerializer.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/gemfiles/rails50_ember_113.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 5.0.0.beta1'
4 | gem 'ember-source', '~> 1.13.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/gemfiles/rails50_ember_latest.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 5.0.0.beta1'
4 | gem 'ember-source', '~> 2.2.0'
5 |
6 | gemspec path: '../'
7 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/instance-initializers/user.module.es6:
--------------------------------------------------------------------------------
1 | export default {
2 | name: 'ping',
3 | initialize() {
4 | console.log('ping');
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/environment.em:
--------------------------------------------------------------------------------
1 | window.EmberENV = {
2 | # FEATURES: {},
3 | # EXTEND_PROTOTYPES: {
4 | # Function: false,
5 | # Array: true
6 | # }
7 | }
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/environment.coffee:
--------------------------------------------------------------------------------
1 | window.EmberENV = {
2 | # FEATURES: {},
3 | # EXTEND_PROTOTYPES: {
4 | # Function: false,
5 | # Array: true
6 | # }
7 | }
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/environment.js:
--------------------------------------------------------------------------------
1 | window.EmberENV = {
2 | // FEATURES: {},
3 | // EXTEND_PROTOTYPES: {
4 | // Function: false,
5 | // Array: true
6 | // }
7 | };
8 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/stylesheets/home.css:
--------------------------------------------------------------------------------
1 | /*
2 | Place all the styles related to the matching controller here.
3 | They will automatically be included in application.css.
4 | */
5 |
--------------------------------------------------------------------------------
/gemfiles/sprockets_3.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.2.0'
4 | gem 'ember-source', '~> 1.13.0'
5 | gem 'sprockets', '~> 3.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/router.em:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/routing/
2 |
3 | <%= application_name.camelize %>.Router.map ->
4 | # @resource('posts')
5 |
6 |
--------------------------------------------------------------------------------
/test/dummy/config.ru:
--------------------------------------------------------------------------------
1 | # This file is used by Rack-based servers to start the application.
2 |
3 | require ::File.expand_path('../config/environment', __FILE__)
4 | run Dummy::Application
5 |
--------------------------------------------------------------------------------
/test/dummy/config/engine.rb:
--------------------------------------------------------------------------------
1 | ENGINE_ROOT = File.expand_path('../../', __FILE__) unless defined?(ENGINE_ROOT)
2 | ENGINE_PATH = "#{ENGINE_ROOT}/lib/dummy/engine" unless defined?(ENGINE_PATH)
3 |
--------------------------------------------------------------------------------
/lib/generators/templates/router.coffee:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/routing/
2 |
3 | <%= application_name.camelize %>.Router.map ()->
4 | # @resource('posts')
5 |
6 |
--------------------------------------------------------------------------------
/gemfiles/rails32_ember_18.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 3.2'
4 | gem 'ember-source', '~> 1.8.0'
5 | gem 'handlebars-source', '~> 1.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/initializer.module.es6:
--------------------------------------------------------------------------------
1 | export default {
2 | name: '<%= class_name.underscore.dasherize %>',
3 |
4 | initialize() {
5 | // Write your initializer here
6 | }
7 | };
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/route.em:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/routing/
2 |
3 | class <%= application_name.camelize %>.<%= class_name.camelize %>Route extends Ember.Route
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/route.module.es6:
--------------------------------------------------------------------------------
1 | // For more information see: http://emberjs.com/guides/routing/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.Route.extend({
6 |
7 | });
8 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/helpers/user.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | export default Ember.Handlebars.makeBoundHelper(function(value, options) {
4 | return value;
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/config/environment.rb:
--------------------------------------------------------------------------------
1 | # Load the rails application
2 | require File.expand_path('../application', __FILE__)
3 |
4 | # Initialize the rails application
5 | Dummy::Application.initialize!
6 |
--------------------------------------------------------------------------------
/gemfiles/rails40_ember_18.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.0.0'
4 | gem 'ember-source', '~> 1.8.0'
5 | gem 'handlebars-source', '~> 1.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/gemfiles/rails41_ember_18.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.1.0'
4 | gem 'ember-source', '~> 1.8.0'
5 | gem 'handlebars-source', '~> 1.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/gemfiles/rails42_ember_18.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.2.0'
4 | gem 'ember-source', '~> 1.8.0'
5 | gem 'handlebars-source', '~> 1.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/gemfiles/sprockets_rails_3.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 4.2.0'
4 | gem 'ember-source', '~> 1.13.0'
5 | gem 'sprockets-rails', '~> 3.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/component.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/components/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Component = Ember.Component.extend({
4 | });
5 |
--------------------------------------------------------------------------------
/lib/generators/templates/controller.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | class <%= application_name.camelize %>.<%= class_name %>Controller extends Ember.Controller
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/initializer.em:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.initializer
2 | name: '<%= class_name.underscore.dasherize %>'
3 |
4 | initialize: ->
5 | # Write your initializer here
6 |
--------------------------------------------------------------------------------
/gemfiles/rails50_ember_18.gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rails', '~> 5.0.0.beta1'
4 | gem 'ember-source', '~> 1.8.0'
5 | gem 'handlebars-source', '~> 1.0.0'
6 |
7 | gemspec path: '../'
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/component.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/components/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.Component.extend({
6 |
7 | });
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/controller.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.Controller.extend({
6 |
7 | });
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/object_controller.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | class <%= application_name.camelize %>.<%= class_name %>Controller extends Ember.Controller
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/route.coffee:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/routing/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>Route = Ember.Route.extend({
4 |
5 | })
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/route.js:
--------------------------------------------------------------------------------
1 | // For more information see: http://emberjs.com/guides/routing/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>Route = Ember.Route.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/router.js:
--------------------------------------------------------------------------------
1 | // For more information see: http://emberjs.com/guides/routing/
2 |
3 | <%= application_name.camelize %>.Router.map(function() {
4 | // this.resource('posts');
5 | });
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/models/user.module.es6:
--------------------------------------------------------------------------------
1 | import DS from 'ember-data';
2 |
3 | export default DS.Model.extend({
4 | firstName: DS.attr('string'),
5 | lastName: DS.attr('string')
6 | });
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/array_controller.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | class <%= application_name.camelize %>.<%= class_name %>Controller extends Ember.ArrayController
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/component.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/components/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Component = Ember.Component.extend({
4 |
5 | })
6 |
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/controller.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.Controller.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/initializer.coffee:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.initializer({
2 | name: '<%= class_name.underscore.dasherize %>'
3 |
4 | initialize: ->
5 | # Write your initializer here
6 | })
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/component.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/components/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Component = Ember.Component.extend({
4 |
5 | })
6 |
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/instance-initializer.module.es6:
--------------------------------------------------------------------------------
1 | export default {
2 | name: '<%= class_name.underscore.dasherize %>',
3 |
4 | initialize(application) {
5 | // Write your initializer here
6 | }
7 | };
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/application_adapter.coffee:
--------------------------------------------------------------------------------
1 | # Override the default adapter with the `DS.ActiveModelAdapter` which
2 |
3 | <%= application_name.camelize %>.ApplicationAdapter = DS.ActiveModelAdapter.extend({
4 | })
5 |
--------------------------------------------------------------------------------
/lib/generators/templates/controller.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.Controller.extend({
4 |
5 | })
6 |
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/object_controller.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.Controller.extend({
4 |
5 | })
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/object_controller.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.Controller.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/object_controller.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.ObjectController.extend({
6 |
7 | });
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/array_controller.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/controllers/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.ArrayController.extend({
4 |
5 | })
6 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/router.module.es6:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 |
3 | var Router = Ember.Router.extend({
4 |
5 | });
6 |
7 | Router.map(function() {
8 |
9 | });
10 |
11 | export default Router;
12 |
--------------------------------------------------------------------------------
/lib/generators/templates/adapter.em:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/models/customizing-adapters/
2 |
3 | class <%= application_name.camelize %>.<%= class_name.camelize %>Adapter extends DS.ActiveModelAdapter
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/environment.module.es6:
--------------------------------------------------------------------------------
1 | export default {
2 | EmberENV: {
3 | // FEATURES: {},
4 | // EXTEND_PROTOTYPES: {
5 | // Function: false,
6 | // Array: true
7 | // }
8 | }
9 | };
10 |
--------------------------------------------------------------------------------
/lib/generators/templates/initializer.js:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.initializer({
2 | name: '<%= class_name.underscore.dasherize %>',
3 |
4 | initialize: function() {
5 | // Write your initializer here
6 | }
7 | });
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/adapter.coffee:
--------------------------------------------------------------------------------
1 | # For more information see: http://emberjs.com/guides/models/customizing-adapters/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>Adapter = DS.ActiveModelAdapter.extend({
4 |
5 | })
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/adapter.js:
--------------------------------------------------------------------------------
1 | // For more information see: http://emberjs.com/guides/models/customizing-adapters/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>Adapter = DS.ActiveModelAdapter.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/instance-initializer.em:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.instanceInitializer({
2 | name: '<%= class_name.underscore.dasherize %>'
3 |
4 | initialize: (application) ->
5 | # Write your initializer here
6 | })
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/view.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/views/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>View = Ember.View.extend
4 | templateName: '<%= handlebars_template_path %>'
5 |
--------------------------------------------------------------------------------
/lib/generators/templates/view.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/views/
2 |
3 | class <%= application_name.camelize %>.<%= class_name.camelize %>View extends Ember.View
4 | templateName: '<%= handlebars_template_path %>'
5 |
--------------------------------------------------------------------------------
/lib/generators/templates/view.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/views/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.View.extend({
6 | templateName: '<%= handlebars_template_path %>'
7 | });
8 |
--------------------------------------------------------------------------------
/app/assets/javascripts/ember-rails/shims.js:
--------------------------------------------------------------------------------
1 | define('ember', [], function() {
2 | return {
3 | 'default': Ember
4 | };
5 | });
6 |
7 | define('ember-data', [], function() {
8 | return {
9 | 'default': DS
10 | };
11 | });
12 |
--------------------------------------------------------------------------------
/lib/generators/templates/instance-initializer.coffee:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.instanceInitializer({
2 | name: '<%= class_name.underscore.dasherize %>'
3 |
4 | initialize: (application) ->
5 | # Write your initializer here
6 | })
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/view.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/views/
2 |
3 | <%= application_name.camelize %>.<%= class_name.camelize %>View = Ember.View.extend({
4 | templateName: '<%= handlebars_template_path %>'
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/application_adapter.module.es6:
--------------------------------------------------------------------------------
1 | // Override the default adapter with the `DS.ActiveModelAdapter` which
2 | // is built to work nicely with the ActiveModel::Serializers gem.
3 | export default DS.ActiveModelAdapter.extend({
4 | });
5 |
--------------------------------------------------------------------------------
/lib/generators/templates/instance-initializer.js:
--------------------------------------------------------------------------------
1 | <%= application_name.camelize %>.instanceInitializer({
2 | name: '<%= class_name.underscore.dasherize %>',
3 |
4 | initialize: function(application) {
5 | // Write your initializer here
6 | }
7 | });
8 |
--------------------------------------------------------------------------------
/test/dummy/config/locales/en.yml:
--------------------------------------------------------------------------------
1 | # Sample localization file for English. Add more files in this directory for other locales.
2 | # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3 |
4 | en:
5 | hello: "Hello world"
6 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/mime_types.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new mime types for use in respond_to blocks:
4 | # Mime::Type.register "text/richtext", :rtf
5 | # Mime::Type.register_alias "text/html", :iphone
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/array_controller.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/
2 |
3 | <%= application_name.camelize %>.<%= class_name %>Controller = Ember.ArrayController.extend({
4 |
5 | });
6 |
--------------------------------------------------------------------------------
/lib/generators/templates/array_controller.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/
2 |
3 | import Ember from 'ember';
4 |
5 | export default Ember.ArrayController.extend({
6 |
7 | });
8 |
--------------------------------------------------------------------------------
/lib/generators/templates/application_adapter.em:
--------------------------------------------------------------------------------
1 | # Override the default adapter with the `DS.ActiveModelAdapter` which
2 | # is built to work nicely with the ActiveModel::Serializers gem.
3 | class <%= application_name.camelize %>.ApplicationAdapter extends DS.ActiveModelAdapter
4 |
--------------------------------------------------------------------------------
/lib/generators/templates/application_adapter.js:
--------------------------------------------------------------------------------
1 | // Override the default adapter with the `DS.ActiveModelAdapter` which
2 | // is built to work nicely with the ActiveModel::Serializers gem.
3 | <%= application_name.camelize %>.ApplicationAdapter = DS.ActiveModelAdapter.extend({
4 | });
5 |
--------------------------------------------------------------------------------
/test/dummy/config/boot.rb:
--------------------------------------------------------------------------------
1 | require 'rubygems'
2 | gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3 |
4 | if File.exist?(gemfile)
5 | ENV['BUNDLE_GEMFILE'] = gemfile
6 | require 'bundler'
7 | Bundler.setup
8 | end
9 |
10 | $:.unshift File.expand_path('../../../../lib', __FILE__)
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | require "bundler/setup"
2 | Bundler::GemHelper.install_tasks
3 |
4 | require 'rake/testtask'
5 |
6 | Rake::TestTask.new(:test) do |t|
7 | t.libs << 'lib'
8 | t.libs << 'test'
9 | t.pattern = 'test/**/*_test.rb'
10 | t.verbose = false
11 | end
12 |
13 | task :default => :test
14 |
--------------------------------------------------------------------------------
/test/dummy/Rakefile:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env rake
2 | # Add your own tasks in files placed in lib/tasks ending in .rake,
3 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4 |
5 | require File.expand_path('../config/application', __FILE__)
6 |
7 | Dummy::Application.load_tasks
8 |
--------------------------------------------------------------------------------
/test/dummy/script/rails:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3 |
4 | APP_PATH = File.expand_path('../../config/application', __FILE__)
5 | require File.expand_path('../../config/boot', __FILE__)
6 | require 'rails/commands'
7 |
--------------------------------------------------------------------------------
/lib/generators/templates/router.module.es6:
--------------------------------------------------------------------------------
1 | // For more information see: http://emberjs.com/guides/routing/
2 |
3 | import Ember from 'ember';
4 |
5 | var Router = Ember.Router.extend({
6 | // location: 'history'
7 | });
8 |
9 | Router.map(function() {
10 | // this.resource('posts');
11 | });
12 |
13 | export default Router;
14 |
--------------------------------------------------------------------------------
/lib/generators/templates/app.em:
--------------------------------------------------------------------------------
1 | #= require_tree ./adapters
2 | #= require_tree ./mixins
3 | #= require_tree ./models
4 | #= require_tree ./controllers
5 | #= require_tree ./views
6 | #= require_tree ./helpers
7 | #= require_tree ./components
8 | #= require_tree ./templates
9 | #= require_tree ./routes
10 | #= require ./router
11 | #= require_self
12 |
--------------------------------------------------------------------------------
/lib/generators/templates/app.coffee:
--------------------------------------------------------------------------------
1 | #= require_tree ./adapters
2 | #= require_tree ./mixins
3 | #= require_tree ./models
4 | #= require_tree ./controllers
5 | #= require_tree ./views
6 | #= require_tree ./helpers
7 | #= require_tree ./components
8 | #= require_tree ./templates
9 | #= require_tree ./routes
10 | #= require ./router
11 | #= require_self
12 |
--------------------------------------------------------------------------------
/lib/generators/templates/app.js:
--------------------------------------------------------------------------------
1 | //= require_tree ./adapters
2 | //= require_tree ./mixins
3 | //= require_tree ./models
4 | //= require_tree ./controllers
5 | //= require_tree ./views
6 | //= require_tree ./helpers
7 | //= require_tree ./components
8 | //= require_tree ./templates
9 | //= require_tree ./routes
10 | //= require ./router
11 | //= require_self
12 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | The Ember team and community are committed to everyone having a safe and inclusive experience.
2 |
3 | **Our Community Guidelines / Code of Conduct can be found here**:
4 |
5 | http://emberjs.com/guidelines/
6 |
7 | For a history of updates, see the page history here:
8 |
9 | https://github.com/emberjs/website/commits/master/source/guidelines.html.erb
10 |
--------------------------------------------------------------------------------
/test/dummy/app/views/layouts/application.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Dummy
5 | <%= stylesheet_link_tag "application" %>
6 | <%= javascript_include_tag "application" %>
7 | <%= javascript_include_tag "templates/test" %>
8 | <%= csrf_meta_tags %>
9 |
10 |
11 |
12 | <%= yield %>
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/stylesheets/application.css:
--------------------------------------------------------------------------------
1 | /*
2 | * This is a manifest file that'll automatically include all the stylesheets available in this directory
3 | * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4 | * the top of the compiled file, but it's generally better to create a new file per style scope.
5 | *= require_self
6 | *= require_tree .
7 | */
--------------------------------------------------------------------------------
/test/dummy/config/initializers/inflections.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new inflection rules using the following format
4 | # (all these examples are active by default):
5 | # ActiveSupport::Inflector.inflections do |inflect|
6 | # inflect.plural /^(ox)$/i, '\1en'
7 | # inflect.singular /^(ox)en/i, '\1'
8 | # inflect.irregular 'person', 'people'
9 | # inflect.uncountable %w( fish sheep )
10 | # end
11 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/backtrace_silencers.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5 |
6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7 | # Rails.backtrace_cleaner.remove_silencers!
8 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/session_store.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
4 |
5 | # Use the database for sessions instead of the cookie-based default,
6 | # which shouldn't be used to store highly confidential information
7 | # (create the session table with "rails generate session_migration")
8 | # Dummy::Application.config.session_store :active_record_store
9 |
--------------------------------------------------------------------------------
/lib/generators/templates/model.em:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/models/defining-models/
2 |
3 | class <%= application_name.camelize %>.<%= class_name %> extends DS.Model
4 | <% attributes.each do |attribute| -%>
5 | <%= attribute[:name].camelize(:lower) %>: <%=
6 | if %w(references belongs_to).member?(attribute[:type])
7 | "DS.belongsTo '%s'" % attribute[:name].camelize(:lower)
8 | else
9 | "DS.attr '%s'" % attribute[:type]
10 | end
11 | %>
12 | <% end -%>
13 |
--------------------------------------------------------------------------------
/lib/generators/templates/application.em:
--------------------------------------------------------------------------------
1 | #= require jquery
2 | #= require jquery_ujs
3 | <%= "#= require handlebars\n" if Ember::Handlebars::Template.handlebars_available? -%>
4 | #= require ./environment
5 | #= require ember
6 | #= require ember-data
7 | #= require active-model-adapter
8 | #= require_self
9 | #= require ./<%= application_name.underscore.dasherize %>
10 |
11 | # for more details see: http://emberjs.com/guides/application/
12 | window.<%= application_name.camelize %> = Ember.Application.create()
13 |
--------------------------------------------------------------------------------
/lib/generators/templates/application.coffee:
--------------------------------------------------------------------------------
1 | #= require jquery
2 | #= require jquery_ujs
3 | <%= "#= require handlebars\n" if Ember::Handlebars::Template.handlebars_available? -%>
4 | #= require ./environment
5 | #= require ember
6 | #= require ember-data
7 | #= require active-model-adapter
8 | #= require_self
9 | #= require ./<%= application_name.underscore.dasherize %>
10 |
11 | # for more details see: http://emberjs.com/guides/application/
12 | window.<%= application_name.camelize %> = Ember.Application.create()
13 |
14 |
--------------------------------------------------------------------------------
/lib/generators/templates/model.coffee:
--------------------------------------------------------------------------------
1 | # for more details see: http://emberjs.com/guides/models/defining-models/
2 |
3 | <%= application_name.camelize %>.<%= class_name %> = DS.Model.extend<%= "()" if attributes.length == 0 %>
4 | <% attributes.each do |attribute| -%>
5 | <%= attribute[:name].camelize(:lower) %>: <%=
6 | if %w(references belongs_to).member?(attribute[:type])
7 | "DS.belongsTo '%s'" % attribute[:name].camelize(:lower)
8 | else
9 | "DS.attr '%s'" % attribute[:type]
10 | end
11 | %>
12 | <% end -%>
13 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/wrap_parameters.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 | #
3 | # This file contains settings for ActionController::ParamsWrapper which
4 | # is enabled by default.
5 |
6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7 | ActionController::Base.wrap_parameters :format => [:json]
8 |
9 | # Disable root element in JSON by default.
10 | # if defined?(ActiveRecord)
11 | # ActiveRecord::Base.include_root_in_json = false
12 | # end
13 |
--------------------------------------------------------------------------------
/lib/generators/templates/app.module.es6:
--------------------------------------------------------------------------------
1 | //= require_tree ./adapters
2 | //= require_tree ./mixins
3 | //= require_tree ./models
4 | //= require_tree ./controllers
5 | //= require_tree ./views
6 | //= require_tree ./helpers
7 | //= require_tree ./components
8 | //= require_tree ./templates
9 | //= require_tree ./routes
10 | //= require ./router
11 | //
12 | //= require_self
13 |
14 | import Application from 'ember-rails/application';
15 |
16 | // for more details see: http://emberjs.com/guides/application/
17 | export default Application;
18 |
--------------------------------------------------------------------------------
/lib/generators/templates/model.js:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/models/defining-models/
2 |
3 | <%= application_name.camelize %>.<%= class_name %> = DS.Model.extend({
4 | <% attributes.each_with_index do |attribute, idx| -%>
5 | <%= attribute[:name].camelize(:lower) %>: <%=
6 | if %w(references belongs_to).member?(attribute[:type])
7 | "DS.belongsTo('%s')" % attribute[:name].camelize(:lower)
8 | else
9 | "DS.attr('%s')" % attribute[:type]
10 | end
11 | %><% if (idx < attributes.length-1) %>,<% end %>
12 | <% end -%>
13 | });
14 |
--------------------------------------------------------------------------------
/lib/generators/templates/model.module.es6:
--------------------------------------------------------------------------------
1 | // for more details see: http://emberjs.com/guides/models/defining-models/
2 |
3 | import DS from 'ember-data';
4 |
5 | export default DS.Model.extend({
6 | <% attributes.each_with_index do |attribute, idx| -%>
7 | <%= attribute[:name].camelize(:lower) %>: <%=
8 | if %w(references belongs_to).member?(attribute[:type])
9 | "DS.belongsTo('%s')" % attribute[:name].camelize(:lower)
10 | else
11 | "DS.attr('%s')" % attribute[:type]
12 | end
13 | %><% if (idx < attributes.length-1) %>,<% end %>
14 | <% end -%>
15 | });
16 |
--------------------------------------------------------------------------------
/app/assets/javascripts/ember-rails/application.module.es6:
--------------------------------------------------------------------------------
1 | //= require ember/loader
2 | //= require ember-rails/shims
3 | //= require ember/resolver
4 | //= require ember/load-initializers
5 | //
6 | //= require ember-rails/module_prefix
7 |
8 | import Ember from 'ember';
9 | import Resolver from 'ember/resolver';
10 | import loadInitializers from 'ember/load-initializers';
11 | import modulePrefix from 'ember-rails/module_prefix';
12 |
13 | let App = Ember.Application.extend({
14 | modulePrefix: modulePrefix,
15 | Resolver: Resolver
16 | });
17 |
18 | loadInitializers(App, modulePrefix);
19 |
20 | export default App;
21 |
--------------------------------------------------------------------------------
/test/dummy/app/assets/javascripts/application.js:
--------------------------------------------------------------------------------
1 | // This is a manifest file that'll be compiled into including all the files listed below.
2 | // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3 | // be included in the compiled file accessible from http://example.com/assets/application.js
4 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5 | // the compiled file.
6 | //
7 | //= require jquery
8 | //= require jquery_ujs
9 | //= require handlebars
10 | //= require ember
11 | //= require ember-data
12 | //= require ember-rails/application
13 | //= require_tree .
14 |
--------------------------------------------------------------------------------
/lib/generators/templates/application.es6:
--------------------------------------------------------------------------------
1 | //= require jquery
2 | //= require jquery_ujs
3 | <%= "//= require handlebars\n" if Ember::Handlebars::Template.handlebars_available? -%>
4 | //= require ./environment
5 | //= require ember
6 | //= require ember-data
7 | //= require ember-rails/application
8 | //
9 | //= require ./<%= application_name.underscore.dasherize %>
10 | //= require_self
11 |
12 | import <%= application_name.camelize %> from '<%= application_name.underscore.dasherize %>';
13 | // import config from 'environment'; // You can use `config` for application specific variables such as API key, etc.
14 |
15 | <%= application_name.camelize %>.create();
16 |
--------------------------------------------------------------------------------
/test/dummy/config/initializers/secret_token.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Your secret key for verifying the integrity of signed cookies.
4 | # If you change this key, all old signed cookies will become invalid!
5 | # Make sure the secret is at least 30 characters and all random,
6 | # no regular words or you'll be exposed to dictionary attacks.
7 | Dummy::Application.config.secret_token = '3499a0cb5ffbbcbf4a36f0202d145eac76a1e58ed992b7f7deb659d776b25c658799dbd3b69ecd913ad645e8e694673ae41393d4e6353ae86105f3fc099d7d66'
8 |
9 | # Renamed in rails 4
10 | Dummy::Application.config.secret_key_base = Dummy::Application.config.secret_token
--------------------------------------------------------------------------------
/test/dummy/config/database.yml:
--------------------------------------------------------------------------------
1 | # SQLite version 3.x
2 | # gem install sqlite3
3 | #
4 | # Ensure the SQLite 3 gem is defined in your Gemfile
5 | # gem 'sqlite3'
6 | development:
7 | adapter: sqlite3
8 | database: db/development.sqlite3
9 | pool: 5
10 | timeout: 5000
11 |
12 | # Warning: The database defined as "test" will be erased and
13 | # re-generated from your development database when you run "rake".
14 | # Do not set this db to the same as development or production.
15 | test:
16 | adapter: sqlite3
17 | database: db/test.sqlite3
18 | pool: 5
19 | timeout: 5000
20 |
21 | production:
22 | adapter: sqlite3
23 | database: db/production.sqlite3
24 | pool: 5
25 | timeout: 5000
26 |
--------------------------------------------------------------------------------
/lib/generators/templates/application.js:
--------------------------------------------------------------------------------
1 | //= require jquery
2 | //= require jquery_ujs
3 | <%= "//= require handlebars\n" if Ember::Handlebars::Template.handlebars_available? -%>
4 | //= require ./environment
5 | //= require ember
6 | //= require ember-data
7 | //= require active-model-adapter
8 | <%- if engine_extension == 'module.es6' -%>
9 | //= require ember-rails/application
10 | //
11 | //= require ./<%= application_name.underscore.dasherize %>
12 | //= require_self
13 |
14 | require('<%= application_name.underscore.dasherize %>');
15 | <%- else -%>
16 |
17 | //= require_self
18 | //= require ./<%= application_name.underscore.dasherize %>
19 | <%- end -%>
20 |
21 | // for more details see: http://emberjs.com/guides/application/
22 | <%= application_name.camelize %> = Ember.Application.create();
23 |
--------------------------------------------------------------------------------
/lib/generators/ember/template_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class TemplateGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js template"
11 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
12 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
13 |
14 | def create_template_files
15 | file_path = File.join(ember_path, 'templates', class_path, "#{file_name.dasherize}.hbs")
16 | template 'template.hbs', file_path
17 | end
18 |
19 | end
20 | end
21 | end
22 |
--------------------------------------------------------------------------------
/test/dummy/public/422.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The change you wanted was rejected (422)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
The change you wanted was rejected.
23 |
Maybe you tried to change something you didn't have access to.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/test/dummy/public/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The page you were looking for doesn't exist (404)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
The page you were looking for doesn't exist.
23 |
You may have mistyped the address or the page may have moved.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/test/dummy/public/500.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | We're sorry, but something went wrong (500)
5 |
17 |
18 |
19 |
20 |
21 |
22 |
We're sorry, but something went wrong.
23 |
We've been notified about this issue and we'll take a look at it shortly.
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/test/test_helper.rb:
--------------------------------------------------------------------------------
1 | # Configure Rails Environment
2 | ENV['RAILS_ENV'] = 'test'
3 |
4 | require 'fileutils'
5 | # Remove tmp dir of dummy app before it's booted.
6 | FileUtils.rm_rf "#{File.dirname(__FILE__)}/dummy/tmp"
7 |
8 | require File.expand_path('../dummy/config/environment.rb', __FILE__)
9 | require 'rails/generators'
10 | require 'rails/test_help'
11 |
12 | begin
13 | require 'minitest'
14 | TestCase = Minitest::Test
15 | rescue LoadError
16 | require 'test/unit'
17 | puts 'minitest not found, falling back to test/unit'
18 | TestCase = Test::Unit::TestCase
19 | end
20 |
21 | if Rails.version >= "4.0.0"
22 | IntegrationTest = ActionDispatch::IntegrationTest
23 | else
24 | require 'json'
25 | IntegrationTest = ActionController::IntegrationTest
26 | end
27 |
28 | require 'active_support/core_ext/kernel/reporting'
29 |
30 | Rails.backtrace_cleaner.remove_silencers!
31 |
--------------------------------------------------------------------------------
/lib/generators/ember/adapter_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class AdapterGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js adapter"
11 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
14 |
15 | def create_adapter_files
16 | file_path = File.join(ember_path, 'adapters', class_path, "#{file_name}.#{engine_extension}")
17 | template "adapter.#{engine_extension}", file_path
18 | end
19 | end
20 | end
21 | end
22 |
--------------------------------------------------------------------------------
/lib/generators/ember/route_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class RouteGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js route"
11 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
14 |
15 | def create_route_files
16 | file_path = File.join(ember_path, 'routes', class_path, "#{file_name.dasherize}.#{engine_extension}")
17 | template "route.#{engine_extension}", file_path
18 | end
19 | end
20 | end
21 | end
22 |
--------------------------------------------------------------------------------
/lib/generators/ember/service_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ServiceGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js service"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
14 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
15 |
16 | def create_service_files
17 | file_path = File.join(ember_path, 'services', class_path, "#{file_name.dasherize}.#{engine_extension}")
18 |
19 | template "service.#{engine_extension}", file_path
20 | end
21 | end
22 | end
23 | end
24 |
--------------------------------------------------------------------------------
/lib/generators/ember/initializer_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class InitializerGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js initializer"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
14 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
15 |
16 | def create_initializer_files
17 | file_path = File.join(ember_path, 'initializers', class_path, "#{file_name.dasherize}.#{engine_extension}")
18 |
19 | template "initializer.#{engine_extension}", file_path
20 | end
21 | end
22 | end
23 | end
24 |
--------------------------------------------------------------------------------
/test/es6_module_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 |
3 | class Es6ModuleTest < IntegrationTest
4 |
5 | %w(models controllers views routes components helpers mixins services initializers instance-initializers serializers adapters transforms).each do |type|
6 | test "#{type} type module should be registered with module_prefix" do
7 | get "/assets/#{type}/user.js"
8 | assert_response :success
9 | assert_match %r{define\('ember-app/#{type}/user'}, @response.body
10 | end
11 | end
12 |
13 | %w(store router).each do |type|
14 | test "#{type} type module should be registered with module_prefix" do
15 | get "/assets/#{type}.js"
16 | assert_response :success
17 | assert_match %r{define\('ember-app/#{type}'}, @response.body
18 | end
19 | end
20 |
21 | test "non specified with emebr module should be registered without module_prefix" do
22 | get "/assets/non-ember.js"
23 | assert_response :success
24 | assert_match %r{define\('non-ember'}, @response.body
25 | end
26 |
27 | end
28 |
--------------------------------------------------------------------------------
/lib/generators/ember/instance_initializer_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class InstanceInitializerGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js instance initializer"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
14 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
15 |
16 | def create_instance_initializer_files
17 | file_path = File.join(ember_path, 'instance-initializers', class_path, "#{file_name.dasherize}.#{engine_extension}")
18 |
19 | template "instance-initializer.#{engine_extension}", file_path
20 | end
21 | end
22 | end
23 | end
24 |
--------------------------------------------------------------------------------
/lib/generators/ember/view_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ViewGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js view and associated Handlebars template"
11 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
12 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
13 | class_option :with_template, :type => :boolean, :default => false, :desc => "Create template for this view"
14 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
15 |
16 | def create_view_files
17 | file_path = File.join(ember_path, 'views', class_path, "#{file_name.dasherize}.#{engine_extension}")
18 | template "view.#{engine_extension}", file_path
19 | invoke('ember:template', [ name ], options) if options[:with_template]
20 | end
21 |
22 | end
23 | end
24 | end
25 |
--------------------------------------------------------------------------------
/test/dummy/config/environments/development.rb:
--------------------------------------------------------------------------------
1 | Dummy::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # In the development environment your application's code is reloaded on
5 | # every request. This slows down response time but is perfect for development
6 | # since you don't have to restart the web server when you make code changes.
7 | config.cache_classes = false
8 |
9 | # Log error messages when you accidentally call methods on nil
10 | config.whiny_nils = true unless Rails.version >= '4.0.0'
11 |
12 | # Show full error reports and disable caching
13 | config.consider_all_requests_local = true
14 | config.action_controller.perform_caching = false
15 |
16 | # Don't care if the mailer can't send
17 | # config.action_mailer.raise_delivery_errors = false
18 |
19 | # Print deprecation notices to the Rails logger
20 | config.active_support.deprecation = :log
21 |
22 | # Only use best-standards-support built into browsers
23 | config.action_dispatch.best_standards_support = :builtin
24 |
25 | # Do not compress assets
26 | config.assets.compress = false
27 | end
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2012 Keith Pitt, Rob Monie, Joao Carlos, Paul Chavard and ember-rails contributors
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of
4 | this software and associated documentation files (the "Software"), to deal in
5 | the Software without restriction, including without limitation the rights to
6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7 | of the Software, and to permit persons to whom the Software is furnished to do
8 | so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | SOFTWARE.
20 |
--------------------------------------------------------------------------------
/lib/ember/rails/engine.rb:
--------------------------------------------------------------------------------
1 | require 'ember/handlebars/template'
2 | require 'active_model_serializers'
3 | require 'ember/es6_template'
4 | require 'ember/cli/assets'
5 |
6 | require 'sprockets/railtie'
7 |
8 | module Ember
9 | module Rails
10 | class Engine < ::Rails::Engine
11 | Ember::Handlebars::Template.configure do |handlebars_config|
12 | config.handlebars = handlebars_config
13 |
14 | config.handlebars.precompile = true
15 | config.handlebars.templates_root = 'templates'
16 | config.handlebars.templates_path_separator = '/'
17 | config.handlebars.output_type = :global
18 | config.handlebars.ember_template = Ember::VERSION =~ /\A1.[0-9]\./ ? 'Handlebars' : 'HTMLBars'
19 | end
20 |
21 | config.before_initialize do |app|
22 | Sprockets::Engines #force autoloading
23 | end
24 |
25 | config.before_initialize do |app|
26 | Ember::ES6Template.configure do |ember_config|
27 | ember_config.module_prefix = config.ember.module_prefix
28 | ember_config.prefix_files = config.ember.prefix_files
29 | ember_config.prefix_dirs = config.ember.prefix_dirs
30 | end
31 | end
32 | end
33 | end
34 | end
35 |
--------------------------------------------------------------------------------
/lib/generators/ember/resource_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ResourceGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js router, controller, view and template"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :skip_route, :type => :boolean, :default => false, :desc => "Don't create route"
14 | class_option :array, :type => :boolean, :default => false, :desc => "Create an Ember.ArrayController to represent multiple objects"
15 | class_option :object, :type => :boolean, :default => false, :desc => "Create an Ember.Controller to represent a single object"
16 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
17 |
18 |
19 | def create_resource_files
20 | invoke('ember:route', [ name ], options) unless options[:skip_route]
21 | invoke('ember:controller', [ name ], options)
22 | invoke('ember:view', [ name ], options)
23 | invoke('ember:template', [ name ], options)
24 | end
25 |
26 | end
27 | end
28 | end
29 |
--------------------------------------------------------------------------------
/test/generators/template_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/template_generator'
3 |
4 | class TemplateGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::TemplateGenerator
6 | destination File.join(Rails.root, "tmp", "generator_test_output")
7 | setup :prepare_destination
8 |
9 | %w(js coffee em es6).each do |engine|
10 | test "template with #{engine} as current engine" do
11 | run_generator ["post", "--javascript-engine", engine]
12 | assert_file "app/assets/javascripts/templates/post.hbs"
13 | end
14 | end
15 |
16 | test "Assert files are properly created with custom path" do
17 | custom_path = ember_path("custom")
18 | run_generator [ "post", "-d", custom_path ]
19 | assert_file "#{custom_path}/templates/post.hbs"
20 | end
21 |
22 | test "Uses config.ember.ember_path" do
23 | begin
24 | custom_path = ember_path("custom")
25 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
26 |
27 | run_generator ["post"]
28 | assert_file "#{custom_path}/templates/post.hbs"
29 | ensure
30 | ::Rails.configuration.ember.ember_path = old
31 | end
32 | end
33 |
34 | private
35 |
36 | def ember_path(custom_path = nil)
37 | "app/assets/javascripts/#{custom_path}"
38 | end
39 | end
40 |
41 |
--------------------------------------------------------------------------------
/test/precompile_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 |
3 | class PrecompileTest < TestCase
4 | def setup
5 | delete_assets!
6 | end
7 |
8 | def teardown
9 | ENV['RAILS_ENV'] = 'test'
10 | delete_assets!
11 | end
12 |
13 | def delete_assets!
14 | FileUtils.rm_rf app_path.join('public', 'assets')
15 | end
16 |
17 | def precompile!(rails_env)
18 | ENV['RAILS_ENV'] = rails_env
19 |
20 | FileUtils.cd(app_path) do
21 | output = `rake assets:precompile 2>&1`
22 | assert $?.exitstatus == 0, "running: 'rake assets:precompile' failed.\n#{output}"
23 | end
24 |
25 | application_js_path = Dir["#{app_path}/public/assets/application*.js"].first
26 |
27 | assert application_js_path, 'application.js should be present'
28 |
29 | contents = File.read(application_js_path)
30 |
31 | assert_match %r{Ember\.VERSION}, contents, 'application.js should contain Ember.VERSION'
32 | assert_match %r{Handlebars\.VERSION|COMPILER_REVISION}, contents, 'applciation.js should contain Handlebars.VERSION'
33 | end
34 |
35 | def app_path
36 | Pathname.new("#{File.dirname(__FILE__)}/dummy")
37 | end
38 |
39 | def test_precompile_succeeds_in_development_environment
40 | precompile! nil
41 | end
42 |
43 | def test_precompile_succeeds_in_production_environment
44 | precompile! 'production'
45 | end
46 |
47 | def test_precompile_succeeds_in_test_environment
48 | precompile! 'test'
49 | end
50 | end
51 |
--------------------------------------------------------------------------------
/lib/generators/ember/component_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ComponentGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js component and component template\nCustom Ember Components require at least two descriptive names separated by a dash. Use CamelCase or dash-case to name your component.\n\nExample,\n\trails generate ember:component PostChart [options]\n\trails generate ember:component post-chart [options]"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
14 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
15 |
16 | def create_component_files
17 | dashed_file_name = file_name.dasherize
18 | comp_path = File.join(ember_path, 'components', class_path, "#{dashed_file_name}.#{engine_extension}")
19 | template "component.#{engine_extension}", comp_path
20 |
21 | templ_path = File.join(ember_path, 'templates/components', class_path, "#{dashed_file_name}.hbs")
22 | template "component.template.hbs", templ_path
23 |
24 | end
25 |
26 | end
27 | end
28 | end
29 |
--------------------------------------------------------------------------------
/lib/generators/ember/controller_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ControllerGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a new Ember.js controller"
11 |
12 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
13 | class_option :array, :type => :boolean, :default => false, :desc => "Create an Ember.ArrayController to represent multiple objects"
14 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
15 | class_option :object, :type => :boolean, :default => false, :desc => "Create an Ember.Controller to represent a single object"
16 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
17 |
18 |
19 | def create_controller_files
20 | file_path = File.join(ember_path, 'controllers', class_path, "#{file_name.dasherize}.#{engine_extension}")
21 |
22 | if options.array?
23 | template "array_controller.#{engine_extension}", file_path
24 | elsif options.object?
25 | template "object_controller.#{engine_extension}", file_path
26 | else
27 | template "controller.#{engine_extension}", file_path
28 | end
29 | end
30 |
31 |
32 | end
33 | end
34 | end
35 |
--------------------------------------------------------------------------------
/test/hjstemplate_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 |
3 | class HomeControllerTest < ActionController::TestCase
4 |
5 | test "page header should include link to asset" do
6 | get :index
7 | assert_response :success
8 | assert_select 'head script[src^="/assets/templates/test"]', true, @response.body
9 | end
10 |
11 | end
12 |
13 | class HjsTemplateTest < IntegrationTest
14 |
15 | test "asset pipeline should serve template" do
16 | get "/assets/templates/test.js"
17 | assert_response :success
18 | assert_match %r{Ember\.TEMPLATES\["test"\] = Ember\.(?:Handlebars|HTMLBars)\.template\(}m, @response.body
19 | end
20 |
21 | test "asset pipeline should serve bundled application.js" do
22 | get "/assets/application.js"
23 | assert_response :success
24 | assert_match %r{Ember\.TEMPLATES\["test"\] = Ember\.(?:Handlebars|HTMLBars)\.template\(}m, @response.body
25 | end
26 |
27 | test "should unbind mustache templates" do
28 | get "/assets/templates/hairy.js"
29 | assert_response :success
30 | assert_match %r{Ember\.TEMPLATES\["hairy(\.mustache)?"\] = Ember\.(?:Handlebars|HTMLBars)\.template\(}m, @response.body
31 | assert_match %r{function .*unbound|"name":"unbound"}m, @response.body
32 | end
33 |
34 | test "ensure new lines inside the anon function are persisted" do
35 | get "/assets/templates/new_lines.js"
36 | assert_response :success
37 | assert @response.body =~ %r(; data = data || {};\n|"data":data), @response.body.inspect
38 | end
39 |
40 | end
41 |
--------------------------------------------------------------------------------
/lib/generators/ember/resource_override.rb:
--------------------------------------------------------------------------------
1 | require "rails/generators"
2 | require "rails/generators/rails/resource/resource_generator"
3 | require "generators/ember/controller_generator"
4 | require "generators/ember/view_generator"
5 |
6 | module Rails
7 | module Generators
8 | ResourceGenerator.class_eval do
9 |
10 | class_option :javascript_engine, :desc => "Engine for JavaScripts"
11 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
12 | class_option :with_template, :type => :boolean, :default => false, :desc => "Create template for this view"
13 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
14 |
15 | def add_ember
16 | say_status :invoke, "ember:model", :white
17 | with_padding do
18 | invoke "ember:model"
19 | end
20 |
21 | say_status :invoke, "ember controller and view (singular)", :white
22 | with_padding do
23 | invoke "ember:view", [singular_name], options.merge(:object => true)
24 | end
25 |
26 | @_invocations[Ember::Generators::ControllerGenerator].delete "create_controller_files"
27 | @_invocations[Ember::Generators::ViewGenerator].delete "create_view_files"
28 |
29 | say_status :invoke, "ember controller and view (plural)", :white
30 | with_padding do
31 | invoke "ember:view", [plural_name], options.merge(:array => true)
32 | end
33 | end
34 | end
35 | end
36 | end
37 |
38 |
39 |
--------------------------------------------------------------------------------
/ember-rails.gemspec:
--------------------------------------------------------------------------------
1 | # -*- encoding: utf-8 -*-
2 | $:.push File.expand_path("../lib", __FILE__)
3 | require "ember/rails/version"
4 |
5 | Gem::Specification.new do |s|
6 | s.name = "ember-rails"
7 | s.version = Ember::Rails::VERSION
8 | s.platform = Gem::Platform::RUBY
9 | s.authors = ["Keith Pitt", "Rob Monie", "Joao Carlos", "Paul Chavard"]
10 | s.email = ["me@keithpitt.com", "paul@chavard.net"]
11 | s.homepage = "https://github.com/emberjs/ember-rails"
12 | s.summary = "Ember for Rails 3.1+"
13 | s.license = "MIT"
14 |
15 | s.add_dependency "railties", [">= 3.1"]
16 | s.add_dependency "active_model_serializers"
17 |
18 | s.add_dependency "jquery-rails", ">= 1.0.17"
19 | s.add_dependency "ember-source", ">= 1.8.0"
20 | s.add_dependency "ember-data-source", '>= 1.13.0'
21 | s.add_dependency "active-model-adapter-source", ">= 1.13.0"
22 | s.add_dependency "ember-handlebars-template", ">= 0.1.1", "< 1.0"
23 | s.add_dependency "ember-es6_template", "~> 0.4.0"
24 | s.add_dependency "ember-cli-assets", "~> 0.0.1"
25 |
26 | s.add_development_dependency "bundler", [">= 1.2.2"]
27 | s.add_development_dependency "tzinfo"
28 | s.add_development_dependency "vcr"
29 | s.add_development_dependency "webmock", "< 1.14.0"
30 |
31 | s.add_development_dependency "sprockets-rails"
32 | s.add_development_dependency "handlebars-source", "> 1.0.0", "< 3"
33 | s.add_development_dependency "test-unit"
34 | s.add_development_dependency "safe_yaml", ">= 1.0.4"
35 |
36 | s.files = %w(README.md LICENSE) + Dir["app/**/*", "lib/**/*", "vendor/**/*"]
37 |
38 | s.require_paths = ["lib"]
39 | end
40 |
--------------------------------------------------------------------------------
/lib/generators/ember/model_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class ModelGenerator < ::Rails::Generators::NamedBase
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 | desc "creates a new ember.js model"
10 | argument :attributes, :type => :array, :default => [], :banner => "field[:type] field[:type] ..."
11 | class_option :javascript_engine, :desc => "engine for javascripts"
12 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "custom ember app path"
13 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
14 |
15 | def create_model_files
16 | file_path = File.join(ember_path, 'models', class_path, "#{file_name.dasherize}.#{engine_extension}")
17 | template "model.#{engine_extension}", file_path
18 | end
19 |
20 | private
21 | EMBER_TYPE_LOOKUP = {
22 | nil => 'string',
23 | :binary => 'string',
24 | :string => 'string',
25 | :text => 'string',
26 | :boolean => 'boolean',
27 | :date => 'date',
28 | :datetime =>'date',
29 | :time => 'date',
30 | :timestamp => 'date',
31 | :decimal => 'number',
32 | :float => 'number',
33 | :integer => 'number',
34 | :primary_key => 'number'
35 | }
36 |
37 | def parse_attributes!
38 | self.attributes = (attributes || []).map do |attr|
39 | name, type = attr.split(':')
40 | key = type.try(:to_sym)
41 | ember_type = EMBER_TYPE_LOOKUP[key] || type
42 |
43 | { :name => name, :type => ember_type }
44 | end
45 | end
46 | end
47 | end
48 | end
49 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: false
2 | rvm:
3 | - 2.1
4 | - 2.2.4
5 | - 2.3.0
6 | - jruby-9.0.5.0
7 | cache:
8 | - bundler
9 | before_script:
10 | - gem install bundler # To use bundler 1.10 or later
11 | gemfile:
12 | - gemfiles/rails32_ember_113.gemfile
13 | - gemfiles/rails40_ember_113.gemfile
14 | - gemfiles/rails41_ember_113.gemfile
15 | - gemfiles/rails42_ember_113.gemfile
16 | - gemfiles/rails50_ember_113.gemfile
17 | - gemfiles/rails32_ember_18.gemfile
18 | - gemfiles/rails40_ember_18.gemfile
19 | - gemfiles/rails41_ember_18.gemfile
20 | - gemfiles/rails42_ember_18.gemfile
21 | - gemfiles/rails50_ember_18.gemfile
22 | - gemfiles/rails32_ember_latest.gemfile
23 | - gemfiles/rails40_ember_latest.gemfile
24 | - gemfiles/rails41_ember_latest.gemfile
25 | - gemfiles/rails42_ember_latest.gemfile
26 | - gemfiles/rails50_ember_latest.gemfile
27 | - gemfiles/sprockets_3.gemfile
28 | - gemfiles/sprockets_rails_3.gemfile
29 | matrix:
30 | exclude:
31 | - rvm: 2.1
32 | gemfile: gemfiles/rails50_ember_113.gemfile
33 | - rvm: 2.1
34 | gemfile: gemfiles/rails50_ember_18.gemfile
35 | - rvm: 2.1
36 | gemfile: gemfiles/rails50_ember_latest.gemfile
37 | - rvm: jruby-9.0.5.0
38 | gemfile: gemfiles/rails40_ember_113.gemfile
39 | - rvm: jruby-9.0.5.0
40 | gemfile: gemfiles/rails50_ember_113.gemfile
41 | - rvm: jruby-9.0.5.0
42 | gemfile: gemfiles/rails40_ember_18.gemfile
43 | - rvm: jruby-9.0.5.0
44 | gemfile: gemfiles/rails50_ember_18.gemfile
45 | - rvm: jruby-9.0.5.0
46 | gemfile: gemfiles/rails40_ember_latest.gemfile
47 | - rvm: jruby-9.0.5.0
48 | gemfile: gemfiles/rails50_ember_latest.gemfile
49 | env:
50 | - JRUBY_OPTS="--server -J-Xms1500m -J-Xmx1500m -J-XX:+UseConcMarkSweepGC -J-XX:-UseGCOverheadLimit -J-XX:+CMSClassUnloadingEnabled" # see: https://github.com/jruby/jruby/issues/1320
51 |
--------------------------------------------------------------------------------
/test/dummy/config/application.rb:
--------------------------------------------------------------------------------
1 | require File.expand_path('../boot', __FILE__)
2 |
3 | require "action_controller/railtie"
4 | require "rails/test_unit/railtie"
5 | require 'sprockets/railtie'
6 |
7 | Bundler.require
8 | require "jquery-rails"
9 | require "ember-rails"
10 | require "handlebars/source" # Enable optional features related handlebars.
11 |
12 | module Dummy
13 | class Application < Rails::Application
14 | # Settings in config/environments/* take precedence over those specified here.
15 | # Application configuration should go into files in config/initializers
16 | # -- all .rb files in that directory are automatically loaded.
17 |
18 | # Custom directories with classes and modules you want to be autoloadable.
19 | # config.autoload_paths += %W(#{config.root}/extras)
20 |
21 | # Only load the plugins named here, in the order given (default is alphabetical).
22 | # :all can be used as a placeholder for all plugins not explicitly named.
23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
24 |
25 | # Activate observers that should always be running.
26 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
27 |
28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
30 | # config.time_zone = 'Central Time (US & Canada)'
31 |
32 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
33 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
34 | # config.i18n.default_locale = :de
35 |
36 | # Configure the default encoding used in templates for Ruby 1.9.
37 | config.encoding = "utf-8"
38 |
39 | # Configure sensitive parameters which will be filtered from the log file.
40 | config.filter_parameters += [:password]
41 |
42 | # Enable the asset pipeline
43 | config.assets.enabled = true
44 | end
45 | end
46 |
47 |
--------------------------------------------------------------------------------
/test/dummy/config/routes.rb:
--------------------------------------------------------------------------------
1 | Dummy::Application.routes.draw do
2 | get "home/index"
3 |
4 | # The priority is based upon order of creation:
5 | # first created -> highest priority.
6 |
7 | # Sample of regular route:
8 | # match 'products/:id' => 'catalog#view'
9 | # Keep in mind you can assign values other than :controller and :action
10 |
11 | # Sample of named route:
12 | # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
13 | # This route can be invoked with purchase_url(:id => product.id)
14 |
15 | # Sample resource route (maps HTTP verbs to controller actions automatically):
16 | # resources :products
17 |
18 | # Sample resource route with options:
19 | # resources :products do
20 | # member do
21 | # get 'short'
22 | # post 'toggle'
23 | # end
24 | #
25 | # collection do
26 | # get 'sold'
27 | # end
28 | # end
29 |
30 | # Sample resource route with sub-resources:
31 | # resources :products do
32 | # resources :comments, :sales
33 | # resource :seller
34 | # end
35 |
36 | # Sample resource route with more complex sub-resources
37 | # resources :products do
38 | # resources :comments
39 | # resources :sales do
40 | # get 'recent', :on => :collection
41 | # end
42 | # end
43 |
44 | # Sample resource route within a namespace:
45 | # namespace :admin do
46 | # # Directs /admin/products/* to Admin::ProductsController
47 | # # (app/controllers/admin/products_controller.rb)
48 | # resources :products
49 | # end
50 |
51 | # You can have the root of your site routed with "root"
52 | # just remember to delete public/index.html.
53 | # root :to => 'welcome#index'
54 |
55 | # See how all your routes lay out with "rake routes"
56 |
57 | # This is a legacy wild controller route that's not recommended for RESTful applications.
58 | # Note: This route will make all actions in every controller accessible via GET requests.
59 | # match ':controller(/:action(/:id(.:format)))'
60 | end
61 |
--------------------------------------------------------------------------------
/test/dummy/config/environments/test.rb:
--------------------------------------------------------------------------------
1 | Dummy::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # The test environment is used exclusively to run your application's
5 | # test suite. You never need to work with it otherwise. Remember that
6 | # your test database is "scratch space" for the test suite and is wiped
7 | # and recreated between test runs. Don't rely on the data there!
8 | config.cache_classes = true
9 |
10 | config.eager_load = false
11 |
12 | # Configure static asset server for tests with Cache-Control for performance
13 | if Rails.version >= '4.2.0'
14 | config.serve_static_files = true
15 | else
16 | config.serve_static_assets = true
17 | end
18 | config.static_cache_control = "public, max-age=3600"
19 |
20 | # Log error messages when you accidentally call methods on nil
21 | config.whiny_nils = true unless Rails.version >= '4.0.0'
22 |
23 | # Show full error reports and disable caching
24 | config.consider_all_requests_local = true
25 | config.action_controller.perform_caching = false
26 |
27 | # Raise exceptions instead of rendering exception templates
28 | config.action_dispatch.show_exceptions = false
29 |
30 | # Disable request forgery protection in test environment
31 | config.action_controller.allow_forgery_protection = false
32 |
33 | # Tell Action Mailer not to deliver emails to the real world.
34 | # The :test delivery method accumulates sent emails in the
35 | # ActionMailer::Base.deliveries array.
36 | # config.action_mailer.delivery_method = :test
37 |
38 | # Use SQL instead of Active Record's schema dumper when creating the test database.
39 | # This is necessary if your schema can't be completely dumped by the schema dumper,
40 | # like if you have constraints or database-specific column types
41 | # config.active_record.schema_format = :sql
42 |
43 | # Print deprecation notices to the stderr
44 | config.active_support.deprecation = :stderr
45 |
46 | config.active_support.test_order = :sorted
47 | end
48 |
--------------------------------------------------------------------------------
/lib/generators/ember/generator_helpers.rb:
--------------------------------------------------------------------------------
1 | module Ember
2 | module Generators
3 | module GeneratorHelpers
4 |
5 | def ember_path
6 | if options[:ember_path]
7 | options[:ember_path]
8 | elsif rails_engine?
9 | "app/assets/javascripts/#{engine_name}"
10 | elsif configuration.ember_path
11 | configuration.ember_path
12 | else
13 | "app/assets/javascripts"
14 | end
15 | end
16 |
17 | def rails_engine?
18 | defined?(ENGINE_PATH)
19 | end
20 |
21 | def engine_name
22 | ENGINE_PATH.split('/')[-2]
23 | end
24 |
25 | def application_name
26 | if options[:app_name]
27 | options[:app_name]
28 | elsif rails_engine?
29 | engine_name
30 | elsif configuration.app_name
31 | configuration.app_name
32 | elsif defined?(::Rails) && ::Rails.application
33 | ::Rails.application.class.name.split('::').first
34 | else
35 | "App"
36 | end
37 | end
38 |
39 | def class_name
40 | (class_path + [file_name]).map!{ |m| m.camelize }.join()
41 | end
42 |
43 | def handlebars_template_path
44 | File.join(class_path, file_name).gsub(/^\//, '')
45 | end
46 |
47 | def engine_extension
48 | @engine_extension ||= begin
49 | extension_table = {
50 | 'js' => 'js',
51 | 'coffee' => 'coffee',
52 | 'em' => 'em',
53 | 'es6' => 'module.es6'
54 | }
55 |
56 | extension = extension_table[javascript_engine]
57 |
58 | raise "Unsupported javascript engine: `#{javascript_engine}` (Supported engines are: [#{extension_table.keys.join(', ')}])" if extension.nil?
59 |
60 | extension
61 | end
62 | end
63 |
64 | def javascript_engine
65 | options[:javascript_engine].to_s
66 | end
67 |
68 | def configuration
69 | if defined?(::Rails) && ::Rails.configuration
70 | ::Rails.configuration.ember
71 | end
72 | end
73 | end
74 | end
75 | end
76 |
--------------------------------------------------------------------------------
/test/generators/route_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/route_generator'
3 |
4 | class RouteGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::RouteGenerator
6 | destination File.join(Rails.root, "tmp", "generator_test_output")
7 |
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | test "Assert files are properly created" do
26 | run_generator %w(ember)
27 |
28 | assert_file "#{ember_path}/routes/ember.js"
29 | end
30 |
31 | test "Assert files are properly created with custom path" do
32 | custom_path = ember_path("custom")
33 | run_generator [ "ember", "-d", custom_path ]
34 |
35 | assert_file "#{custom_path}/routes/ember.js"
36 | end
37 |
38 | test "Assert files are properly created with custom app name" do
39 | run_generator [ "ember", "-n", "MyApp" ]
40 | assert_file "app/assets/javascripts/routes/ember.js", /MyApp\.EmberRoute/
41 | end
42 |
43 | test "Uses config.ember.app_name as the app name" do
44 | begin
45 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
46 |
47 | run_generator %w(ember)
48 | assert_file "app/assets/javascripts/routes/ember.js", /MyApp\.EmberRoute/
49 | ensure
50 | ::Rails.configuration.ember.app_name = old
51 | end
52 | end
53 |
54 | test "Uses config.ember.ember_path" do
55 | begin
56 | custom_path = ember_path("custom")
57 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
58 |
59 | run_generator [ "ember"]
60 | assert_file "#{custom_path}/routes/ember.js"
61 | ensure
62 | ::Rails.configuration.ember.ember_path = old
63 | end
64 | end
65 | private
66 |
67 | def ember_path(custom_path = nil)
68 | "app/assets/javascripts/#{custom_path}"
69 | end
70 |
71 | end
72 |
--------------------------------------------------------------------------------
/test/generators/adapter_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/adapter_generator'
3 |
4 | class AdapterGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::AdapterGenerator
6 | destination File.join(Rails.root, "tmp", "generator_test_output")
7 |
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | test "Assert files are properly created" do
26 | run_generator %w(ember)
27 |
28 | assert_file "#{ember_path}/adapters/ember.js"
29 | end
30 |
31 | test "Assert files are properly created with custom path" do
32 | custom_path = ember_path("custom")
33 | run_generator [ "ember", "-d", custom_path ]
34 |
35 | assert_file "#{custom_path}/adapters/ember.js"
36 | end
37 |
38 | test "Assert files are properly created with custom app name" do
39 | run_generator [ "ember", "-n", "MyApp" ]
40 | assert_file "app/assets/javascripts/adapters/ember.js", /MyApp\.EmberAdapter/
41 | end
42 |
43 | test "Uses config.ember.app_name as the app name" do
44 | begin
45 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
46 |
47 | run_generator %w(ember)
48 | assert_file "app/assets/javascripts/adapters/ember.js", /MyApp\.EmberAdapter/
49 | ensure
50 | ::Rails.configuration.ember.app_name = old
51 | end
52 | end
53 |
54 | test "Uses config.ember.ember_path" do
55 | begin
56 | custom_path = ember_path("custom")
57 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
58 |
59 | run_generator [ "ember"]
60 | assert_file "#{custom_path}/adapters/ember.js"
61 | ensure
62 | ::Rails.configuration.ember.ember_path = old
63 | end
64 | end
65 | private
66 |
67 | def ember_path(custom_path = nil)
68 | "app/assets/javascripts/#{custom_path}"
69 | end
70 |
71 | end
72 |
--------------------------------------------------------------------------------
/test/dummy/config/environments/production.rb:
--------------------------------------------------------------------------------
1 | Dummy::Application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb
3 |
4 | # Code is not reloaded between requests
5 | config.cache_classes = true
6 |
7 | # Full error reports are disabled and caching is turned on
8 | config.consider_all_requests_local = false
9 | config.action_controller.perform_caching = true
10 |
11 | # Disable Rails's static asset server (Apache or nginx will already do this)
12 | config.serve_static_assets = false
13 |
14 | config.eager_load = true
15 |
16 | # Compress JavaScripts and CSS
17 | #config.assets.compress = true
18 |
19 | # Specify the default JavaScript compressor
20 | #config.assets.js_compressor = :uglifier
21 |
22 | # Specifies the header that your server uses for sending files
23 | # (comment out if your front-end server doesn't support this)
24 | config.action_dispatch.x_sendfile_header = "X-Sendfile" # Use 'X-Accel-Redirect' for nginx
25 |
26 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
27 | # config.force_ssl = true
28 |
29 | # See everything in the log (default is :info)
30 | # config.log_level = :debug
31 |
32 | # Use a different logger for distributed setups
33 | # config.logger = SyslogLogger.new
34 |
35 | # Use a different cache store in production
36 | # config.cache_store = :mem_cache_store
37 |
38 | # Enable serving of images, stylesheets, and JavaScripts from an asset server
39 | # config.action_controller.asset_host = "http://assets.example.com"
40 |
41 | # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
42 | # config.assets.precompile += %w( search.js )
43 |
44 | # Disable delivery errors, bad email addresses will be ignored
45 | # config.action_mailer.raise_delivery_errors = false
46 |
47 | # Enable threaded mode
48 | # config.threadsafe!
49 |
50 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
51 | # the I18n.default_locale when a translation can not be found)
52 | config.i18n.fallbacks = true
53 |
54 | # Send deprecation notices to registered listeners
55 | config.active_support.deprecation = :notify
56 | end
57 |
--------------------------------------------------------------------------------
/test/generators/service_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/service_generator'
3 |
4 | class ServiceGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ServiceGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | %w(js coffee em es6).each do |engine|
26 |
27 | test "create service with #{engine} engine" do
28 | run_generator ["session","--javascript-engine=#{engine}"]
29 | assert_file "app/assets/javascripts/services/session.#{engine_to_extension(engine)}"
30 | end
31 |
32 | test "create namespaced service with #{engine} engine" do
33 | run_generator ["user/session","--javascript-engine=#{engine}"]
34 | assert_file "#{ember_path}/services/user/session.#{engine_to_extension(engine)}", /UserSessionService|export default Ember\.Service\.extend/
35 | end
36 | end
37 |
38 | test "Assert files are properly created" do
39 | run_generator %w(session)
40 | assert_file "#{ember_path}/services/session.js"
41 | end
42 |
43 | test "Assert files are properly created with custom path" do
44 | custom_path = ember_path("custom")
45 | run_generator [ "session", "-d", custom_path ]
46 | assert_file "#{custom_path}/services/session.js"
47 | end
48 |
49 | test "Assert files are properly created with custom app name" do
50 | run_generator [ "session", "-n", "MyApp" ]
51 | assert_file "#{ember_path}/services/session.js", /MyApp\.SessionService/
52 | end
53 |
54 | test "Uses config.ember.app_name as the app name" do
55 | begin
56 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
57 |
58 | run_generator %w(session)
59 | assert_file "#{ember_path}/services/session.js", /MyApp\.SessionService/
60 | ensure
61 | ::Rails.configuration.ember.app_name = old
62 | end
63 | end
64 |
65 | private
66 |
67 | def ember_path(custom_path = nil)
68 | "app/assets/javascripts/#{custom_path}".chomp('/')
69 | end
70 |
71 | def engine_to_extension(engine)
72 | engine = "module.#{engine}" if engine == 'es6'
73 | engine
74 | end
75 |
76 | end
77 |
--------------------------------------------------------------------------------
/test/generators/initializer_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/initializer_generator'
3 |
4 | class InitializerGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::InitializerGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | %w(js coffee em es6).each do |engine|
26 |
27 | test "create initializer with #{engine} engine" do
28 | run_generator ["inject-session","--javascript-engine=#{engine}"]
29 | assert_file "app/assets/javascripts/initializers/inject-session.#{engine_to_extension(engine)}"
30 | end
31 |
32 | test "create namespaced initializer with #{engine} engine" do
33 | run_generator ["user/inject-session","--javascript-engine=#{engine}"]
34 | assert_file "#{ember_path}/initializers/user/inject-session.#{engine_to_extension(engine)}", /\.initializer|export default {/
35 | end
36 | end
37 |
38 | test "Assert files are properly created" do
39 | run_generator %w(inject-session)
40 | assert_file "#{ember_path}/initializers/inject-session.js"
41 | end
42 |
43 | test "Assert files are properly created with custom path" do
44 | custom_path = ember_path("custom")
45 | run_generator [ "inject-session", "-d", custom_path ]
46 | assert_file "#{custom_path}/initializers/inject-session.js"
47 | end
48 |
49 | test "Assert files are properly created with custom app name" do
50 | run_generator [ "inject-session", "-n", "MyApp" ]
51 | assert_file "#{ember_path}/initializers/inject-session.js", /MyApp\.initializer/
52 | end
53 |
54 | test "Uses config.ember.app_name as the app name" do
55 | begin
56 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
57 |
58 | run_generator %w(inject-session)
59 | assert_file "#{ember_path}/initializers/inject-session.js", /MyApp\.initializer/
60 | ensure
61 | ::Rails.configuration.ember.app_name = old
62 | end
63 | end
64 |
65 | private
66 |
67 | def ember_path(custom_path = nil)
68 | "app/assets/javascripts/#{custom_path}".chomp('/')
69 | end
70 |
71 | def engine_to_extension(engine)
72 | engine = "module.#{engine}" if engine == 'es6'
73 | engine
74 | end
75 |
76 | end
77 |
--------------------------------------------------------------------------------
/test/generators/instance_initializer_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/instance_initializer_generator'
3 |
4 | class InstanceInitializerGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::InstanceInitializerGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | %w(js coffee em es6).each do |engine|
26 |
27 | test "create instance initializer with #{engine} engine" do
28 | run_generator ["inject-session","--javascript-engine=#{engine}"]
29 | assert_file "app/assets/javascripts/instance-initializers/inject-session.#{engine_to_extension(engine)}"
30 | end
31 |
32 | test "create namespaced initializer with #{engine} engine" do
33 | run_generator ["user/inject-session","--javascript-engine=#{engine}"]
34 | assert_file "#{ember_path}/instance-initializers/user/inject-session.#{engine_to_extension(engine)}", /\.instanceInitializer|export default {/
35 | end
36 | end
37 |
38 | test "Assert files are properly created" do
39 | run_generator %w(inject-session)
40 | assert_file "#{ember_path}/instance-initializers/inject-session.js"
41 | end
42 |
43 | test "Assert files are properly created with custom path" do
44 | custom_path = ember_path("custom")
45 | run_generator [ "inject-session", "-d", custom_path ]
46 | assert_file "#{custom_path}/instance-initializers/inject-session.js"
47 | end
48 |
49 | test "Assert files are properly created with custom app name" do
50 | run_generator [ "inject-session", "-n", "MyApp" ]
51 | assert_file "#{ember_path}/instance-initializers/inject-session.js", /MyApp\.instanceInitializer/
52 | end
53 |
54 | test "Uses config.ember.app_name as the app name" do
55 | begin
56 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
57 |
58 | run_generator %w(inject-session)
59 | assert_file "#{ember_path}/instance-initializers/inject-session.js", /MyApp\.instanceInitializer/
60 | ensure
61 | ::Rails.configuration.ember.app_name = old
62 | end
63 | end
64 |
65 | private
66 |
67 | def ember_path(custom_path = nil)
68 | "app/assets/javascripts/#{custom_path}".chomp('/')
69 | end
70 |
71 | def engine_to_extension(engine)
72 | engine = "module.#{engine}" if engine == 'es6'
73 | engine
74 | end
75 |
76 | end
77 |
--------------------------------------------------------------------------------
/test/generators/controller_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/controller_generator'
3 |
4 | class ControllerGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ControllerGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 |
15 | FileUtils.mkdir_p dest
16 | FileUtils.cp_r source, dest
17 | end
18 |
19 | def prepare_destination
20 | super
21 |
22 | copy_directory "app/assets/javascripts"
23 | copy_directory "config"
24 | end
25 |
26 | %w(js coffee em es6).each do |engine|
27 |
28 | test "array_controller with #{engine} engine" do
29 | run_generator ["posts", "--array", "--javascript-engine=#{engine}"]
30 | assert_file "app/assets/javascripts/controllers/posts.#{engine_to_extension(engine)}"
31 | end
32 |
33 | test "object_controller with #{engine} engine" do
34 | run_generator ["post", "--object", "--javascript-engine=#{engine}"]
35 | assert_file "app/assets/javascripts/controllers/post.#{engine_to_extension(engine)}"
36 | end
37 |
38 | test "default_controller with #{engine} engine" do
39 | run_generator ["post","--javascript-engine=#{engine}"]
40 | assert_file "app/assets/javascripts/controllers/post.#{engine_to_extension(engine)}"
41 | end
42 |
43 | test "default_controller namespaced with #{engine} engine" do
44 | run_generator ["post/index","--javascript-engine=#{engine}"]
45 | assert_file "#{ember_path}/controllers/post/index.#{engine_to_extension(engine)}", /PostIndexController|export default Ember\.Controller\.extend/
46 | end
47 | end
48 |
49 | test "Assert files are properly created" do
50 | run_generator %w(ember)
51 | assert_file "#{ember_path}/controllers/ember.js"
52 | end
53 |
54 | test "Assert files are properly created with custom path" do
55 | custom_path = ember_path("custom")
56 | run_generator [ "ember", "-d", custom_path ]
57 | assert_file "#{custom_path}/controllers/ember.js"
58 | end
59 |
60 | test "Assert files are properly created with custom app name" do
61 | run_generator [ "ember", "-n", "MyApp" ]
62 | assert_file "#{ember_path}/controllers/ember.js", /MyApp\.EmberController/
63 | end
64 |
65 | test "Uses config.ember.app_name as the app name" do
66 | begin
67 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
68 |
69 | run_generator %w(ember)
70 | assert_file "#{ember_path}/controllers/ember.js", /MyApp\.EmberController/
71 | ensure
72 | ::Rails.configuration.ember.app_name = old
73 | end
74 | end
75 |
76 | private
77 |
78 | def ember_path(custom_path = nil)
79 | "app/assets/javascripts/#{custom_path}".chomp('/')
80 | end
81 |
82 | def engine_to_extension(engine)
83 | engine = "module.#{engine}" if engine == 'es6'
84 | engine
85 | end
86 |
87 | end
88 |
--------------------------------------------------------------------------------
/test/generators/view_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/view_generator'
3 |
4 | class ViewGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ViewGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 |
26 | %w(js coffee em es6).each do |engine|
27 |
28 | test "create view with #{engine} engine" do
29 | run_generator ["post", "--javascript-engine=#{engine}"]
30 | assert_file "app/assets/javascripts/views/post.#{engine_to_extension(engine)}", /templateName: 'post'/
31 | assert_no_file "app/assets/javascripts/templates/post.hbs"
32 | end
33 |
34 | test "create view and template with #{engine} engine" do
35 | run_generator ["post", "--javascript-engine=#{engine}", "--with-template"]
36 | assert_file "app/assets/javascripts/views/post.#{engine_to_extension(engine)}"
37 | assert_file "app/assets/javascripts/templates/post.hbs"
38 | end
39 |
40 | test "create namespaced view with #{engine} engine" do
41 | run_generator ["post/index", "--javascript-engine=#{engine}"]
42 | assert_file "app/assets/javascripts/views/post/index.#{engine_to_extension(engine)}", /PostIndexView|export default Ember\.View\.extend/
43 | end
44 |
45 | end
46 |
47 | test "Assert files are properly created" do
48 | run_generator %w(ember)
49 | assert_file "#{ember_path}/views/ember.js"
50 | end
51 |
52 | test "Assert files are properly created with custom path" do
53 | custom_path = ember_path("custom")
54 | run_generator [ "ember", "-d", custom_path ]
55 | assert_file "#{custom_path}/views/ember.js"
56 | end
57 |
58 | test "Assert files are properly created with custom app name" do
59 | run_generator [ "ember", "-n", "AppName" ]
60 | assert_file "app/assets/javascripts/views/ember.js", /AppName\.EmberView/
61 | end
62 |
63 | test "Uses config.ember.app_name as the app name" do
64 | begin
65 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
66 |
67 | run_generator %w(ember)
68 | assert_file "app/assets/javascripts/views/ember.js", /MyApp\.EmberView/
69 | ensure
70 | ::Rails.configuration.ember.app_name = old
71 | end
72 | end
73 |
74 | test "Uses config.ember.ember_path" do
75 | begin
76 | custom_path = ember_path("custom")
77 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
78 |
79 | run_generator [ "ember"]
80 | assert_file "#{custom_path}/views/ember.js"
81 | ensure
82 | ::Rails.configuration.ember.ember_path = old
83 | end
84 | end
85 |
86 | private
87 |
88 | def ember_path(custom_path = nil)
89 | "app/assets/javascripts/#{custom_path}".chomp('/')
90 | end
91 |
92 | def engine_to_extension(engine)
93 | engine = "module.#{engine}" if engine == 'es6'
94 | engine
95 | end
96 |
97 | end
98 |
--------------------------------------------------------------------------------
/test/generators/bootstrap_generator_engine_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/bootstrap_generator'
3 |
4 | class BootstrapGeneratorEngineTest < Rails::Generators::TestCase
5 | tests Ember::Generators::BootstrapGenerator
6 | destination Rails.root.join('tmp', 'generator_engine_test_output')
7 |
8 | setup :prepare_destination
9 | teardown :cleanup
10 |
11 | def copy_directory(dir)
12 | source = File.join(ENGINE_ROOT, dir)
13 | dest = File.join(ENGINE_ROOT, "tmp", "generator_engine_test_output", File.dirname(dir))
14 |
15 | FileUtils.mkdir_p dest
16 | FileUtils.cp_r source, dest
17 | end
18 |
19 | def prepare_destination
20 | super
21 |
22 | load File.expand_path('../../dummy/config/engine.rb', __FILE__)
23 | copy_directory "app/assets/javascripts"
24 | copy_directory "config"
25 | end
26 |
27 | def cleanup
28 | Object.send(:remove_const, :ENGINE_ROOT)
29 | Object.send(:remove_const, :ENGINE_PATH)
30 | end
31 |
32 | test "Assert folder layout and .gitkeep files are properly created in a rails engine" do
33 | run_generator
34 | assert_new_dirs(:skip_git => false)
35 | end
36 |
37 | test "Assert folder layout is properly created without .gitkeep files in a rails engine" do
38 | run_generator %w(-g)
39 | assert_new_dirs(:skip_git => true)
40 | end
41 |
42 | %w(js coffee em es6).each do |engine|
43 |
44 | test "create bootstrap in a rails engine with #{engine}" do
45 | run_generator ["--javascript-engine=#{engine}"]
46 | assert_file "#{ember_path}/router.#{engine_to_extension(engine)}"
47 | assert_file "#{ember_path}/adapters/application.#{engine_to_extension(engine)}"
48 | assert_file "#{ember_path}/#{engine_name}.#{engine_to_extension(engine)}"
49 | end
50 |
51 | test "create bootstrap in a rails engine with #{engine} engine and custom path" do
52 | custom_path = ember_path("custom")
53 | run_generator ["--javascript-engine=#{engine}", "-d", custom_path]
54 | assert_file "#{custom_path}/router.#{engine_to_extension(engine)}"
55 | assert_file "#{custom_path}/adapters/application.#{engine_to_extension(engine)}"
56 | assert_file "#{custom_path}/#{engine_name}.#{engine_to_extension(engine)}"
57 | end
58 |
59 | test "create bootstrap in a rails engine with #{engine} and custom app name" do
60 | run_generator ["--javascript-engine=#{engine}", "-n", "MyEngine"]
61 | assert_file "#{ember_path}/router.#{engine_to_extension(engine)}", /MyEngine\.Router\.map|Ember\.Router\.extend/
62 | assert_file "#{ember_path}/adapters/application.#{engine_to_extension(engine)}", /MyEngine\.ApplicationAdapter|DS\.ActiveModelAdapter\.extend/
63 | assert_file "#{ember_path}/my-engine.#{engine_to_extension(engine)}"
64 | end
65 | end
66 |
67 | private
68 |
69 | def ember_path(custom_path = nil)
70 | "app/assets/javascripts/#{custom_path || engine_name}"
71 | end
72 |
73 | def assert_new_dirs(options = {})
74 | path = options[:in_path] || ember_path
75 |
76 | %W{models controllers views helpers components templates templates/components routes mixins adapters}.each do |dir|
77 | assert_directory "#{path}/#{dir}"
78 | assert_file "#{path}/#{dir}/.gitkeep" unless options[:skip_git]
79 | end
80 | end
81 |
82 | def engine_name
83 | "dummy"
84 | end
85 |
86 | def engine_to_extension(engine)
87 | engine = "module.#{engine}" if engine == 'es6'
88 | engine
89 | end
90 |
91 | end
92 |
--------------------------------------------------------------------------------
/test/generators/resource_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/resource_generator'
3 |
4 | class ResourceGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ResourceGenerator
6 | destination File.join(Rails.root, "tmp", "generator_test_output")
7 | setup :prepare_destination
8 |
9 | %w(js coffee em es6).each do |engine|
10 |
11 | test "create view with #{engine} engine" do
12 | run_generator ["post", "--javascript-engine=#{engine}"]
13 | assert_file "app/assets/javascripts/views/post.#{engine_to_extension(engine)}", /templateName: 'post'/
14 | end
15 |
16 | test "create template with #{engine} engine" do
17 | run_generator ["post", "--javascript-engine=#{engine}"]
18 | assert_file "app/assets/javascripts/templates/post.hbs"
19 | end
20 |
21 | test "create controller with #{engine} engine" do
22 | run_generator ["post", "--javascript-engine=#{engine}"]
23 | assert_file "app/assets/javascripts/controllers/post.#{engine_to_extension(engine)}"
24 | end
25 |
26 | test "create route with #{engine} engine" do
27 | run_generator ["post", "--javascript-engine=#{engine}"]
28 | assert_file "app/assets/javascripts/routes/post.#{engine_to_extension(engine)}"
29 | end
30 |
31 | test "skip route with #{engine} engine" do
32 | run_generator ["post", "--javascript-engine=#{engine}", "--skip-route"]
33 | assert_no_file "app/assets/javascripts/routes/post.#{engine_to_extension(engine)}"
34 | end
35 |
36 | test "create all with #{engine} engine and custom name" do
37 | run_generator ["post", "--javascript-engine=#{engine}", "-n", "MyApp"]
38 | assert_file "app/assets/javascripts/views/post.#{engine_to_extension(engine)}", /MyApp.PostView|export default Ember\.View\.extend/
39 | assert_file "app/assets/javascripts/controllers/post.#{engine_to_extension(engine)}", /MyApp\.PostController|export default Ember\.Controller\.extend/
40 | assert_file "app/assets/javascripts/routes/post.#{engine_to_extension(engine)}", /MyApp\.PostRoute|export default Ember\.Route\.extend/
41 | end
42 | end
43 |
44 | test "Uses config.ember.app_name as the app name" do
45 | begin
46 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
47 |
48 | run_generator %w(post)
49 | assert_file "app/assets/javascripts/views/post.js", /MyApp.PostView/
50 | assert_file "app/assets/javascripts/controllers/post.js", /MyApp\.PostController/
51 | assert_file "app/assets/javascripts/routes/post.js", /MyApp\.PostRoute/
52 | ensure
53 | ::Rails.configuration.ember.app_name = old
54 | end
55 | end
56 |
57 | test "Uses config.ember.ember_path" do
58 | begin
59 | custom_path = ember_path("custom")
60 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
61 |
62 | run_generator ["post"]
63 | assert_file "#{custom_path}/views/post.js"
64 | assert_file "#{custom_path}/controllers/post.js"
65 | assert_file "#{custom_path}/routes/post.js"
66 | ensure
67 | ::Rails.configuration.ember.ember_path = old
68 | end
69 | end
70 |
71 | private
72 |
73 | def ember_path(custom_path = nil)
74 | "app/assets/javascripts/#{custom_path}".chomp('/')
75 | end
76 |
77 | def engine_to_extension(engine)
78 | engine = "module.#{engine}" if engine == 'es6'
79 | engine
80 | end
81 |
82 | end
83 |
84 |
--------------------------------------------------------------------------------
/lib/generators/ember/bootstrap_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 |
3 | module Ember
4 | module Generators
5 | class BootstrapGenerator < ::Rails::Generators::Base
6 | include Ember::Generators::GeneratorHelpers
7 |
8 | source_root File.expand_path("../../templates", __FILE__)
9 |
10 | desc "Creates a default Ember.js folder layout in app/assets/javascripts"
11 |
12 | class_option :ember_path, :type => :string, :aliases => "-d", :default => false, :desc => "Custom ember app path"
13 | class_option :skip_git, :type => :boolean, :aliases => "-g", :default => false, :desc => "Skip Git keeps"
14 | class_option :javascript_engine, :desc => "Engine for JavaScripts (js for JavaScript, coffee for CoffeeScript, etc)"
15 | class_option :app_name, :type => :string, :aliases => "-n", :default => false, :desc => "Custom ember app name"
16 |
17 | def inject_ember
18 | begin
19 | if javascript_engine == 'es6'
20 | inject_into_application_file('es6') # Don't use `.module.es6`.
21 | else
22 | inject_into_application_file(engine_extension)
23 | end
24 | rescue Exception
25 | inject_into_application_file('js')
26 | end
27 | end
28 |
29 | def create_dir_layout
30 | ember_prefix_dirs.each do |dir|
31 | empty_directory "#{ember_path}/#{dir}"
32 | create_file "#{ember_path}/#{dir}/.gitkeep" unless options[:skip_git]
33 | end
34 | end
35 |
36 | def create_app_file
37 | template "app.#{engine_extension}", "#{ember_path}/#{application_name.underscore.dasherize}.#{engine_extension}"
38 | end
39 |
40 | def create_router_file
41 | template "router.#{engine_extension}", "#{ember_path}/router.#{engine_extension}"
42 | end
43 |
44 | def create_adapter_file
45 | template "application_adapter.#{engine_extension}", "#{ember_path}/adapters/application.#{engine_extension}"
46 | end
47 |
48 | def create_env_file
49 | template "environment.#{engine_extension}", "#{ember_path}/environment.#{engine_extension}"
50 | end
51 |
52 | private
53 |
54 | def inject_into_application_file(safe_extension)
55 | application_file = "application.#{safe_extension}"
56 | full_path = Pathname.new(destination_root).join(ember_path, application_file)
57 |
58 | if full_path.exist?
59 | injection_options = get_options_from_contents(full_path.read)
60 |
61 | inject_into_file(full_path.to_s, injection_options) do
62 | context = instance_eval('binding')
63 | source = File.expand_path(find_in_source_paths(application_file))
64 | ERB.new(::File.binread(source), nil, '-', '@output_buffer').result(context)
65 | end
66 | else
67 | template application_file, full_path
68 | end
69 | end
70 |
71 | def get_options_from_contents(contents)
72 | regex = /^.*require_tree.*$/
73 | return {:before => regex} if contents =~ regex
74 |
75 | regex = /^\s*$/
76 | return {:before => regex} if contents =~ regex
77 |
78 | regex = /\z/
79 | {:after => regex}
80 | end
81 |
82 | def ember_prefix_dirs
83 | dirs =
84 | if configuration
85 | Array(configuration.prefix_dirs)
86 | else
87 | %w(models controllers views routes components helpers mixins serializers adapters transforms)
88 | end
89 |
90 | dirs + %w(templates templates/components)
91 | end
92 | end
93 | end
94 | end
95 |
--------------------------------------------------------------------------------
/test/generators/model_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/model_generator'
3 |
4 | class ModelGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ModelGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 |
9 | setup :prepare_destination
10 |
11 | def copy_directory(dir)
12 | source = Rails.root.join(dir)
13 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
14 |
15 | FileUtils.mkdir_p dest
16 | FileUtils.cp_r source, dest
17 | end
18 |
19 | def prepare_destination
20 | super
21 |
22 | copy_directory "app/assets/javascripts"
23 | copy_directory "config"
24 | end
25 |
26 | %w(js coffee em es6).each do |engine|
27 | test "create model with #{engine} engine" do
28 | run_generator ["post", "title:string", "--javascript-engine=#{engine}"]
29 | assert_file "app/assets/javascripts/models/post.#{engine_to_extension(engine)}"
30 | end
31 |
32 | test "create namespaced model with #{engine} engine" do
33 | run_generator ["post/doineedthis", "title:string", "--javascript-engine=#{engine}"]
34 | assert_file "app/assets/javascripts/models/post/doineedthis.#{engine_to_extension(engine)}", /PostDoineedthis|export default DS\.Model\.extend/
35 | end
36 |
37 | test "create attribute with #{engine} engine" do
38 | run_generator ["comment", "post:references", "body:string", "--javascript-engine=#{engine}"]
39 | assert_file "app/assets/javascripts/models/comment.#{engine_to_extension(engine)}", /body: DS.attr/
40 | assert_file "app/assets/javascripts/models/comment.#{engine_to_extension(engine)}", /post: DS.belongsTo.+post/
41 | end
42 | end
43 |
44 | test "leave parentheses when create model w/o attributes (with coffee engine)" do
45 | run_generator ["post", "--javascript-engine=coffee"]
46 | assert_file "app/assets/javascripts/models/post.coffee", /DS.Model.extend\(\)/
47 | end
48 |
49 | test "Assert files are properly created" do
50 | run_generator %w(ember)
51 |
52 | assert_file "#{ember_path}/models/ember.js"
53 | end
54 |
55 | test "Assert files are properly created with custom path" do
56 | custom_path = ember_path("custom")
57 | run_generator [ "ember", "-d", custom_path ]
58 |
59 | assert_file "#{custom_path}/models/ember.js"
60 | end
61 |
62 | test "Assert files are properly created with custom app name" do
63 | run_generator [ "ember", "-n", "MyApp" ]
64 | assert_file "app/assets/javascripts/models/ember.js", /MyApp\.Ember/
65 | end
66 |
67 | test "Uses config.ember.app_name as the app name" do
68 | begin
69 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
70 |
71 | run_generator %w(ember)
72 | assert_file "app/assets/javascripts/models/ember.js", /MyApp\.Ember/
73 | ensure
74 | ::Rails.configuration.ember.app_name = old
75 | end
76 | end
77 |
78 | test "Uses config.ember.ember_path" do
79 | begin
80 | custom_path = ember_path("custom")
81 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
82 |
83 | run_generator ["ember"]
84 | assert_file "#{custom_path}/models/ember.js"
85 | ensure
86 | ::Rails.configuration.ember.ember_path = old
87 | end
88 | end
89 | private
90 |
91 | def ember_path(custom_path = nil)
92 | "app/assets/javascripts/#{custom_path}".chomp('/')
93 | end
94 |
95 | def engine_to_extension(engine)
96 | engine = "module.#{engine}" if engine == 'es6'
97 | engine
98 | end
99 |
100 | end
101 |
--------------------------------------------------------------------------------
/test/generators/component_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/component_generator'
3 |
4 | class ComponentGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::ComponentGenerator
6 |
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts"
22 | copy_directory "config"
23 | end
24 |
25 | %w(js coffee em es6).each do |engine|
26 |
27 | test "default_component with #{engine} engine" do
28 | run_generator ["PostChart","--javascript-engine=#{engine}"]
29 | assert_file "app/assets/javascripts/components/post-chart.#{engine_to_extension(engine)}"
30 | assert_file "app/assets/javascripts/templates/components/post-chart.hbs"
31 | end
32 |
33 | end
34 |
35 | test "Assert files are properly created (CamelCase)" do
36 | run_generator %w(PostChart)
37 | assert_file "#{ember_path}/components/post-chart.js"
38 | assert_file "#{ember_path}/templates/components/post-chart.hbs"
39 | end
40 |
41 | test "Assert object names are properly created with CamelCase name" do
42 | run_generator %w(PostChart)
43 | assert_file "#{ember_path}/components/post-chart.js", /Dummy\.PostChartComponent/
44 | assert_file "#{ember_path}/templates/components/post-chart.hbs"
45 | end
46 |
47 | test "Assert files are properly created (lower-case)" do
48 | run_generator %w(post-chart)
49 | assert_file "#{ember_path}/components/post-chart.js"
50 | assert_file "#{ember_path}/templates/components/post-chart.hbs"
51 | end
52 |
53 | test "Assert object names are properly created with lower-case name" do
54 | run_generator %w(post-chart)
55 | assert_file "#{ember_path}/components/post-chart.js", /Dummy\.PostChartComponent/
56 | assert_file "#{ember_path}/templates/components/post-chart.hbs"
57 | end
58 |
59 | test "Assert files are properly created with custom path" do
60 | custom_path = ember_path("custom")
61 | run_generator [ "PostChart", "-d", custom_path ]
62 | assert_file "#{custom_path}/components/post-chart.js"
63 | assert_file "#{custom_path}/templates/components/post-chart.hbs"
64 | end
65 |
66 | test "Assert files are properly created with custom app name" do
67 | run_generator [ "PostChart", "-n", "MyApp" ]
68 | assert_file "#{ember_path}/components/post-chart.js", /MyApp\.PostChartComponent/
69 | assert_file "#{ember_path}/templates/components/post-chart.hbs"
70 | end
71 |
72 | test "Uses config.ember.app_name as the app name" do
73 | begin
74 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
75 |
76 | run_generator %w(PostChart)
77 | assert_file "#{ember_path}/components/post-chart.js", /MyApp\.PostChartComponent/
78 | ensure
79 | ::Rails.configuration.ember.app_name = old
80 | end
81 | end
82 |
83 | test "Uses config.ember.ember_path" do
84 | begin
85 | custom_path = ember_path("custom")
86 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
87 |
88 | run_generator ["PostChart"]
89 | assert_file "#{custom_path}/components/post-chart.js"
90 | assert_file "#{custom_path}/templates/components/post-chart.hbs"
91 | ensure
92 | ::Rails.configuration.ember.ember_path = old
93 | end
94 | end
95 |
96 | private
97 |
98 | def ember_path(custom_path = nil)
99 | "app/assets/javascripts/#{custom_path}".chomp('/')
100 | end
101 |
102 | def engine_to_extension(engine)
103 | engine = "module.#{engine}" if engine == 'es6'
104 | engine
105 | end
106 |
107 | end
108 |
--------------------------------------------------------------------------------
/lib/ember_rails.rb:
--------------------------------------------------------------------------------
1 | require 'rails'
2 | require 'ember/source'
3 | require 'ember/data/source'
4 | require 'ember/rails/version'
5 | require 'ember/rails/engine'
6 | require 'ember/data/active_model/adapter/source'
7 |
8 | # Use handlebars if it possible. Because it is an optional feature.
9 | begin
10 | require 'handlebars/source'
11 | rescue LoadError => e
12 | raise e unless ['cannot load such file -- handlebars/source', 'no such file to load -- handlebars/source'].include?(e.message)
13 | end
14 |
15 | module Ember
16 | module Rails
17 | class Railtie < ::Rails::Railtie
18 | config.ember = ActiveSupport::OrderedOptions.new
19 | config.ember.module_prefix = 'ember-app'
20 | config.ember.prefix_files = %w(store router)
21 | config.ember.prefix_dirs = %w(
22 | models
23 | controllers
24 | views
25 | routes
26 | components
27 | helpers
28 | mixins
29 | services
30 | initializers
31 | instance-initializers
32 | serializers
33 | adapters
34 | transforms
35 | )
36 |
37 | generators do |app|
38 | app.config.generators.assets = false
39 |
40 | ::Rails::Generators.configure!(app.config.generators)
41 | ::Rails::Generators.hidden_namespaces.uniq!
42 | require "generators/ember/resource_override"
43 | end
44 |
45 | def configure_assets(app)
46 | if config.respond_to?(:assets) && config.assets.respond_to?(:configure)
47 | # Rails 4.x
48 | config.assets.configure do |env|
49 | yield env
50 | end
51 | else
52 | # Rails 3.2
53 | yield app.assets
54 | end
55 | end
56 |
57 | initializer "ember_rails.setup_vendor_on_locale", :after => "ember_rails.setup", :group => :all do |app|
58 | variant = app.config.ember.variant || (::Rails.env.production? ? :production : :development)
59 |
60 | # Allow a local variant override
61 | ember_path = app.root.join("vendor/assets/ember/#{variant}")
62 |
63 | configure_assets app do |env|
64 | env.prepend_path(ember_path.to_s) if ember_path.exist?
65 | end
66 | end
67 |
68 | initializer "ember_rails.copy_vendor_to_local", :after => "ember_rails.setup", :group => :all do |app|
69 | variant = app.config.ember.variant || (::Rails.env.production? ? :production : :development)
70 |
71 | # Copy over the desired ember and ember-data bundled in
72 | # ember-source and ember-data-source to a tmp folder.
73 | tmp_path = app.root.join("tmp/ember-rails")
74 | FileUtils.mkdir_p(tmp_path)
75 |
76 | if variant == :production
77 | ember_ext = ".prod.js"
78 | else
79 | ember_ext = ".debug.js"
80 | ember_ext = ".js" unless File.exist?(::Ember::Source.bundled_path_for("ember#{ember_ext}")) # Ember.js 1.9.0 or earlier has no "ember.debug.js"
81 | end
82 | FileUtils.cp(::Ember::Source.bundled_path_for("ember#{ember_ext}"), tmp_path.join("ember.js"))
83 | ember_data_ext = variant == :production ? ".prod.js" : ".js"
84 | FileUtils.cp(::Ember::Data::Source.bundled_path_for("ember-data#{ember_data_ext}"), tmp_path.join("ember-data.js"))
85 | FileUtils.cp(::Ember::Data::ActiveModel::Adapter::Source.bundled_path_for("active-model-adapter.js"), tmp_path.join("active-model-adapter.js"))
86 |
87 | configure_assets app do |env|
88 | env.append_path tmp_path
89 | end
90 | end
91 |
92 | initializer "ember_rails.setup_vendor", :after => "ember_rails.copy_vendor_to_local", :group => :all do |app|
93 | configure_assets app do |env|
94 | env.append_path ::Ember::Source.bundled_path_for(nil)
95 | env.append_path ::Ember::Data::Source.bundled_path_for(nil)
96 | env.append_path ::Ember::Data::ActiveModel::Adapter::Source.bundled_path_for(nil)
97 | env.append_path File.expand_path('../', ::Handlebars::Source.bundled_path) if defined?(::Handlebars::Source)
98 | end
99 | end
100 |
101 | initializer "ember_rails.setup_ember_template_compiler", :after => "ember_rails.setup_vendor", :group => :all do |app|
102 | configure_assets app do |env|
103 | Ember::Handlebars::Template.setup_ember_template_compiler(env.resolve('ember-template-compiler.js'))
104 | end
105 | end
106 |
107 | initializer "ember_rails.setup_ember_cli_assets", :after => "ember_rails.setup_vendor", :group => :all do |app|
108 | configure_assets app do |env|
109 | env.append_path Ember::CLI::Assets.root
110 | end
111 | end
112 |
113 | initializer "ember_rails.setup_ember_handlebars_template", :after => "ember_rails.setup_vendor", :group => :all do |app|
114 | configure_assets app do |env|
115 | Ember::Handlebars::Template.setup env
116 | end
117 | end
118 |
119 | initializer "ember_rails.setup_ember_es6_template", :after => "ember_rails.setup_vendor", :group => :all do |app|
120 | configure_assets app do |env|
121 | Ember::ES6Template.setup env
122 | end
123 | end
124 |
125 | initializer "ember_rails.es5_default", :group => :all do |app|
126 | if defined?(Closure::Compiler) && app.config.assets.js_compressor == :closure
127 | Closure::Compiler::DEFAULT_OPTIONS[:language_in] = 'ECMASCRIPT5'
128 | end
129 | end
130 | end
131 | end
132 | end
133 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## 0.20.5 (Mar 23, 2016)
2 |
3 | - Support initializer as ES6 module syntax
4 | - Support instance initializer as ES6 module syntax
5 | - Generate bootstrap files using `config.ember.prefix_dirs`
6 |
7 | ## 0.20.4 (Mar 20, 2016)
8 |
9 | - Support `Ember.Service` as ES6 module syntax
10 |
11 | ## 0.20.3 (Mar 7, 2016)
12 |
13 | - Don't depend on `Rails.configuration` in generator template for Rails Engine
14 |
15 | ## 0.20.2 (Mar 6, 2016)
16 |
17 | - Fix to generated app file path for coffee & em
18 | - Allow `transforms` directory as an module compilation target
19 |
20 | ## 0.20.1 (Feb 20, 2016)
21 |
22 | - Fix environment.coffee/em generator typo
23 |
24 | ## 0.20.0 (Feb 9, 2016)
25 |
26 | - Support ES6 syntax
27 |
28 | ## 0.19.3 (Dec 9, 2015)
29 |
30 | - Use the 'prod' variant when downloading ember
31 |
32 | ## 0.19.2 (Aug 28, 2015)
33 |
34 | - Support sprockets-rails 3.0.0
35 |
36 | ## 0.19.1 (Aug 14, 2015)
37 |
38 | - Fix to be compatible with Sprockets 2 and 3
39 |
40 | ## 0.19.0 (July 13, 2015)
41 |
42 | - Add support for the active-model-adapter as a gem
43 |
44 | ## 0.18.3 (July 5, 2015)
45 |
46 | - Fix to support jRuby without handlebars-source
47 |
48 | ## 0.18.2 (April 11, 2015)
49 |
50 | - Update generator using `Ember.Controller` instead of `Ember.ObjectController`
51 |
52 | ## 0.18.1 (April 2, 2015)
53 |
54 | - Support to precompile handlebars with vendored ember-template-compiler.js
55 |
56 | ## 0.18.0 (Mar 30, 2015)
57 |
58 | - Extract `Ember::Handlebars::Template` to [ember-handlebars-template](https://github.com/tricknotes/ember-handlebars-template) gem.
59 | - Support sprockets 3 beta
60 |
61 | ## 0.17.0 (Mar 14, 2015)
62 |
63 | - Remove Handlebars dependency (It becomes an optional feature.)
64 |
65 | ## 0.16.4 (Feb 17, 2015)
66 |
67 | - Append all assets to sprockets path that bundled in ember-source & ember-data-source
68 |
69 | ## 0.16.3 (Feb 13, 2015)
70 |
71 | - Remove extra heading `/` from AMD module name
72 |
73 | ## 0.16.2 (Feb 11, 2015)
74 |
75 | - Restrict handlebars-source version < 3 because of precompilation failed.
76 | - Update generator using `jquery_ujs` to deal with CSRF Token correctly.
77 |
78 | ## 0.16.1 (Jan 1, 2015)
79 |
80 | - Fix to support ember-data.js.map
81 |
82 | ## 0.16.0 (Dec 28, 2014)
83 |
84 | - Support HTMLBars compilation
85 | - Add adapter generator
86 |
87 | ## 0.15.1 (Dec 13, 2014)
88 |
89 | - Fix `ember:install` for ember-data to work with `--channel=release`.
90 | - Stop generation `App.Store`.
91 | - Support for CSRF Token to DS.RESTAdapter in store
92 | - Fix handlebars amd output compatibility with IE8
93 |
94 | ## 0.15.0 (April 30, 2014)
95 |
96 | - Load app.js with relative path.
97 | - Bootstrap generator should add code at the end of application.js if there's no newline.
98 | - coffee-script template should require jQuery.
99 | - Ensure Ember Data 1.0.0-beta is used.
100 | - Use App.ApplicationAdapter instead of using `_ams`.
101 |
102 | ## 0.14.1 (Nov 27, 2013)
103 |
104 | - Fixed 404 error detection in `ember:install` generator.
105 | - Fixed bootstrap generator for Rails engines.
106 | - Override channel to beta for Ember Data if `--channel=release` was specified. This is needed
107 | because Ember Data does not have any builds in the release channel (since it has not hit 1.0).
108 | - Fixed a few typos.
109 |
110 | ## 0.14.0 (Nov 4, 2013)
111 |
112 | - Added support for most recent stable releases of ember js and ember data.
113 | - Added various fixes to better support Rails 4.0 projects out of the box
114 | - Added generators for ember components
115 | - Append source url and timestamp when manually fetching ember js source files via install command.
116 | - Added support for DS.ActiveModelAdapter and support for underscore to camelCased model properties.
117 | For more info see issue #268
118 | - Added support for selective downloading of ember source via channels: canary, beta, release
119 | - Added support to selectively download tagged releases
120 | - Added support for compilation of project code as AMD modules in addition to the default behavior of
121 | compiling a global AppName namespace. For more info on AMD modules see http://requirejs.org/docs/whyamd.html
122 | - Added support for customizing ember generators output with custom ember_path.
123 | If your ember project source lives in a non standard directory
124 | - Added additional configuration options for customizing some of the behavior of ember-rails.
125 | For more info see Configuration Options section of readme.
126 | - Added support for EmberScript in the generators
127 | - Various bug fixes and improved test coverage
128 |
129 | ## 0.11.0 (Feb 28, 2013)
130 |
131 | - Use handlebars-source and ember-source gems
132 |
133 | ## 0.10.0 (Feb 17, 2013)
134 |
135 | - Updated Ember.js to version 1.0-rc.1
136 | - Updated Handlebars.js to version 1.0-rc.3
137 |
138 | ## 0.9.1 (Jan 23, 2013)
139 |
140 | - Updated Ember.js to version 1.0-pre.4
141 | - Updated Handlebars.js to version 1.0-rc2
142 |
143 | - Remove filters as Ember do not support
144 | anonymous templates anymore
145 |
146 | ## 0.8.0 (Oct 27, 2012)
147 |
148 | - Updated Ember.js to version 1.0-pre.2
149 |
150 | ## 0.5.0 (Mai 25, 2012)
151 |
152 | - Updated Ember.js to version 0.9.8.1
153 |
154 | Improvements:
155 |
156 | - The development/production switch was rewriten and should be muche more robust
157 | - Lots of work on generators
158 |
159 | ## 0.4.0 (Avr 20, 2012)
160 |
161 | - Updated Ember.js to version 0.9.7.1
162 |
163 | Improvements:
164 |
165 | - Ember-rails will use the production build of Ember.js when Rails is
166 | running in production mode, and the development build otherwise.
167 |
168 | ## 0.3.1 (Avr 19, 2012)
169 |
170 | - Updated Ember.js to version 0.9.7
171 |
172 | Improvements:
173 |
174 | - Fix #34
175 |
176 | ## 0.3.0 (Avr 9, 2012)
177 |
178 | - Updated Ember.js to version 0.9.6
179 |
180 | Improvements:
181 |
182 | - Use precompilation only in production environment
183 | - Expose some options related to templates paths
184 | - Slim and Haml filters
185 |
186 | ## 0.2.4 (Jan 27, 2012)
187 |
188 | - Updated Ember.js to version 0.9.4
189 |
190 | Improvements:
191 |
192 | - Removing ember-datetime. Just vanilla ember.js will be included in
193 | this gem for the immediate future.
194 | - Use precompilation provided by Ember.js to reduce duplication
195 |
--------------------------------------------------------------------------------
/test/generators/bootstrap_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/bootstrap_generator'
3 |
4 | class BootstrapGeneratorTest < Rails::Generators::TestCase
5 | tests Ember::Generators::BootstrapGenerator
6 | destination File.join(Rails.root, "tmp", "generator_test_output")
7 |
8 | setup :prepare_destination
9 |
10 | def copy_directory(dir)
11 | source = Rails.root.join(dir)
12 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
13 |
14 | FileUtils.mkdir_p dest
15 | FileUtils.cp_r source, dest
16 | end
17 |
18 | def prepare_destination
19 | super
20 |
21 | copy_directory "app/assets/javascripts/application.js"
22 | copy_directory "config"
23 | end
24 |
25 | test "Assert folder layout and .gitkeep files are properly created" do
26 | run_generator
27 | assert_new_dirs(:skip_git => false)
28 | end
29 |
30 | test "Assert folder layout is properly created without .gitkeep files" do
31 | run_generator %w(-g)
32 | assert_new_dirs(:skip_git => true)
33 | end
34 |
35 | test "Assert folder layout with `ember.prefix_dirs`" do
36 | begin
37 | old, ::Rails.configuration.ember.prefix_dirs = ::Rails.configuration.ember.prefix_dirs, %w(foo)
38 |
39 | run_generator %w(-g)
40 |
41 | %w{foo templates templates/components}.each do |dir|
42 | assert_directory ember_path(dir)
43 | end
44 | ensure
45 | ::Rails.configuration.ember.prefix_dirs = old
46 | end
47 | end
48 |
49 | %w(js coffee em es6).each do |engine|
50 |
51 | test "create bootstrap with #{engine} engine" do
52 | extension = engine_to_extension(engine)
53 | run_generator ["--javascript-engine=#{engine}"]
54 |
55 | assert_file ember_path("router.#{extension}")
56 | assert_file ember_path("adapters/application.#{extension}")
57 | assert_file ember_path("dummy.#{extension}")
58 | assert_file ember_path("environment.#{extension}")
59 |
60 | assert_application_file_modified ember_path("application.#{engine}"), 'dummy'
61 | end
62 |
63 | test "create bootstrap with #{engine} engine and custom path" do
64 | custom_path = ember_path("custom")
65 | extension = engine_to_extension(engine)
66 | run_generator ["--javascript-engine=#{engine}", "-d", custom_path]
67 |
68 | assert_file "#{custom_path}/router.#{extension}"
69 | assert_file "#{custom_path}/adapters/application.#{extension}"
70 | assert_file "#{custom_path}/dummy.#{extension}"
71 | assert_file "#{custom_path}/environment.#{extension}"
72 |
73 | assert_application_file_modified "#{custom_path}/application.#{engine}", 'dummy'
74 | end
75 |
76 | test "create bootstrap with #{engine} and custom app name" do
77 | extension = engine_to_extension(engine)
78 | run_generator ["--javascript-engine=#{engine}", "-n", "MyApp"]
79 |
80 | assert_file ember_path("router.#{extension}"), /MyApp\.Router\.map|Ember\.Router\.extend/
81 | assert_file ember_path("adapters/application.#{extension}"), /MyApp\.ApplicationAdapter|DS\.ActiveModelAdapter\.extend/
82 | assert_file ember_path("my-app.#{extension}")
83 | assert_file ember_path("environment.#{extension}")
84 |
85 | assert_application_file_modified ember_path("application.#{engine}"), 'my-app'
86 | end
87 |
88 | end
89 |
90 | test "adds requires to `application.js`" do
91 | run_generator
92 |
93 | assert_application_file_modified ember_path('application.js'), 'dummy'
94 | end
95 |
96 | test "creates `application.js` if it doesn't exist" do
97 | File.delete destination_root + '/app/assets/javascripts/application.js'
98 |
99 | run_generator
100 |
101 | assert_application_file_modified ember_path('application.js'), 'dummy'
102 | end
103 |
104 | test "modifies `application.js` it's empty" do
105 | File.write(destination_root + '/app/assets/javascripts/application.js', '')
106 |
107 | run_generator
108 |
109 | assert_application_file_modified ember_path('application.js'), 'dummy'
110 | end
111 |
112 | test "modifies `application.js` if require_tree doesn't exist and there's no new line" do
113 | File.write(destination_root + '/app/assets/javascripts/application.js', '//= require jquery')
114 |
115 | run_generator
116 |
117 | assert_application_file_modified ember_path('application.js'), 'dummy'
118 | end
119 |
120 | test "Uses config.ember.app_name as the app name" do
121 | begin
122 | old, ::Rails.configuration.ember.app_name = ::Rails.configuration.ember.app_name, 'MyApp'
123 |
124 | run_generator %w(ember)
125 | assert_file "#{ember_path}/router.js", /MyApp\.Router\.map/
126 | assert_file "#{ember_path}/adapters/application.js", /MyApp\.ApplicationAdapter = DS\.ActiveModelAdapter/
127 | ensure
128 | ::Rails.configuration.ember.app_name = old
129 | end
130 | end
131 |
132 | test "Uses config.ember.ember_path" do
133 | begin
134 | custom_path = ember_path("custom")
135 | old, ::Rails.configuration.ember.ember_path = ::Rails.configuration.ember.ember_path, custom_path
136 |
137 | run_generator
138 | assert_file "#{custom_path}/router.js"
139 | assert_file "#{custom_path}/#{application_name.underscore}.js"
140 | ensure
141 | ::Rails.configuration.ember.ember_path = old
142 | end
143 | end
144 |
145 | private
146 |
147 | def assert_application_file_modified(application_file, application_name)
148 | assert_file application_file, %r{(?://|#)= require ember}
149 | assert_file application_file, %r{(?://|#)= require ember-data}
150 | assert_file application_file, %r{(?://|#)= require \./#{application_name}}
151 | end
152 |
153 | def assert_invoked_generators_files(options = {})
154 | path = options[:in_path] || ember_path
155 |
156 | assert_file "#{path}/application.js"
157 | assert_file "#{path}/#{application_name}.js"
158 | assert_file "#{path}/router.js"
159 | assert_file "#{path}/adapters/application.js"
160 | end
161 |
162 | def assert_new_dirs(options = {})
163 | path = options[:in_path] || ember_path
164 |
165 | %W{models controllers views helpers components templates templates/components routes mixins services initializers serializers adapters transforms}.each do |dir|
166 | assert_directory "#{path}/#{dir}"
167 | assert_file "#{path}/#{dir}/.gitkeep" unless options[:skip_git]
168 | end
169 | end
170 |
171 | def application_name
172 | "Dummy"
173 | end
174 |
175 | def ember_path(custom_path = nil)
176 | "app/assets/javascripts/#{custom_path}".chomp('/')
177 | end
178 |
179 | def engine_to_extension(engine)
180 | engine = "module.#{engine}" if engine == 'es6'
181 | engine
182 | end
183 |
184 | end
185 |
--------------------------------------------------------------------------------
/lib/generators/ember/install_generator.rb:
--------------------------------------------------------------------------------
1 | require 'generators/ember/generator_helpers'
2 | require 'net/http'
3 | require 'uri'
4 | require 'fileutils'
5 |
6 | module Ember
7 | module Generators
8 | class InstallGenerator < ::Rails::Generators::Base
9 |
10 | class InvalidChannel < ::Thor::Error; end
11 | class ConflictingOptions < ::Thor::Error; end
12 | class InsufficientOptions < ::Thor::Error; end
13 |
14 | ::InvalidChannel = InvalidChannel
15 | ::ConflictingOptions = ConflictingOptions
16 | ::InsufficientOptions = InsufficientOptions
17 |
18 | desc "Install Ember.js into your vendor folder"
19 | class_option :head,
20 | :type => :boolean,
21 | :default => false,
22 | :desc => "Download Ember.js & Ember data from canary channel. This is deprecated. Use channel instead."
23 | class_option :channel,
24 | :type => :string,
25 | :required => false,
26 | :desc => "Ember release channel Choose between 'release', 'beta' or 'canary'"
27 | class_option :ember_only,
28 | :type => :boolean,
29 | :required => false,
30 | :desc => "Only download Ember.",
31 | :aliases => '--ember'
32 | class_option :ember_data_only,
33 | :type => :boolean,
34 | :required => false,
35 | :desc => "Only download ember-data",
36 | :aliases => '--ember-data'
37 | class_option :tag,
38 | :type => :string,
39 | :required => false,
40 | :desc => "Download tagged release use syntax v1.0.0-beta.3/ember-data & v1.0.0-rc.8/ember"
41 |
42 | def initialize(args = [], options = {}, config = {})
43 | super(args, options, config)
44 | check_options
45 | process_options
46 | end
47 |
48 | def ember
49 | begin
50 | unless options.ember_data_only?
51 | get_ember_js_for(:development)
52 | get_ember_js_for(:production)
53 | end
54 | rescue Thor::Error
55 | say('WARNING: no ember files on this channel or tag' , :yellow)
56 | end
57 | end
58 |
59 | def ember_data
60 | begin
61 | unless options.ember_only?
62 | get_ember_data_for(:development)
63 | get_ember_data_for(:production)
64 | end
65 | rescue Thor::Error
66 | say('WARNING: no ember-data files on this channel or tag' , :yellow)
67 | end
68 | end
69 |
70 | private
71 |
72 | def get_ember_data_for(environment)
73 |
74 | create_file "vendor/assets/ember/#{environment}/ember-data.js" do
75 | fetch url_for(channel, 'ember-data', environment), "vendor/assets/ember/#{environment}/ember-data.js"
76 | end
77 |
78 | sourcemap_url = "#{base_url}/#{channel}/ember-data.js.map"
79 | if resource_exist?(sourcemap_url)
80 | create_file "vendor/assets/ember/#{environment}/ember-data.js.map" do
81 | fetch sourcemap_url, "vendor/assets/ember/#{environment}/ember-data.js.map", false
82 | end
83 | end
84 | end
85 |
86 | def get_ember_js_for(environment)
87 | create_file "vendor/assets/ember/#{environment}/ember.js" do
88 | fetch url_for(channel, 'ember', environment), "vendor/assets/ember/#{environment}/ember.js"
89 | end
90 |
91 | compiler_url = "#{base_url}/#{channel}/ember-template-compiler.js"
92 | if resource_exist?(compiler_url)
93 | create_file "vendor/assets/ember/#{environment}/ember-template-compiler.js" do
94 | fetch "#{base_url}/#{channel}/ember-template-compiler.js", "vendor/assets/ember/#{environment}/ember-template-compiler.js"
95 | end
96 | end
97 | end
98 |
99 | def url_for(channel, component, environment)
100 | base = "#{base_url}/#{channel}/#{component}"
101 |
102 | case environment
103 | when :production
104 | "#{base}.prod.js"
105 | when :development
106 | if resource_exist?("#{base}.debug.js")
107 | "#{base}.debug.js" # Ember.js 1.10.0.beta.1 or later
108 | else
109 | "#{base}.js"
110 | end
111 | end
112 | end
113 |
114 | def check_options
115 | if options.head?
116 | say('WARNING: --head option is deprecated in favor of --channel=canary' , :yellow)
117 | end
118 | if options.head? && options.channel?
119 | say 'ERROR: conflicting options. --head and --channel. Use either --head or --channel=', :red
120 | raise ConflictingOptions
121 | end
122 | if options.channel? && !%w(release beta canary).include?(options[:channel])
123 | say 'ERROR: channel can either be release, beta or canary', :red
124 | raise InvalidChannel
125 | end
126 | if options.channel? && options.tag?
127 | say 'ERROR: conflicting options. --tag and --channel. --tag is incompatible with other options', :red
128 | raise ConflictingOptions
129 | end
130 | if options.head? && options.tag?
131 | say 'ERROR: conflicting options. --tag and --head. --tag is incompatible with other options', :red
132 | raise ConflictingOptions
133 | end
134 | if options.tag? && !(options.ember_only? || options.ember_data_only?)
135 | say 'ERROR: insufficient options. --tag needs to be combined with eithe --ember or --ember-data', :red
136 | raise InsufficientOptions
137 | end
138 | end
139 |
140 | def process_options
141 | if options.head?
142 | @channel = :canary
143 | end
144 | if options.tag?
145 | @channel = "tags/#{options.tag}"
146 | end
147 | end
148 |
149 | def base_url
150 | 'http://builds.emberjs.com'
151 | end
152 |
153 | def channel
154 | if options.channel
155 | @channel ||= options[:channel]
156 | else
157 | @channel ||= :release
158 | end
159 | end
160 |
161 | def fetch(from, to, prepend_verbose = true)
162 | message = "#{from} -> #{to}"
163 | say_status("downloading:", message , :green)
164 |
165 | uri = URI(from)
166 | output = StringIO.new
167 | if prepend_verbose
168 | output.puts "// Fetched from channel: #{channel}, with url " + uri.to_s
169 | output.puts "// Fetched on: " + Time.now.utc.iso8601.to_s
170 | end
171 |
172 | response = Net::HTTP.get_response(uri)
173 | case response.code
174 | when '404'
175 | say "ERROR: Error reading the content from the channel with url #{from}. File not found" , :red
176 | raise Thor::Error
177 | when '200'
178 | output.puts response.body.force_encoding("UTF-8")
179 | else
180 | say "ERROR: Unexpected error with status #{response.code} reading the content from the channel with url #{from}." , :red
181 | raise Thor::Error
182 | end
183 | output.rewind
184 | output.read
185 | end
186 |
187 | def resource_exist?(target)
188 | uri = URI(target)
189 | response = Net::HTTP.new(uri.host, uri.port).head(uri.path)
190 | response.code == '200'
191 | end
192 | end
193 | end
194 | end
195 |
--------------------------------------------------------------------------------
/test/generators/install_generator_test.rb:
--------------------------------------------------------------------------------
1 | require 'test_helper'
2 | require 'generators/ember/install_generator'
3 | require 'vcr'
4 |
5 | class InstallGeneratorTest < Rails::Generators::TestCase
6 | tests Ember::Generators::InstallGenerator
7 | destination File.join(Rails.root, "tmp", "generator_test_output")
8 |
9 | setup :prepare_destination, :set_test_environment
10 |
11 | def copy_directory(dir)
12 | source = Rails.root.join(dir)
13 | dest = Rails.root.join("tmp", "generator_test_output", File.dirname(dir))
14 |
15 | FileUtils.mkdir_p dest
16 | FileUtils.cp_r source, dest
17 | end
18 |
19 | def set_test_environment
20 | VCR.configure do |c|
21 | c.cassette_library_dir = 'test/fixtures/vcr_cassettes'
22 | c.hook_into :webmock # or :fakeweb
23 | c.default_cassette_options = { :record => :new_episodes }
24 | end
25 | end
26 |
27 | def prepare_destination
28 | super
29 | create_directory "vendor/assets/ember/production"
30 | create_directory "vendor/assets/ember/development"
31 | end
32 |
33 | def create_directory(dir)
34 | dest = Rails.root.join("tmp", "generator_test_output", dir)
35 | FileUtils.mkdir_p dest
36 | end
37 |
38 | test "without any options it load the release channel" do
39 | VCR.use_cassette('fetch_ember_release') do
40 | run_generator
41 | end
42 | assert_all_ember_files
43 | assert_all_ember_template_compiler_files
44 | assert_all_ember_data_files
45 | end
46 |
47 | test "with options --head it should load the canary ember-data & ember files" do
48 | VCR.use_cassette('fetch_ember_canary') do
49 | run_generator ['--head']
50 | end
51 | assert_all_ember_files
52 | assert_all_ember_template_compiler_files
53 | assert_all_ember_data_files
54 | end
55 |
56 | test "with options --head it should show a deprecation message" do
57 | VCR.use_cassette('fetch_ember_canary') do
58 | output = run_generator ['--head']
59 | assert( output.include?('--head option is deprecated in favor of --channel=canary'))
60 | end
61 | end
62 |
63 | test "with options channel=release it should load the release ember-data & ember files" do
64 | VCR.use_cassette('fetch_ember_release') do
65 | run_generator ['--channel=release']
66 | end
67 | assert_all_ember_files
68 | assert_all_ember_template_compiler_files
69 | assert_all_ember_data_files
70 | end
71 |
72 | test "with options channel=beta it should load the beta ember-data & ember files" do
73 | VCR.use_cassette('fetch_ember_beta') do
74 | run_generator ['--channel=beta']
75 | end
76 | assert_all_ember_files
77 | assert_all_ember_template_compiler_files
78 | assert_all_ember_data_files
79 | end
80 |
81 | test "with options channel=canary it should load the beta ember-data & ember files" do
82 | VCR.use_cassette('fetch_ember_canary') do
83 | run_generator ['--channel=canary']
84 | end
85 | assert_all_ember_files
86 | assert_all_ember_template_compiler_files
87 | assert_all_ember_data_files
88 | end
89 |
90 | test "with options channel set and options --head it should raise exception ConflictingOptions" do
91 | assert_raise ::ConflictingOptions do
92 | run_generator ['--channel=canary', '--head'], debug: true
93 | end
94 | assert_no_ember_files
95 | assert_no_ember_data_files
96 | end
97 |
98 | test "with unknown channel option it should raise exception InvalidChannel" do
99 | assert_raise ::InvalidChannel do
100 | run_generator ['--channel=unkown'], debug: true
101 | end
102 | assert_no_ember_files
103 | assert_no_ember_data_files
104 | end
105 |
106 | test "with option ember_only it should only load ember" do
107 | VCR.use_cassette('fetch_ember_release') do
108 | run_generator ['--ember_only']
109 | end
110 | assert_all_ember_files
111 | assert_all_ember_template_compiler_files
112 | assert_no_ember_data_files
113 | end
114 |
115 | test "option --ember aliases --ember_only" do
116 | VCR.use_cassette('fetch_ember_release') do
117 | run_generator ['--ember']
118 | end
119 | assert_all_ember_files
120 | assert_all_ember_template_compiler_files
121 | assert_no_ember_data_files
122 | end
123 |
124 | test "with option ember-data_only it should only load ember" do
125 | VCR.use_cassette('fetch_ember_beta') do
126 | run_generator ['--ember_data_only', '--channel=beta']
127 | end
128 | assert_no_ember_files
129 | assert_all_ember_data_files
130 | end
131 |
132 | test "option --ember-data aliasses --ember_data_only" do
133 | VCR.use_cassette('fetch_ember_beta') do
134 | run_generator ['--ember-data', '--channel=beta']
135 | end
136 | assert_no_ember_files
137 | assert_all_ember_data_files
138 | end
139 |
140 | test "with options --tag=v1.0.0-beta.1 --ember-data" do
141 | VCR.use_cassette('fetch_ember_data_tagged') do
142 | run_generator ['--tag=v1.0.0-beta.1', '--ember-data']
143 | end
144 | assert_no_ember_files
145 | assert_all_ember_data_files
146 | end
147 |
148 | test "with option --tag=v1.11.0 --ember" do
149 | VCR.use_cassette('fetch_ember_tagged') do
150 | run_generator ['--tag=v1.11.0', '--ember']
151 | end
152 | assert_all_ember_files
153 | assert_all_ember_template_compiler_files
154 | assert_no_ember_data_files
155 | end
156 |
157 | test "with option --tag=v1.2.0 --ember" do
158 | VCR.use_cassette('fetch_ember_tagged') do
159 | run_generator ['--tag=v1.2.0', '--ember']
160 | end
161 | assert_all_ember_files
162 | assert_all_ember_template_compiler_files
163 | assert_no_ember_data_files
164 | end
165 |
166 | test "with option --tag=v1.1.0 --ember" do
167 | VCR.use_cassette('fetch_ember_tagged') do
168 | run_generator ['--tag=v1.1.0', '--ember']
169 | end
170 | assert_all_ember_files
171 | assert_no_ember_template_compiler_files # Old ember has no `ember-template-compiler.js`
172 | assert_no_ember_data_files
173 | end
174 |
175 | test "with options --channel set and options --tag it should raise exception ConflictingOptions" do
176 | assert_raise ::ConflictingOptions do
177 | run_generator ['--channel=canary', '--tag=v1.2.0-beta.2/ember'], debug: true
178 | end
179 | assert_no_ember_files
180 | assert_no_ember_data_files
181 | end
182 |
183 | test "with options --head set and options --tag it should raise exception ConflictingOptions" do
184 | assert_raise ::ConflictingOptions do
185 | run_generator ['--head', '--tag=v1.2.0-beta.2/ember'], debug: true
186 | end
187 | assert_no_ember_files
188 | assert_no_ember_data_files
189 | end
190 |
191 | test "with options --tag without --ember or --ember-data it should raise exception InsufficientOptions" do
192 | assert_raise ::InsufficientOptions do
193 | run_generator ['--tag=v1.2.0-beta.2'], debug: true
194 | end
195 | assert_no_ember_files
196 | assert_no_ember_data_files
197 | end
198 |
199 | private
200 |
201 | def assert_all_ember_files
202 | assert_file "vendor/assets/ember/development/ember.js"
203 | assert_file "vendor/assets/ember/production/ember.js"
204 | end
205 |
206 | def assert_all_ember_template_compiler_files
207 | assert_file "vendor/assets/ember/development/ember-template-compiler.js"
208 | assert_file "vendor/assets/ember/production/ember-template-compiler.js"
209 | end
210 |
211 | def assert_all_ember_data_files
212 | assert_file "vendor/assets/ember/development/ember-data.js"
213 | assert_file "vendor/assets/ember/production/ember-data.js"
214 | end
215 |
216 | def assert_no_ember_files
217 | assert_no_file "vendor/assets/ember/development/ember.js"
218 | assert_no_file "vendor/assets/ember/production/ember.js"
219 | end
220 |
221 | def assert_no_ember_template_compiler_files
222 | assert_no_file "vendor/assets/ember/development/ember-template-compiler.js"
223 | assert_no_file "vendor/assets/ember/production/ember-template-compiler.js"
224 | end
225 |
226 | def assert_no_ember_data_files
227 | assert_no_file "vendor/assets/ember/development/ember-data.js"
228 | assert_no_file "vendor/assets/ember/production/ember-data.js"
229 | end
230 |
231 | end
232 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ember-rails [](http://travis-ci.org/emberjs/ember-rails) [](https://gemnasium.com/emberjs/ember-rails) [](https://codeclimate.com/github/emberjs/ember-rails)
2 |
3 | ember-rails makes developing an [Ember.JS](http://emberjs.com/) application much easier in Rails 3.1+.
4 |
5 | The following functionalities are included in this gem:
6 | - Pre-compiling of your handlebars templates when building your asset pipeline.
7 | - Inclusion of development and production copies of Ember, [Ember Data](https://github.com/emberjs/data) and [Handlebars](https://github.com/wycats/handlebars.js).
8 | - Inclusion of [ActiveModel::Serializer](https://github.com/rails-api/active_model_serializers) for integration with Ember Data.
9 |
10 | You can see an example of how to use the gem [here](https://github.com/keithpitt/ember-rails-example). There is also a great tutorial by [Dan Gebhardt](https://twitter.com/#!/dgeb) called "[Beginning Ember.js on Rails](http://www.cerebris.com/blog/2012/01/24/beginning-ember-js-on-rails-part-1/)" which is a great read if you're just starting out with Rails and Ember.js.
11 |
12 | ## Getting started
13 | * Add the gem to your application Gemfile:
14 |
15 | ```ruby
16 | gem 'ember-rails'
17 | # gem 'ember-source' # You can specify the Ember.js version you want to use.(such as '~> 1.13.0')
18 | ```
19 |
20 | * Run `bundle install`
21 | * Next, generate the application structure:
22 |
23 | ```shell
24 | $ rails generate ember:bootstrap
25 | ```
26 |
27 | * Restart your server (if it's running)
28 |
29 | ## Building a new project from scratch
30 |
31 | Rails supports the ability to build projects from a template source ruby file.
32 |
33 | To build an Ember centric Rails project you can simply type the following into your command line:
34 |
35 | ```shell
36 | $ rails new my-app -m http://emberjs.com/edge_template.rb
37 | ```
38 |
39 | Read more about [Rails application templates](http://edgeguides.rubyonrails.org/rails_application_templates.html) and take a look at the edge_template.rb [source code](https://github.com/emberjs/website/blob/master/source/edge_template.rb).
40 |
41 | Notes:
42 |
43 | To install the latest builds of ember and ember-data. It should be noted that the
44 | examples in the [getting started guide](http://emberjs.com/guides/getting-started/)
45 | have been designed to use the released version of ember:
46 |
47 | ```shell
48 | $ rails generate ember:install
49 | ```
50 |
51 | You'll probably need to clear out your cache after doing this with:
52 |
53 | ```shell
54 | $ rake tmp:clear
55 | ```
56 |
57 | Also, ember-rails includes some flags for the bootstrap generator:
58 |
59 | ```
60 | --ember-path or -d # custom ember path
61 | --skip-git or -g # skip git keeps
62 | --javascript-engine # engine for javascript (js, coffee, em or es6)
63 | --app-name or -n # custom ember app name
64 | ```
65 |
66 |
67 | ## For CoffeeScript support
68 |
69 | Add coffee-rails to the Gemfile
70 | ```ruby
71 | gem 'coffee-rails'
72 | ```
73 |
74 | Run the bootstrap generator in step 4 with an extra flag instead:
75 | ```shell
76 | $ rails g ember:bootstrap -g --javascript-engine coffee
77 | ```
78 |
79 | ## For EmberScript support
80 |
81 | [EmberScript](http://www.emberscript.com) is a dialect of CoffeeScript
82 | with extra support for computed properties (which do not have to be
83 | explicitly declared), the `class` / `extends` syntax, and extra syntax
84 | to support observers and mixins.
85 |
86 | To get EmberScript support, make sure you have the following in your
87 | Gemfile:
88 |
89 | ```ruby
90 | gem 'ember_script-rails', :github => 'ghempton/ember-script-rails'
91 | ```
92 |
93 | You can now use the flag `--javascript-engine=em` to specify EmberScript
94 | assets in your generators, but all of the generators will default to
95 | using an EmberScript variant first.
96 |
97 | ## For ES6 support
98 |
99 | Ember.js recommends using ES6 syntax.
100 | It is supported by [Babel](https://babeljs.io/) via [ember-es6_template](https://github.com/tricknotes/ember-es6_template).
101 |
102 | Run the bootstrap generator with an extra flag:
103 |
104 | ```shell
105 | $ rails g ember:bootstrap --javascript-engine=es6
106 | ```
107 |
108 | Note:
109 |
110 | To use ES6 module in your application, the following configuration is required:
111 |
112 | ### Single Ember Application
113 |
114 | This is the case for single Ember application in `app/assets/javascripts` (not under the subdirectory).
115 |
116 | `my-app.es6`
117 | ``` javascript
118 | import Application from 'ember-rails/application';
119 |
120 | const App = Application.extend({
121 | // Configure your application.
122 | });
123 |
124 | App.create();
125 | ```
126 |
127 | `import Application from 'ember-rails/application';` and `Application.extend()` is important.
128 | It provides customized Ember application to resolve dependencies from ES6 modules instead of `Ember.Application.extend()`.
129 |
130 | `application.js`
131 | ``` javascript
132 | //= require jquery
133 | //= require ember
134 | //= require ember-data
135 | //= require ember-rails/application
136 | //= require ./my-app
137 | //= require_self
138 |
139 | require('my-app'); // Run your Ember.js application
140 | ```
141 |
142 | ### Multiple Ember Application
143 |
144 | This is the case for multiple Ember application in your Rails application.
145 | (Or your Ember application is placed in sub directories of `app/assets/javascripts`.)
146 |
147 | First, you should configure `config.ember.module_prefix` to `nil`.
148 | To disable prepending the module prefix to you modules.
149 |
150 | `config/application.rb`
151 | ``` ruby
152 | config.ember.module_prefix = nil
153 | ```
154 |
155 | Second, please specify `modulePrefix` to your Ember application.
156 |
157 | `my-app/application.module.es6`
158 | ``` javascript
159 | import Application from 'ember-rails/application';
160 | import loadInitializers from 'ember/load-initializers';
161 |
162 | const App = Application.extend({
163 | modulePrefix: 'my-app' // This value should be the same as directory name.
164 | });
165 |
166 | loadInitializers(App, 'my-app');
167 |
168 | App.create();
169 | ```
170 |
171 | Last, add your endpoint to where you want to run your Ember application.
172 | ``` javascript
173 | require('my-app'); // Run your Ember.js application
174 | ```
175 |
176 | ## Configuration Options
177 |
178 | The following options are available for configuration in your application or environment-level
179 | config files (`config/application.rb`, `config/environments/development.rb`, etc.):
180 |
181 | | Configuration Option | Description |
182 | |----------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
183 | | `config.ember.variant` | Determines which Ember variant to use. Valid options: `:development`, `:production`. Defaults to `:production` in production, and `:development` everywhere else. |
184 | | `config.ember.app_name` | Specificies a default application name for all generators. |
185 | | `config.ember.ember_path` | Specifies a default custom root path for all generators. |
186 | | `config.ember.module_prefix` | Sets module prefix for es6 module. This option is used for only `es6` scripts. Default value: `ember-app`. |
187 | | `config.ember.prefix_files` | Sets some file names to add `config.ember.module_prefix` into its file name as es6 module name. |
188 | | `config.ember.prefix_dirs` | Sets some dir names to add `config.ember.module_prefix` into its directory name as es6 module name. |
189 | | `config.handlebars.precompile` | Enables or disables precompilation. Default value: `true`. |
190 | | `config.handlebars.templates_root` | Sets the root path (under `app/assets/javascripts`) for templates to be looked up in. Default value: `"templates"`. |
191 | | `config.handlebars.templates_path_separator` | The path separator to use for templates. Default value: `'/'`. |
192 | | `config.handlebars.output_type` | Configures the style of output (options are `:amd` and `:global`). Default value: `:global`. |
193 | | `config.handlebars.amd_namespace` | Configures the module prefix for AMD formatted output. Default value: `nil`. |
194 | | `config.handlebars.ember_template` | Default which Ember template type to compile. Valid options: `'Handlebars', `HTMLBars`. Defaults to 'Handlebars`' when `Ember::VERSION` is under 1.10.0, `HTMLBars` when `Ember::VERSION` is over 1.10.0. |
195 |
196 | Note:
197 |
198 | In a mountable engine, ember-rails will not recognize any configurations.
199 | Instead, use command line options.
200 |
201 | ## Enabling Features with Feature Flags
202 | See [the guide](http://emberjs.com/guides/configuring-ember/feature-flags/#toc_flagging-details) and check [features.json](https://github.com/emberjs/ember.js/blob/master/features.json) for the version of Ember you're using.
203 |
204 | If a feature is set to false, you will need to compile ember from source yourself to include it.
205 |
206 | ### Important note for projects that render JSON responses
207 |
208 | ember-rails includes [active_model_serializers](https://github.com/rails-api/active_model_serializers) which affects how ActiveModel and ActiveRecord objects get serialized to JSON, such as when using `render json:` or `respond_with`. By default active_model_serializers adds root elements to these responses (such as adding `{"posts": [...]}` for `render json: @posts`) which will affect the structure of your JSON responses.
209 |
210 | To disable this effect on your JSON responses, put this in an initializer:
211 | ```Ruby
212 | # Stop active_model_serializers from adding root elements to JSON responses.
213 | ActiveModel::Serializer.root = false
214 | ActiveModel::ArraySerializer.root = false
215 | ```
216 |
217 | See the [active_model_serializers](https://github.com/rails-api/active_model_serializers) documentation for a more complete understanding of other effects this dependency might have on your app.
218 |
219 | ## Architecture
220 |
221 | Ember does not require an organized file structure. However, ember-rails allows you
222 | to use `rails g ember:bootstrap` to create the following directory structure under `app/assets/javascripts`:
223 |
224 | ```
225 | ├── adapters
226 | ├── components
227 | ├── controllers
228 | ├── helpers
229 | ├── mixins
230 | ├── models
231 | ├── practicality.coffee
232 | ├── router.coffee
233 | ├── routes
234 | ├── templates
235 | │ └── components
236 | └── views
237 | ```
238 |
239 | Additionally, it will add the following lines to `app/assets/javascripts/application.js`.
240 | By default, it uses the Rails Application's name and creates an `rails_app_name.js`
241 | file to set up application namespace and initial requires:
242 |
243 | ```javascript
244 | //= require ember
245 | //= require ember-data
246 | //= require_self
247 | //= require rails_app_name
248 | RailsAppName = Ember.Application.create();
249 | ```
250 |
251 | *Example:*
252 |
253 | ```shell
254 | $ rails g ember:bootstrap
255 | insert app/assets/javascripts/application.js
256 | create app/assets/javascripts/models
257 | create app/assets/javascripts/models/.gitkeep
258 | create app/assets/javascripts/controllers
259 | create app/assets/javascripts/controllers/.gitkeep
260 | create app/assets/javascripts/views
261 | create app/assets/javascripts/views/.gitkeep
262 | create app/assets/javascripts/helpers
263 | create app/assets/javascripts/helpers/.gitkeep
264 | create app/assets/javascripts/components
265 | create app/assets/javascripts/components/.gitkeep
266 | create app/assets/javascripts/templates
267 | create app/assets/javascripts/templates/.gitkeep
268 | create app/assets/javascripts/templates/components
269 | create app/assets/javascripts/templates/components/.gitkeep
270 | create app/assets/javascripts/mixins
271 | create app/assets/javascripts/mixins/.gitkeep
272 | create app/assets/javascripts/adapters
273 | create app/assets/javascripts/adapters/.gitkeep
274 | create app/assets/javascripts/app.js
275 | ```
276 |
277 | If you want to avoid `.gitkeep` files, use the `skip git` option like
278 | this: `rails g ember:bootstrap -g`.
279 |
280 | Ask Rails to serve HandlebarsJS and pre-compile templates to Ember
281 | by putting each template in a dedicated ".hbs", ".js.hjs" or ".handlebars" file
282 | (e.g. `app/assets/javascripts/templates/admin_panel.hbs`)
283 | and including the assets in your layout:
284 |
285 | ```erb
286 | <%= javascript_include_tag "templates/admin_panel" %>
287 | ```
288 |
289 | If you want to avoid the `templates` prefix, set the `templates_root` option in your application configuration block:
290 |
291 | ```ruby
292 | config.handlebars.templates_root = 'ember_templates'
293 | ```
294 |
295 | If you store templates in a file like `app/assets/javascripts/ember_templates/admin_panel.hbs` after setting the above config,
296 | it will be made available to Ember as the `admin_panel` template.
297 |
298 | _(Note: you must clear the local sprockets cache after modifying `templates_root`, stored by default in `tmp/cache/assets`)_
299 |
300 | Default behavior for ember-rails is to precompile handlebars templates.
301 | If you don't want this behavior you can turn it off in your application configuration (or per environment in: `config/environments/development.rb`) block:
302 |
303 | ```ruby
304 | config.handlebars.precompile = false
305 | ```
306 |
307 | _(Note: you must clear the local sprockets cache if you disable precompilation, stored by default in `tmp/cache/assets`)_
308 |
309 | Bundle all templates together thanks to Sprockets,
310 | e.g create `app/assets/javascripts/templates/all.js` with:
311 |
312 | ```js
313 | //= require_tree .
314 | ```
315 |
316 | Now a single line in the layout loads everything:
317 |
318 | ```erb
319 | <%= javascript_include_tag "templates/all" %>
320 | ```
321 |
322 | ### Note about ember components
323 |
324 | When necessary, ember-rails adheres to a conventional folder structure. To create an ember component you must define the handlebars file *inside* the *components* folder under the templates folder of your project to properly register your handlebars component file.
325 |
326 | *Example*
327 |
328 | Given the following folder structure:
329 |
330 | ```
331 | ├── adapters
332 | ├── components
333 | ├── controllers
334 | ├── helpers
335 | ├── mixins
336 | ├── models
337 | ├── practicality.coffee
338 | ├── router.coffee
339 | ├── routes
340 | ├── templates
341 | │ └── components
342 | │ └── my-component.hbs
343 | └── views
344 | ```
345 |
346 | and a `my-component.hbs` file with the following contents:
347 |
348 | ```hbs
349 | My Component
350 | ```
351 |
352 | It will produce the following handlebars output:
353 |
354 | ```html
355 |
358 | ```
359 |
360 | You can reference your component inside your other handlebars template files by the handlebars file name:
361 |
362 | ```hbs
363 | {{ my-component }}
364 | ```
365 |
366 | ## Specifying Different Versions of Ember/Handlebars/Ember-Data
367 |
368 | By default, ember-rails ships with the latest version of
369 | [Ember](https://rubygems.org/gems/ember-source/versions),
370 | [Handlebars](https://rubygems.org/gems/handlebars-source/versions),
371 | and [Ember-Data](https://rubygems.org/gems/ember-data-source/versions).
372 |
373 | To specify a different version that'll be used for both template
374 | precompilation and serving to the browser, you can specify the desired
375 | version of one of the above-linked gems in the Gemfile, e.g.:
376 |
377 | ```ruby
378 | gem 'ember-source', '~> 1.13.0'
379 | ```
380 |
381 | You can also specify versions of 'handlebars-source' and
382 | 'ember-data-source', but note that an appropriate 'handlebars-source'
383 | will be automatically chosen depending on the version of 'ember-source'
384 | that's specified.
385 |
386 | You can also override the specific ember.js, handlebars.js, and
387 | ember-data.js files that'll be `require`d by the Asset pipeline by
388 | placing these files in `vendor/assets/ember/development` and
389 | `vendor/assets/ember/production`, depending on the `config.ember.variant`
390 | you've specified in your app's configuration, e.g.:
391 |
392 | ```ruby
393 | config.ember.variant = :production
394 | # config.ember.variant = :development
395 | ```
396 |
397 | ## Updating Ember
398 |
399 | If at any point you need to update Ember.js from any of the release channels, you can do that with
400 |
401 | ```shell
402 | $ rails generate ember:install --channel=
403 | ```
404 |
405 | This will fetch both Ember.js and Ember Data from [http://builds.emberjs.com/](http://builds.emberjs.com/) and copy to the right directory. You can choose between the following channels:
406 | * canary - This references the 'master' branch and is not recommended for production use.
407 | * beta - This references the 'beta' branch, and will ultimately become the next stable version. It is not recommended for production use.
408 | * release - This references the 'stable' branch, and is recommended for production use.
409 |
410 | When you don't specify a channel, the release channel is used.
411 |
412 | It is also possible to download a specific tagged release. To do this, use the following syntax:
413 |
414 | ```shell
415 | $ rails generate ember:install --tag=v1.13.0 --ember
416 | ```
417 |
418 | or for ember-data
419 |
420 | ```shell
421 | $ rails generate ember:install --tag=v1.13.0 --ember-data
422 | ```
423 |
424 | ## CSRF Token
425 |
426 | Rails [`protect_from_forgery`](http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#method-i-protect_from_forgery) requires CSRF token for every XHR except GET.
427 | The CSRF token is normally found in `app/views/layouts/application.html.*` inserted with the rails helper: [`csrf_meta_tags`](http://api.rubyonrails.org/classes/ActionView/Helpers/CsrfHelper.html#method-i-csrf_meta_tags).
428 |
429 | When you use [jquery-ujs](https://github.com/rails/jquery-ujs),
430 | the CSRF token will be sent to the rails application on every XHR automatically.
431 | If not so, the following JavaScript is required in your code.
432 |
433 | ``` javascript
434 | $.ajaxPrefilter(function(options, originalOptions, xhr) {
435 | var token = $('meta[name="csrf-token"]').attr('content');
436 | xhr.setRequestHeader('X-CSRF-Token', token);
437 | });
438 | ```
439 |
440 | ## Note on Patches/Pull Requests
441 |
442 | 1. Fork the project.
443 | 2. Make your feature addition or bug fix.
444 | 3. Add tests for it. This is important so I don't break it in a future version unintentionally.
445 | 4. Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
446 | 5. Send me a pull request. Bonus points for topic branches.
447 |
--------------------------------------------------------------------------------