lib/ember-cli/app.rb in ember-cli-rails-0.0.9 vs lib/ember-cli/app.rb in ember-cli-rails-0.0.10

- old
+ new

@@ -1,7 +1,12 @@ +require "timeout" + module EmberCLI class App + ADDON_VERSION = "0.0.3" + EMBER_CLI_VERSION = "~> 0.1.3" + attr_reader :name, :options, :pid def initialize(name, options={}) @name, @options = name.to_s, options end @@ -30,24 +35,96 @@ def exposed_css_assets %W[#{name}/vendor #{name}/#{ember_app_name}] end + def wait + Timeout.timeout(build_timeout) do + sleep 0.1 while lockfile.exist? + end + rescue Timeout::Error + suggested_timeout = build_timeout + 5 + + warn <<-MSG.strip_heredoc + ============================= WARNING! ============================= + + Seems like Ember #{name} application takes more than #{build_timeout} + seconds to compile. + + To prevent race conditions consider adjusting build timeout + configuration in your ember initializer: + + EmberCLI.configure do |config| + config.build_timeout = #{suggested_timeout} # in seconds + end + + Alternatively, you can set build timeout per application like this: + + EmberCLI.configure do |config| + config.app :#{name}, build_timeout: #{suggested_timeout} + end + + ============================= WARNING! ============================= + MSG + end + private delegate :ember_path, to: :configuration delegate :tee_path, to: :configuration delegate :configuration, to: :EmberCLI + def build_timeout + options.fetch(:build_timeout){ configuration.build_timeout } + end + + def lockfile + tmp_path.join("build.lock") + end + def prepare @prepared ||= begin + check_addon! + check_ember_cli_version! + FileUtils.touch lockfile symlink_to_assets_root add_assets_to_precompile_list true end end + def check_ember_cli_version! + version = dev_dependencies.fetch("ember-cli").split("-").first + version = Gem::Version.new(version) + requirement = Gem::Requirement.new(EMBER_CLI_VERSION) + + unless requirement.satisfied_by?(version) + fail <<-MSG.strip_heredoc + EmberCLI Rails require ember-cli NPM package version to be + #{requirement} to work properly. Please update your package.json + accordingly and run: + + $ npm install + + MSG + end + end + + def check_addon! + unless dev_dependencies["ember-cli-rails-addon"] == ADDON_VERSION + fail <<-MSG.strip_heredoc + EmberCLI Rails requires your Ember app to have an addon. + + Please run: + + $ npm install --save-dev ember-cli-rails-addon@#{ADDON_VERSION}` + + in you Ember application root: #{app_path} + MSG + end + end + def symlink_to_assets_root symlink_path = dist_path.join("assets") assets_path.join(name).make_symlink symlink_path unless symlink_path.exist? end @@ -63,22 +140,28 @@ def log_pipe "| #{tee_path} -a #{log_path}" if tee_path end def ember_app_name - @ember_app_name ||= options.fetch(:name) do - JSON.parse(app_path.join("package.json").read).fetch("name") - end + @ember_app_name ||= options.fetch(:name){ package_json.fetch(:name) } end def app_path @app_path ||= begin path = options.fetch(:path){ Rails.root.join("app", name) } Pathname.new(path) end end + def tmp_path + @tmp_path ||= begin + path = app_path.join("tmp") + path.mkdir unless path.exist? + path + end + end + def log_path Rails.root.join("log", "ember-#{name}.#{Rails.env}.log") end def dist_path @@ -89,8 +172,16 @@ @assets_path ||= EmberCLI.root.join("assets").tap(&:mkpath) end def environment Helpers.non_production?? "development" : "production" + end + + def package_json + @package_json ||= JSON.parse(app_path.join("package.json").read).with_indifferent_access + end + + def dev_dependencies + package_json.fetch("devDependencies", {}) end end end