view_assets 0.0.1

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 (82) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +59 -0
  4. data/lib/tasks/view_assets_tasks.rake +22 -0
  5. data/lib/view_assets.rb +35 -0
  6. data/lib/view_assets/assets_finder.rb +232 -0
  7. data/lib/view_assets/css_assets.rb +21 -0
  8. data/lib/view_assets/directives.rb +108 -0
  9. data/lib/view_assets/error.rb +6 -0
  10. data/lib/view_assets/js_assets.rb +21 -0
  11. data/lib/view_assets/version.rb +3 -0
  12. data/test/dummy/README.rdoc +261 -0
  13. data/test/dummy/Rakefile +7 -0
  14. data/test/dummy/app/assets/javascripts/application.js +15 -0
  15. data/test/dummy/app/assets/javascripts/bar.js +2 -0
  16. data/test/dummy/app/assets/javascripts/foo.js +2 -0
  17. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  18. data/test/dummy/app/assets/stylesheets/bar.css +4 -0
  19. data/test/dummy/app/assets/stylesheets/foo.css +4 -0
  20. data/test/dummy/app/controllers/application_controller.rb +3 -0
  21. data/test/dummy/app/controllers/bar_controller.rb +7 -0
  22. data/test/dummy/app/controllers/foo_controller.rb +7 -0
  23. data/test/dummy/app/helpers/application_helper.rb +3 -0
  24. data/test/dummy/app/helpers/bar_helper.rb +2 -0
  25. data/test/dummy/app/helpers/foo_helper.rb +2 -0
  26. data/test/dummy/app/views/bar/index.html.erb +2 -0
  27. data/test/dummy/app/views/bar/show.html.erb +2 -0
  28. data/test/dummy/app/views/foo/index.html.erb +2 -0
  29. data/test/dummy/app/views/foo/show.html.erb +2 -0
  30. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  31. data/test/dummy/config.ru +4 -0
  32. data/test/dummy/config/application.rb +59 -0
  33. data/test/dummy/config/boot.rb +10 -0
  34. data/test/dummy/config/database.yml +25 -0
  35. data/test/dummy/config/environment.rb +5 -0
  36. data/test/dummy/config/environments/development.rb +40 -0
  37. data/test/dummy/config/environments/production.rb +67 -0
  38. data/test/dummy/config/environments/test.rb +37 -0
  39. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  40. data/test/dummy/config/initializers/inflections.rb +15 -0
  41. data/test/dummy/config/initializers/mime_types.rb +5 -0
  42. data/test/dummy/config/initializers/secret_token.rb +7 -0
  43. data/test/dummy/config/initializers/session_store.rb +8 -0
  44. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  45. data/test/dummy/config/locales/en.yml +5 -0
  46. data/test/dummy/config/routes.rb +66 -0
  47. data/test/dummy/db/development.sqlite3 +0 -0
  48. data/test/dummy/log/development.log +883 -0
  49. data/test/dummy/public/404.html +26 -0
  50. data/test/dummy/public/422.html +26 -0
  51. data/test/dummy/public/500.html +25 -0
  52. data/test/dummy/public/app/javascripts/application.js +2 -0
  53. data/test/dummy/public/app/javascripts/bar/index/index.js +0 -0
  54. data/test/dummy/public/app/javascripts/bar/index/others.js +0 -0
  55. data/test/dummy/public/app/javascripts/bar/show.js +0 -0
  56. data/test/dummy/public/app/javascripts/foo/index/index.js +0 -0
  57. data/test/dummy/public/app/javascripts/foo/index/others.js +0 -0
  58. data/test/dummy/public/app/javascripts/foo/show.js +1 -0
  59. data/test/dummy/public/app/stylesheets/application.css +0 -0
  60. data/test/dummy/public/app/stylesheets/bar/index/index.css +0 -0
  61. data/test/dummy/public/app/stylesheets/bar/index/others.css +0 -0
  62. data/test/dummy/public/app/stylesheets/bar/show.css +0 -0
  63. data/test/dummy/public/app/stylesheets/foo/index/index.css +0 -0
  64. data/test/dummy/public/app/stylesheets/foo/index/others.css +0 -0
  65. data/test/dummy/public/app/stylesheets/foo/show.css +0 -0
  66. data/test/dummy/public/favicon.ico +0 -0
  67. data/test/dummy/public/lib/javascripts/lib1.js +0 -0
  68. data/test/dummy/public/lib/javascripts/lib2.js +0 -0
  69. data/test/dummy/public/lib/stylesheets/lib1.css +0 -0
  70. data/test/dummy/public/lib/stylesheets/lib2.css +0 -0
  71. data/test/dummy/public/vendor/javascripts/vendor1.js +0 -0
  72. data/test/dummy/public/vendor/javascripts/vendor2.js +0 -0
  73. data/test/dummy/public/vendor/stylesheets/vendor1.css +0 -0
  74. data/test/dummy/public/vendor/stylesheets/vendor2.css +0 -0
  75. data/test/dummy/script/rails +6 -0
  76. data/test/dummy/test/functional/bar_controller_test.rb +14 -0
  77. data/test/dummy/test/functional/foo_controller_test.rb +14 -0
  78. data/test/dummy/test/unit/helpers/bar_helper_test.rb +4 -0
  79. data/test/dummy/test/unit/helpers/foo_helper_test.rb +4 -0
  80. data/test/test_helper.rb +15 -0
  81. data/test/view_assets_test.rb +7 -0
  82. metadata +230 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = ViewAssets
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ begin
9
+ require 'rdoc/task'
10
+ rescue LoadError
11
+ require 'rdoc/rdoc'
12
+ require 'rake/rdoctask'
13
+ RDoc::Task = Rake::RDocTask
14
+ end
15
+
16
+ RDoc::Task.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'ViewAssets'
19
+ rdoc.options << '--line-numbers'
20
+ rdoc.rdoc_files.include('README.rdoc')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
23
+
24
+ Bundler::GemHelper.install_tasks
25
+
26
+ require 'rake/testtask'
27
+
28
+ Rake::TestTask.new(:test) do |t|
29
+ t.libs << 'lib'
30
+ t.libs << 'test'
31
+ t.pattern = 'test/**/*_test.rb'
32
+ t.verbose = false
33
+ end
34
+
35
+ task :default => :test
36
+
37
+ task :lines do
38
+ lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
39
+
40
+ FileList["#{ ENV['PWD'] }/**/*.rb"].each do |file_name|
41
+ next if file_name =~ /vendor/
42
+ File.open(file_name, 'r') do |f|
43
+ while line = f.gets
44
+ lines += 1
45
+ next if line =~ /^\s*$/
46
+ next if line =~ /^\s*#/
47
+ codelines += 1
48
+ end
49
+ end
50
+ puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
51
+
52
+ total_lines += lines
53
+ total_codelines += codelines
54
+
55
+ lines, codelines = 0, 0
56
+ end
57
+
58
+ puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
59
+ end
@@ -0,0 +1,22 @@
1
+ # desc "Explaining what the task does"
2
+ # task :view_assets do
3
+ # # Task goes here
4
+ # end
5
+
6
+ # todo make a rake tasks to establish the assets tree in public folder
7
+
8
+ namespace :view_assets do
9
+ desc "Init view_assets framework"
10
+ task :init do
11
+ public_path = "#{ Rails.root }/public"
12
+ %w(vendor lib app).map { |d| %w(javascripts stylesheets).map { |t| "#{public_path}/#{d}/#{t}" } }.flatten.each do |dir|
13
+ FileUtils.mkdir dir
14
+ puts "\t\033[1;32mCreate\033[0m #{dir}"
15
+ if dir.include?('app')
16
+ fn_extension = dir.include?('javascripts') ? 'js' : 'css'
17
+ FileUtils.touch "Create #{dir}/application.#{fn_extension}"
18
+ puts "\t\033[1;32mCreate\033[0m #{dir}/application.#{fn_extension}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ ##
2
+ # TODO documentation
3
+ module ViewAssets
4
+ require 'pathname'
5
+
6
+ require 'view_assets/error'
7
+ require 'view_assets/directives'
8
+ require 'view_assets/assets_finder'
9
+ require 'view_assets/js_assets'
10
+ require 'view_assets/css_assets'
11
+
12
+ ##
13
+ # To verify all assets and throw exception when find out inexistent asset
14
+ # Defaults to turn off. DO NOT use it in production.
15
+ # todo find out how to document constant
16
+ TO_VERIFY = false
17
+
18
+ attr_accessor :js_assets, :css_assets
19
+
20
+ # TODO need a new controller-action configuring interface, try to configure them in helper instead of view files
21
+ def include_assets_with_assets_mvc(controller, action)
22
+ @va_controller = controller
23
+ @va_action = action
24
+
25
+ raw [css_assets.all, js_assets.all].flatten.uniq.join("\n ")
26
+ end
27
+
28
+ def js_assets
29
+ @va_js_assets ||= JavascriptAssets.new(Rails.public_path, @va_controller, @va_action)
30
+ end
31
+
32
+ def css_assets
33
+ @va_css_assets ||= StyleSheetAssets.new(Rails.public_path, @va_controller, @va_action)
34
+ end
35
+ end
@@ -0,0 +1,232 @@
1
+ ##
2
+ # Manifest file is a file that contains some dependency directives on top
3
+ # of it. Finder will parse these directives if existed and include them
4
+ # in the html.
5
+ # Usually, the first manifest file will be application.[js|css] in
6
+ # /app/assets/[javascripts|stylesheets] folder. However, if there is a
7
+ # :controller.[js|css] file existed in /app/assets/:controller folder,
8
+ # then it will replace application as the first manifest file.
9
+ # It will append assets dependency before every action assets.
10
+ # If both application and :controller manifest file are not existed,
11
+ # then the manifest file list will be empty at first.
12
+ module ViewAssets
13
+ ##
14
+ # It's an abstract class.
15
+ class AssetsFinder < Struct.new(:root, :controller_name, :action_name)
16
+
17
+ def initialize(*args)
18
+ @all_assets = []
19
+ @retrieved = false
20
+
21
+ super(*args)
22
+ end
23
+
24
+ # todo try to figure out what really is DUCK TYPING
25
+ # tag method should be overrided by subclass
26
+ # def tag
27
+ # raise UnimplementedError.new "tag method is unimplemented."
28
+ # end
29
+
30
+ ##
31
+ # This method is the ENTRY of assets finder after its initializtion.
32
+ # It returns all asset paths wrapped inside a appropriated html
33
+ # tag(`script` | `link`).
34
+ def all
35
+ all_assets.map { |asset| tag asset } # tag should be realized in a subclass
36
+ end
37
+
38
+ ##
39
+ # get all the asset paths in full path
40
+ # TODO realize this method
41
+ def full
42
+ all_assets.map { |asset| absolutely_pathize(asset) }
43
+ end
44
+
45
+ ##
46
+ # "untagged" means hasn't been wrapped inside a appropriated html tag like
47
+ # `script` or `link`
48
+ def all_assets
49
+ retrieve unless retrieved?
50
+
51
+ verify if TO_VERIFY
52
+
53
+ @all_assets
54
+ end
55
+
56
+ # TODO document
57
+ def retrieve
58
+ @all_assets = controller_assets.concat(action_assets).uniq if @all_assets.empty?
59
+ @retrieved = true
60
+ end
61
+
62
+ # TODO document
63
+ def retrieved?
64
+ @retrieved
65
+ end
66
+
67
+ ##
68
+ # Check out whether all assets is existed or not
69
+ # It is better to be turned off in production
70
+ def verify
71
+ all_assets.each do |asset|
72
+ asset_file = absolutely_pathize(asset)
73
+ raise AssetNotFound.new("File #{ asset } DOEST EXIST") if FileTest.exist?(asset_file)
74
+ end
75
+ end
76
+
77
+ ##
78
+ # The env assets are assets that will be required before action assets.
79
+ # The function of env assets is to allow user to require some assets
80
+ # that would be used throughout the whole application or controller.
81
+ # Like views in rails, assets finder will use application.[js|css] existed
82
+ # in /app/assets/[javascripts|stylesheets] folder if:controller.[js|css]
83
+ # in /app/assets/[javascripts|stylesheets]/:controller is not existed.
84
+ def controller_assets
85
+ return @controller_assets unless @controller_assets.nil?
86
+
87
+ @controller_assets = []
88
+ application_manifest = "#{ root }/#{ app_path }/application.#{ asset_extension }"
89
+ controller_manifest = "#{ root }/#{ app_path }/#{ controller_name }/#{ controller_name }.#{ asset_extension }"
90
+
91
+ manifest = nil
92
+ manifest = application_manifest if FileTest.exist?(application_manifest)
93
+ manifest = controller_manifest if FileTest.exist?(controller_manifest)
94
+
95
+ # TODO add rspec example
96
+ return @controller_assets if manifest.nil?
97
+
98
+ @controller_assets = manifest.nil? ? [] : retrieve_assets_from(manifest)
99
+ @controller_assets << unabsolutely_pathize(manifest)
100
+ end
101
+
102
+ ##
103
+ # If the action assets is only a file, finder will also consider it a
104
+ # manifest file.
105
+ # If the action assets is a foler consisting several asset files, finder will
106
+ # includes all the assets inside this folder. Among these files, a file named
107
+ # index.[js|css] will be taken as manifest file.
108
+ def action_assets
109
+ return @action_assets unless @action_assets.nil?
110
+
111
+ @action_assets = []
112
+ action_path = "#{ root }/#{ app_path }/#{ controller_name }"
113
+ single_action_path = "#{ action_path }/#{ action_name }.#{ asset_extension }"
114
+ indexed_action_path = "#{ action_path }/#{ action_name }/index.#{ asset_extension }"
115
+
116
+ # find files in the conventional directory
117
+ manifest = nil
118
+ manifest = single_action_path if FileTest.exist?(single_action_path)
119
+ manifest = indexed_action_path if FileTest.exist?(indexed_action_path)
120
+
121
+ # TODO add rspec example
122
+ return @action_assets if manifest.nil?
123
+
124
+ @action_assets = manifest.nil? ? [] : retrieve_assets_from(manifest)
125
+ @action_assets << unabsolutely_pathize(manifest)
126
+ end
127
+
128
+ private
129
+
130
+ def retrieve_assets_from(manifest)
131
+ assets = []
132
+ directive = Directive.new(asset_type)
133
+
134
+ Pathname.new(manifest).each_line do |line|
135
+ # break if directive.ending_directive?(l) # TODO add ending_directive support
136
+ next unless directive.legal_directive?(line)
137
+ assets.concat(analyze(*directive.parse(line)))
138
+ end
139
+
140
+ # TODO find another way to realize this instead of using "flatten" method
141
+ assets.flatten
142
+ end
143
+
144
+ def analyze(asset_category, path_params)
145
+ case asset_category
146
+ when 'vendor'
147
+ path_params.map { |pp| retrieve_vendor_assets(pp) }
148
+ when 'lib'
149
+ path_params.map { |pp| retrieve_lib_assets(pp) }
150
+ when 'app'
151
+ path_params.map { |pp| retrieve_app_asset(pp) }
152
+ end
153
+ end
154
+
155
+ def retrieve_app_asset(required_asset)
156
+ asset_path = "#{ app_path }#{ required_asset.match(/^\//) ? '' : "/#{ controller_name }" }"
157
+
158
+ relatively_pathize(asset_path, required_asset.gsub(/^\//, ''))
159
+ end
160
+
161
+ def retrieve_vendor_assets(manifest)
162
+ meta_retrieve(vendor_path, manifest)
163
+ end
164
+
165
+ def retrieve_lib_assets(manifest)
166
+ meta_retrieve(lib_path, manifest)
167
+ end
168
+
169
+ # for lib and vendor assets, finder will assume that it was stored in the
170
+ # root of vendor|lib and the file itself is a manifest file at first. If
171
+ # that isn't the case, finder will try to locate it in
172
+ # vendor|lib/:lib_or_vendor_name and take index.js inside that folder as
173
+ # manifest.
174
+ #
175
+ # NOTE: All assets returned will be "unabsolutely_pathized" here. That
176
+ # means each string of file path does not contain any root path info.
177
+ def meta_retrieve(manifest_path, manifest)
178
+ single_file_lib = absolutely_pathize("#{ manifest_path }/#{ manifest }")
179
+
180
+ manifest_dir = "#{ manifest_path }/#{ manifest }"
181
+ indexing_lib = absolutely_pathize("#{ manifest_dir }/index")
182
+ all_assets_in_manifest_dir = []
183
+
184
+ real_manifest = nil
185
+ if FileTest.exist?(single_file_lib)
186
+ real_manifest = single_file_lib
187
+ else FileTest.exist?(indexing_lib)
188
+ real_manifest = indexing_lib
189
+ all_assets_in_manifest_dir = retrieve_all_from(manifest_dir)
190
+ end
191
+
192
+ retrieve_assets_from(real_manifest).flatten
193
+ .concat(all_assets_in_manifest_dir)
194
+ .concat([unabsolutely_pathize(real_manifest)])
195
+ .uniq
196
+ end
197
+
198
+ # TODO add test for dir should be a relative path
199
+ def retrieve_all_from(dir)
200
+ Dir["#{ root }/#{ dir }/**/*.#{ asset_extension }"].map { |file| unabsolutely_pathize(file) }
201
+ end
202
+
203
+ def relatively_pathize(asset_dir, asset)
204
+ "#{ asset_dir }/#{ asset.match(/\.#{ asset_extension }$/) ? asset : "#{ asset }.js" }"
205
+ end
206
+
207
+ # TODO add tests
208
+ def app_path
209
+ "app/#{ assets_path }"
210
+ end
211
+
212
+ # TODO add tests
213
+ def lib_path
214
+ "lib/#{ assets_path }"
215
+ end
216
+
217
+ # TODO add tests
218
+ def vendor_path
219
+ "vendor/#{ assets_path }"
220
+ end
221
+
222
+ # todo document
223
+ def absolutely_pathize(asset_path)
224
+ "#{ root }/#{ asset_path.match(/\.#{ asset_extension }$/) ? asset_path : "#{ asset_path }.js" }"
225
+ end
226
+
227
+ # todo document
228
+ def unabsolutely_pathize(asset_path)
229
+ asset_path.gsub(/^#{ root }\//, '')
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,21 @@
1
+ module ViewAssets
2
+ # TODO add rspec examples
3
+ class StyleSheetAssets < AssetsFinder
4
+ def assets_path
5
+ # 'assets/javascripts'
6
+ 'stylesheets'
7
+ end
8
+
9
+ def asset_extension
10
+ 'css'
11
+ end
12
+
13
+ def asset_type
14
+ 'stylesheet'
15
+ end
16
+
17
+ def tag(css_href)
18
+ "<link href='#{css_href}' media='screen' rel='stylesheet' />"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,108 @@
1
+ module ViewAssets
2
+ class Directive
3
+ attr_reader :asset_type
4
+ def initialize(asset_type)
5
+ # TODO find out asset_types that can run in both directive.rb and asset_finders
6
+ # raise ConfigurationError.new('asset type should be "js" or "css"') unless %w(css js).include?(asset_type)
7
+ raise ConfigurationError.new('asset type should be "javascript" or "stylesheet"') unless %w(javascript stylesheet).include?(asset_type)
8
+ @asset_type = asset_type
9
+ end
10
+
11
+ # TODO realize this method
12
+ # remember to take different syntax into consideration
13
+ def ending_directive?(primitive_params)
14
+ # primitive_params.match
15
+ end
16
+
17
+ # TODO add docs
18
+ def legal_directive?(primitive_params)
19
+ [vendor_directive, lib_directive, app_directive].any? { |d| d =~ primitive_params }
20
+ end
21
+
22
+ # return root folder and all the path params that have been split
23
+ # TODO this method bellow need refactor
24
+ def parse(primitive_params)
25
+ asset_root = ''
26
+ path_param_str = ''
27
+ path_params = []
28
+ unknown_directive = false
29
+
30
+ # TODO make sure path_param_str will return nil for non-matched result and array for matched result
31
+ # rememer to write tests for this section of codes
32
+ if vendor_directive =~ primitive_params
33
+ asset_root = 'vendor'
34
+ path_param_str = primitive_params.match(vendor_directive)[:path_params]
35
+ elsif lib_directive =~ primitive_params
36
+ asset_root = 'lib'
37
+ path_param_str = primitive_params.match(lib_directive)[:path_params]
38
+ elsif app_directive =~ primitive_params
39
+ asset_root = 'app'
40
+ path_param_str = primitive_params.match(app_directive)[:path_params]
41
+ else
42
+ # TODO remove UnknownDirectiveError or try to find another way to get thing done
43
+ # raise UnknownDirectiveError.new "'#{primitive_params}' is not in legal directive format"
44
+ unknown_directive = true
45
+ end
46
+
47
+ # TODO refactor codes bellow after the above paragraph was refactored
48
+ would_be_path_params = path_param_str.strip.split(/,\s?/)
49
+ # would_be_path_params = [would_be_path_params] if would_be_path_params.kind_of?(String)
50
+ path_params = would_be_path_params unless would_be_path_params.empty?
51
+
52
+ # unknown_directive ? [nil, nil] : [asset_root, path_params.strip.split(/,\s?/)]
53
+ # todo add rspec examples for returning a ['', []] when the primitive_params is illegal
54
+ [asset_root, path_params]
55
+ end
56
+
57
+ # def all_directives
58
+ # /#{tree_directive}|#{file_directive}/
59
+ # end
60
+
61
+ def vendor_directive
62
+ @vendor_directive ||= generate_formula 'require_vendor'
63
+ end
64
+
65
+ def lib_directive
66
+ @lib_directive ||= generate_formula 'require_lib'
67
+ end
68
+
69
+ def app_directive
70
+ @app_directive ||= generate_formula
71
+ end
72
+
73
+ private
74
+ ##
75
+ # for javascript
76
+ # double-slash syntax => "//= require_vendor xxx"
77
+ # space-asterisk syntax => " *= require_vendor xxx"
78
+ # slash-asterisk syntax => "/*= require_vendor xxx */"
79
+ #
80
+ # for stylesheets
81
+ # space-asterisk syntax => " *= require_vendor xxx"
82
+ # slash-asterisk syntax => "/*= require_vendor xxx */"
83
+ #
84
+ # TODO refactor: use reasonable and effective regular expression
85
+ # TODO use "require_app" as app asset directive and make "require" as a relative directive
86
+ def generate_formula(requiring_type = 'require')
87
+ if javascript? asset_type
88
+ %r{
89
+ ^//=\s#{requiring_type}\s(?<path_params>.*)$ # double-slash syntax
90
+ |
91
+ ^\s\*=\s#{requiring_type}\s(?<path_params>.*)$ # space-asterisk syntax
92
+ |
93
+ ^/\*=\s#{requiring_type}\s(?<path_params>.*)\s\*/$ # slash-asterisk syntax
94
+ }x
95
+ else
96
+ %r{
97
+ ^\s\*=\s#{requiring_type}\s(?<path_params>.*)$ # space-asterisk syntax
98
+ |
99
+ ^/\*=\s#{requiring_type}\s(?<path_params>.*)*\s\*/$ # slash-asterisk syntax
100
+ }x
101
+ end
102
+ end
103
+
104
+ def javascript? type
105
+ %w(js javascript javascripts).include? type
106
+ end
107
+ end
108
+ end