discourse-ember-rails 0.18.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +341 -0
  4. data/lib/ember-rails.rb +1 -0
  5. data/lib/ember/rails/engine.rb +25 -0
  6. data/lib/ember/rails/version.rb +5 -0
  7. data/lib/ember_rails.rb +96 -0
  8. data/lib/generators/ember/adapter_generator.rb +21 -0
  9. data/lib/generators/ember/bootstrap_generator.rb +76 -0
  10. data/lib/generators/ember/component_generator.rb +28 -0
  11. data/lib/generators/ember/controller_generator.rb +34 -0
  12. data/lib/generators/ember/generator_helpers.rb +58 -0
  13. data/lib/generators/ember/initializer_generator.rb +23 -0
  14. data/lib/generators/ember/install_generator.rb +194 -0
  15. data/lib/generators/ember/instance_initializer_generator.rb +23 -0
  16. data/lib/generators/ember/model_generator.rb +48 -0
  17. data/lib/generators/ember/resource_generator.rb +29 -0
  18. data/lib/generators/ember/resource_override.rb +38 -0
  19. data/lib/generators/ember/route_generator.rb +21 -0
  20. data/lib/generators/ember/service_generator.rb +23 -0
  21. data/lib/generators/ember/template_generator.rb +23 -0
  22. data/lib/generators/ember/view_generator.rb +24 -0
  23. data/lib/generators/templates/adapter.js +5 -0
  24. data/lib/generators/templates/adapter.js.coffee +5 -0
  25. data/lib/generators/templates/adapter.js.em +3 -0
  26. data/lib/generators/templates/app.js +11 -0
  27. data/lib/generators/templates/app.js.coffee +11 -0
  28. data/lib/generators/templates/app.js.em +11 -0
  29. data/lib/generators/templates/application.hbs +3 -0
  30. data/lib/generators/templates/application.js +11 -0
  31. data/lib/generators/templates/application.js.coffee +11 -0
  32. data/lib/generators/templates/application.js.em +10 -0
  33. data/lib/generators/templates/application_adapter.js +5 -0
  34. data/lib/generators/templates/application_adapter.js.coffee +5 -0
  35. data/lib/generators/templates/application_adapter.js.em +3 -0
  36. data/lib/generators/templates/array_controller.js +5 -0
  37. data/lib/generators/templates/array_controller.js.coffee +5 -0
  38. data/lib/generators/templates/array_controller.js.em +3 -0
  39. data/lib/generators/templates/component.js +4 -0
  40. data/lib/generators/templates/component.js.coffee +6 -0
  41. data/lib/generators/templates/component.js.em +6 -0
  42. data/lib/generators/templates/component.template.hbs +2 -0
  43. data/lib/generators/templates/controller.js +5 -0
  44. data/lib/generators/templates/controller.js.coffee +6 -0
  45. data/lib/generators/templates/controller.js.em +3 -0
  46. data/lib/generators/templates/model.js +13 -0
  47. data/lib/generators/templates/model.js.coffee +12 -0
  48. data/lib/generators/templates/model.js.em +12 -0
  49. data/lib/generators/templates/object_controller.js +5 -0
  50. data/lib/generators/templates/object_controller.js.coffee +5 -0
  51. data/lib/generators/templates/object_controller.js.em +3 -0
  52. data/lib/generators/templates/route.js +5 -0
  53. data/lib/generators/templates/route.js.coffee +5 -0
  54. data/lib/generators/templates/route.js.em +3 -0
  55. data/lib/generators/templates/router.js +5 -0
  56. data/lib/generators/templates/router.js.coffee +5 -0
  57. data/lib/generators/templates/router.js.em +5 -0
  58. data/lib/generators/templates/template.hbs +5 -0
  59. data/lib/generators/templates/view.js +5 -0
  60. data/lib/generators/templates/view.js.coffee +4 -0
  61. data/lib/generators/templates/view.js.em +4 -0
  62. metadata +329 -0
@@ -0,0 +1,21 @@
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", :desc => "Custom ember app path"
12
+ class_option :javascript_engine, :desc => "Engine for JavaScripts"
13
+ class_option :app_name, :type => :string, :aliases => "-n", :desc => "Custom ember app name"
14
+
15
+ def create_adapter_files
16
+ file_path = File.join(ember_path, 'adapters', class_path, "#{file_name}_adapter.#{engine_extension}")
17
+ template "adapter.#{engine_extension}", file_path
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,76 @@
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", :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", :desc => "Custom ember app name"
16
+
17
+ def inject_ember
18
+ begin
19
+ inject_into_application_file(engine_extension)
20
+ rescue Exception => e
21
+ inject_into_application_file('js')
22
+ end
23
+ end
24
+
25
+
26
+ def create_dir_layout
27
+ %W{models controllers views routes helpers components templates templates/components mixins adapters}.each do |dir|
28
+ empty_directory "#{ember_path}/#{dir}"
29
+ create_file "#{ember_path}/#{dir}/.gitkeep" unless options[:skip_git]
30
+ end
31
+ end
32
+
33
+ def create_app_file
34
+ template "app.#{engine_extension}", "#{ember_path}/#{application_name.underscore}.#{engine_extension}"
35
+ end
36
+
37
+ def create_router_file
38
+ template "router.#{engine_extension}", "#{ember_path}/router.#{engine_extension}"
39
+ end
40
+
41
+ def create_adapter_file
42
+ template "application_adapter.#{engine_extension}", "#{ember_path}/adapters/application_adapter.#{engine_extension}"
43
+ end
44
+
45
+ private
46
+
47
+ def inject_into_application_file(safe_extension)
48
+ application_file = "application.#{safe_extension}"
49
+ full_path = Pathname.new(destination_root).join(ember_path, application_file)
50
+
51
+ if full_path.exist?
52
+ injection_options = get_options_from_contents(full_path.read)
53
+
54
+ inject_into_file(full_path.to_s, injection_options) do
55
+ context = instance_eval('binding')
56
+ source = File.expand_path(find_in_source_paths(application_file))
57
+ ERB.new(::File.binread(source), nil, '-', '@output_buffer').result(context)
58
+ end
59
+ else
60
+ template application_file, full_path
61
+ end
62
+ end
63
+
64
+ def get_options_from_contents(contents)
65
+ if contents =~ regex = /^.*require_tree.*$/
66
+ {:before => regex}
67
+ elsif contents =~ regex = /^\s*$/
68
+ {:before => regex}
69
+ else
70
+ regex = /\z/
71
+ {:after => regex}
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,28 @@
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", :desc => "Custom ember app path"
14
+ class_option :app_name, :type => :string, :aliases => "-n", :desc => "Custom ember app name"
15
+
16
+ def create_component_files
17
+ dashed_file_name = file_name.gsub(/_/, '-')
18
+ comp_path = File.join(ember_path, 'components', class_path, "#{dashed_file_name}_component.#{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
@@ -0,0 +1,34 @@
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", :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", :desc => "Custom ember app name"
17
+
18
+
19
+ def create_controller_files
20
+ file_path = File.join(ember_path, 'controllers', class_path, "#{file_name}_controller.#{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
@@ -0,0 +1,58 @@
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 ||= "js.#{options[:javascript_engine]}".sub('js.js','js')
49
+ end
50
+
51
+ def configuration
52
+ if defined?(::Rails) && ::Rails.configuration
53
+ ::Rails.configuration.ember
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
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", :desc => "Custom ember app path"
14
+ class_option :app_name, :type => :string, :aliases => "-n", :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
@@ -0,0 +1,194 @@
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}.min.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=<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
+ content = 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
@@ -0,0 +1,23 @@
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", :desc => "Custom ember app path"
14
+ class_option :app_name, :type => :string, :aliases => "-n", :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