├── 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 [![Build Status](https://secure.travis-ci.org/emberjs/ember-rails.svg?branch=master)](http://travis-ci.org/emberjs/ember-rails) [![Dependency Status](https://gemnasium.com/emberjs/ember-rails.png)](https://gemnasium.com/emberjs/ember-rails) [![Code Climate](https://codeclimate.com/github/emberjs/ember-rails/badges/gpa.svg)](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 | --------------------------------------------------------------------------------