redmine_plugin_asset_pipeline 0.0.14 → 0.1.3
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.
- checksums.yaml +4 -4
- data/init.rb +1 -4
- data/lib/redmine_plugin_asset_pipeline.rb +5 -58
- data/lib/redmine_plugin_asset_pipeline/configuration.rb +11 -0
- data/lib/redmine_plugin_asset_pipeline/infectors.rb +5 -0
- data/lib/redmine_plugin_asset_pipeline/infectors/application_helper.rb +99 -0
- data/lib/redmine_plugin_asset_pipeline/infectors/redmine.rb +5 -0
- data/lib/redmine_plugin_asset_pipeline/infectors/redmine/plugin.rb +71 -0
- data/lib/redmine_plugin_asset_pipeline/infectors/redmine/themes.rb +4 -0
- data/lib/redmine_plugin_asset_pipeline/infectors/redmine/themes/theme.rb +7 -0
- data/lib/redmine_plugin_asset_pipeline/plugin.rb +48 -0
- data/lib/redmine_plugin_asset_pipeline/sprockets_processor.rb +22 -24
- data/lib/redmine_plugin_asset_pipeline/version.rb +1 -1
- data/redmine_plugin_asset_pipeline.gemspec +10 -8
- metadata +38 -4
- data/lib/redmine_plugin_asset_pipeline/application_helper_patch.rb +0 -173
- data/lib/redmine_plugin_asset_pipeline/plugin_patch.rb +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecf025bc1015abb4de87d4c96aa488c162fade8d
|
4
|
+
data.tar.gz: 65ccd07b3a8210590bf8c0ba5dc8518cdea2ac76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d3d0b48bbf43b86ed380454003f610da575dd8d0edd3827d4b768e7d613f4c16a1dd593e09a27f0ae779c88941a8e125cb70d5ae92698e702312662f193e861
|
7
|
+
data.tar.gz: 57862b10a64a8bb5350899a3c7688c89fd21ec50f29ac4dd562a78e9be4161c25415a1f10172cf9d1396ecd421b823bc976b942d6606fc2ce584915fd7427dc9
|
data/init.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
require 'redmine'
|
2
|
-
require 'redmine_plugin_asset_pipeline/version'
|
3
|
-
|
4
1
|
Redmine::Plugin.register :redmine_plugin_asset_pipeline do
|
5
2
|
name 'Redmine Plugin Asset Pipeline plugin'
|
6
3
|
description 'This plugin adds asset pipeline support for redmine plugins'
|
7
4
|
url 'https://github.com/Tab10id/redmine_plugin_asset_pipeline'
|
8
5
|
version RedminePluginAssetPipeline::VERSION
|
9
|
-
requires_redmine :
|
6
|
+
requires_redmine version_or_higher: '3.0.0'
|
10
7
|
end
|
@@ -1,17 +1,11 @@
|
|
1
1
|
require 'redmine_plugin_asset_pipeline/version'
|
2
|
+
require 'redmine_plugin_asset_pipeline/plugin'
|
2
3
|
|
3
4
|
module RedminePluginAssetPipeline
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@use_ln = false
|
9
|
-
end
|
10
|
-
|
11
|
-
def [](value)
|
12
|
-
self.public_send(value)
|
13
|
-
end
|
14
|
-
end
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
autoload :Configuration
|
7
|
+
autoload :Infectors
|
8
|
+
autoload :Rails
|
15
9
|
|
16
10
|
def self.configure
|
17
11
|
self.config ||= Configuration.new
|
@@ -22,53 +16,6 @@ module RedminePluginAssetPipeline
|
|
22
16
|
@config
|
23
17
|
end
|
24
18
|
|
25
|
-
# Run the classic redmine plugin initializer after rails boot
|
26
|
-
class Plugin < ::Rails::Engine
|
27
|
-
config.after_initialize do
|
28
|
-
require File.expand_path('../../init', __FILE__)
|
29
|
-
end
|
30
|
-
|
31
|
-
#asset pipeline configuration
|
32
|
-
#enable asset pipeline before sprockets boots
|
33
|
-
initializer 'redmine.asset_pipeline', before: 'sprockets.environment' do
|
34
|
-
RedmineApp::Application.configure do
|
35
|
-
config.assets.paths << "#{config.root}/private/plugin_assets"
|
36
|
-
config.assets.precompile += %w(*/stylesheets/*.css */javascripts/*.js)
|
37
|
-
# Custom settings. Edit configs of your application
|
38
|
-
# See: http://guides.rubyonrails.org/asset_pipeline.html
|
39
|
-
#
|
40
|
-
# Redmine save all assets in root of public =(
|
41
|
-
# If you need to change that value
|
42
|
-
# manually move assets in public directory and edit it
|
43
|
-
# config.assets.prefix = ''
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
#add all plugin directories in case some js/css/images are included directly or via relative css
|
48
|
-
#it also avoids Sprocket's FileOutsidePaths errors
|
49
|
-
# config.assets.paths += Dir.glob("#{config.root}/plugins/*/assets")
|
50
|
-
#add our directory
|
51
|
-
# config.assets.paths += Dir.glob("#{File.dirname(__FILE__)}/assets")
|
52
|
-
#compression
|
53
|
-
# config.assets.compress = true
|
54
|
-
# config.assets.css_compressor = :yui
|
55
|
-
# config.assets.js_compressor = :yui
|
56
|
-
|
57
|
-
# Register our processor (subclass of the standard one which adds a directive for redmine plugins)
|
58
|
-
initializer 'redmine.sprockets_processor', after: 'sprockets.environment' do
|
59
|
-
require 'redmine_plugin_asset_pipeline/sprockets_processor'
|
60
|
-
env = RedmineApp::Application.assets
|
61
|
-
env.unregister_preprocessor('text/css', Sprockets::DirectiveProcessor)
|
62
|
-
env.unregister_preprocessor('application/javascript', Sprockets::DirectiveProcessor)
|
63
|
-
env.register_preprocessor('text/css', RedminePluginAssetPipeline::SprocketsProcessor)
|
64
|
-
env.register_preprocessor('application/javascript', RedminePluginAssetPipeline::SprocketsProcessor)
|
65
|
-
end
|
66
|
-
|
67
|
-
config.to_prepare do
|
68
|
-
require_dependency 'redmine_plugin_asset_pipeline/application_helper_patch'
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
19
|
private
|
73
20
|
|
74
21
|
def self.config=(value)
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module RedminePluginAssetPipeline::Infectors::ApplicationHelper
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
def stylesheet_link_tag(*sources)
|
6
|
+
options = sources.last.is_a?(Hash) ? sources.pop : {}
|
7
|
+
plugin = options.delete(:plugin)
|
8
|
+
sources = sources.map do |source|
|
9
|
+
if plugin
|
10
|
+
"#{plugin}/stylesheets/#{source}"
|
11
|
+
elsif current_theme && current_theme.stylesheets.include?(source)
|
12
|
+
current_theme.stylesheet_path(source)
|
13
|
+
else
|
14
|
+
# @note: assets from gems
|
15
|
+
[source, "stylesheets/#{source}"].find do |s|
|
16
|
+
asset_digest_path("#{s}#{compute_asset_extname(s, type: :stylesheet)}").present?
|
17
|
+
end || source
|
18
|
+
end
|
19
|
+
end
|
20
|
+
sprockets_helper_context.stylesheet_link_tag(*sources, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def javascript_include_tag(*sources)
|
24
|
+
options = sources.last.is_a?(Hash) ? sources.pop : {}
|
25
|
+
plugin = options.delete(:plugin)
|
26
|
+
sources = sources.map do |source|
|
27
|
+
if plugin
|
28
|
+
"#{plugin}/javascripts/#{source}"
|
29
|
+
else
|
30
|
+
# @note: assets from gems
|
31
|
+
[source, "javascripts/#{source}"].find do |s|
|
32
|
+
asset_digest_path("#{s}#{compute_asset_extname(s, type: :javascript)}").present?
|
33
|
+
end || source
|
34
|
+
end
|
35
|
+
end
|
36
|
+
sprockets_helper_context.javascript_include_tag(*sources, options)
|
37
|
+
end
|
38
|
+
|
39
|
+
def image_tag(source, options={})
|
40
|
+
plugin = options.delete(:plugin)
|
41
|
+
if plugin
|
42
|
+
source = "#{plugin}/images/#{source}"
|
43
|
+
elsif current_theme && current_theme.images.include?(source)
|
44
|
+
source = current_theme.image_path(source)
|
45
|
+
else
|
46
|
+
source = [source, "images/#{source}"].find{ |s| asset_digest_path(s).present? } || source
|
47
|
+
end
|
48
|
+
sprockets_helper_context.image_tag(source, options)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Only one fix - remove leading slash in path_to_image
|
52
|
+
def include_calendar_headers_tags
|
53
|
+
unless @calendar_headers_tags_included
|
54
|
+
tags = ''.html_safe
|
55
|
+
@calendar_headers_tags_included = true
|
56
|
+
content_for :header_tags do
|
57
|
+
start_of_week = Setting.start_of_week
|
58
|
+
start_of_week = l(:general_first_day_of_week, :default => '1') if start_of_week.blank?
|
59
|
+
# Redmine uses 1..7 (monday..sunday) in settings and locales
|
60
|
+
# JQuery uses 0..6 (sunday..saturday), 7 needs to be changed to 0
|
61
|
+
start_of_week = start_of_week.to_i % 7
|
62
|
+
tags << javascript_tag(
|
63
|
+
"var datepickerOptions={dateFormat: 'yy-mm-dd', firstDay: #{start_of_week}, " +
|
64
|
+
"showOn: 'button', buttonImageOnly: true, buttonImage: '" +
|
65
|
+
path_to_image('images/calendar.png') +
|
66
|
+
"', showButtonPanel: true, showWeek: true, showOtherMonths: true, " +
|
67
|
+
"selectOtherMonths: true, changeMonth: true, changeYear: true, " +
|
68
|
+
"beforeShow: beforeShowDatePicker};")
|
69
|
+
jquery_locale = l('jquery.locale', :default => current_language.to_s)
|
70
|
+
unless jquery_locale == 'en'
|
71
|
+
tags << javascript_include_tag("i18n/datepicker-#{jquery_locale}.js")
|
72
|
+
end
|
73
|
+
tags
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def sprockets_helper_context
|
79
|
+
@context ||= Class.new do
|
80
|
+
include Sprockets::Rails::Helper
|
81
|
+
# Copy relevant config to AV context
|
82
|
+
app = Rails.application
|
83
|
+
config = app.config
|
84
|
+
self.debug_assets = config.assets.debug
|
85
|
+
self.digest_assets = config.assets.digest
|
86
|
+
self.assets_prefix = config.assets.prefix
|
87
|
+
|
88
|
+
# Copy over to Sprockets as well
|
89
|
+
context = app.assets.context_class
|
90
|
+
context.assets_prefix = config.assets.prefix
|
91
|
+
context.digest_assets = config.assets.digest
|
92
|
+
context.config = config.action_controller
|
93
|
+
|
94
|
+
self.assets_environment = app.assets if config.assets.compile
|
95
|
+
self.assets_manifest = app.assets_manifest
|
96
|
+
end.new
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Patch for copy plugin assets sources to private directory
|
2
|
+
module RedminePluginAssetPipeline::Infectors::Redmine::Plugin
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
alias_method :mirror_assets_to_public, :mirror_assets
|
7
|
+
alias_method :mirror_assets, :mirror_assets_to_private
|
8
|
+
|
9
|
+
class << self
|
10
|
+
cattr_accessor :private_directory_base
|
11
|
+
self.private_directory_base = File.join(Rails.root, 'private', 'plugin_assets')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def private_directory
|
16
|
+
File.join(self.class.private_directory_base, id.to_s)
|
17
|
+
end
|
18
|
+
|
19
|
+
def mirror_assets_to_private
|
20
|
+
source = assets_directory
|
21
|
+
destination = private_directory
|
22
|
+
|
23
|
+
unless File.exist?(self.class.private_directory_base)
|
24
|
+
FileUtils.mkdir_p(self.class.private_directory_base)
|
25
|
+
end
|
26
|
+
|
27
|
+
if File.exist?(destination)
|
28
|
+
FileUtils.rm_rf(destination)
|
29
|
+
end
|
30
|
+
return unless File.directory?(source)
|
31
|
+
|
32
|
+
if RedminePluginAssetPipeline.config.use_ln
|
33
|
+
if File.exist?(source)
|
34
|
+
FileUtils.ln_s(source, destination)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
source_files = Dir[source + '/**/*']
|
38
|
+
source_dirs = source_files.select { |d| File.directory?(d) }
|
39
|
+
source_files -= source_dirs
|
40
|
+
unless source_files.empty?
|
41
|
+
base_target_dir = File.join(destination, File.dirname(source_files.first).gsub(source, ''))
|
42
|
+
begin
|
43
|
+
FileUtils.mkdir_p(base_target_dir)
|
44
|
+
rescue Exception => e
|
45
|
+
raise "Could not create directory #{base_target_dir}: " + e.message
|
46
|
+
end
|
47
|
+
end
|
48
|
+
source_dirs.each do |dir|
|
49
|
+
# strip down these paths so we have simple, relative paths we can
|
50
|
+
# add to the destination
|
51
|
+
target_dir = File.join(destination, dir.gsub(source, ''))
|
52
|
+
begin
|
53
|
+
FileUtils.mkdir_p(target_dir)
|
54
|
+
rescue Exception => e
|
55
|
+
raise "Could not create directory #{target_dir}: " + e.message
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
source_files.each do |file|
|
60
|
+
begin
|
61
|
+
target = File.join(destination, file.gsub(source, ''))
|
62
|
+
unless File.exist?(target) && FileUtils.identical?(file, target)
|
63
|
+
FileUtils.cp(file, target)
|
64
|
+
end
|
65
|
+
rescue Exception => e
|
66
|
+
raise "Could not copy #{file} to #{target}: " + e.message
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class RedminePluginAssetPipeline::Plugin < ::Rails::Engine
|
2
|
+
config.after_initialize do
|
3
|
+
require File.expand_path('../../../init', __FILE__)
|
4
|
+
end
|
5
|
+
|
6
|
+
#asset pipeline configuration
|
7
|
+
#enable asset pipeline before sprockets boots
|
8
|
+
initializer 'redmine.asset_pipeline', before: 'sprockets.environment' do
|
9
|
+
RedmineApp::Application.configure do
|
10
|
+
config.assets.paths << "#{config.root}/private/plugin_assets"
|
11
|
+
config.assets.precompile += %w(*/stylesheets/*.css */javascripts/*.js */images/* */fonts/*)
|
12
|
+
# Custom settings. Edit configs of your application
|
13
|
+
# See: http://guides.rubyonrails.org/asset_pipeline.html
|
14
|
+
#
|
15
|
+
# Redmine save all assets in root of public =(
|
16
|
+
# If you need to change that value
|
17
|
+
# manually move assets in public directory and edit it
|
18
|
+
# config.assets.prefix = ''
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
#add all plugin directories in case some js/css/images are included directly or via relative css
|
23
|
+
#it also avoids Sprocket's FileOutsidePaths errors
|
24
|
+
# config.assets.paths += Dir.glob("#{config.root}/plugins/*/assets")
|
25
|
+
#add our directory
|
26
|
+
# config.assets.paths += Dir.glob("#{File.dirname(__FILE__)}/assets")
|
27
|
+
#compression
|
28
|
+
# config.assets.compress = true
|
29
|
+
# config.assets.css_compressor = :yui
|
30
|
+
# config.assets.js_compressor = :yui
|
31
|
+
|
32
|
+
# Register our processor (subclass of the standard one which adds a directive for redmine plugins)
|
33
|
+
initializer 'redmine.sprockets_processor', after: 'sprockets.environment' do
|
34
|
+
require 'redmine_plugin_asset_pipeline/sprockets_processor'
|
35
|
+
env = RedmineApp::Application.assets
|
36
|
+
env.unregister_preprocessor('text/css', Sprockets::DirectiveProcessor)
|
37
|
+
env.unregister_preprocessor('application/javascript', Sprockets::DirectiveProcessor)
|
38
|
+
env.register_preprocessor('text/css', RedminePluginAssetPipeline::SprocketsProcessor)
|
39
|
+
env.register_preprocessor('application/javascript', RedminePluginAssetPipeline::SprocketsProcessor)
|
40
|
+
end
|
41
|
+
|
42
|
+
config.to_prepare do
|
43
|
+
require_dependency 'application_helper'
|
44
|
+
unless ApplicationHelper.included_modules.include? RedminePluginAssetPipeline::Infectors::ApplicationHelper
|
45
|
+
ApplicationHelper.send(:include, RedminePluginAssetPipeline::Infectors::ApplicationHelper)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,28 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# end
|
1
|
+
class RedminePluginAssetPipeline::SprocketsProcessor < Sprockets::DirectiveProcessor
|
2
|
+
# This processor subclasses the standard Sprockets::DirectiveProcessor
|
3
|
+
# as advised in Sprockets, to add a new directive called
|
4
|
+
# "require_redmine_plugins". This directive is relative to the
|
5
|
+
# #{Rails.root}/plugins/ directory and accepts wildcards.
|
6
|
+
#
|
7
|
+
# For convenience, it also replaces "ALL" by a star ("*") before
|
8
|
+
# evaluating the globing. Otherwise, "*/" is interpreted as the end of
|
9
|
+
# the comment in CSS files, which is obviously problematic.
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# For the record, here's the example custom require provided in sprockets:
|
13
|
+
#
|
14
|
+
# def process_require_glob_directive
|
15
|
+
# Dir["#{pathname.dirname}/#{glob}"].sort.each do |filename|
|
16
|
+
# require(filename)
|
17
|
+
# end
|
18
|
+
# end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
20
|
+
def process_require_redmine_plugins_directive(type, prefix='')
|
21
|
+
mask = Rails.root.join(Redmine::Plugin.private_directory_base, "*/#{type}/#{prefix}_common_part*").expand_path
|
22
|
+
Dir.glob(mask).sort.each do |entry|
|
23
|
+
context.require_asset(pathname.dirname.join(entry).expand_path)
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -4,20 +4,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'redmine_plugin_asset_pipeline/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'redmine_plugin_asset_pipeline'
|
8
8
|
spec.version = RedminePluginAssetPipeline::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Tab10id']
|
10
|
+
spec.email = ['tabloidmeister@gmail.com']
|
11
11
|
spec.description = %q{Asset pipeline for Redmine}
|
12
12
|
spec.summary = %q{Asset pipeline for Redmine}
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
13
|
+
spec.homepage = 'https://github.com/Tab10id/redmine_plugin_asset_pipeline'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.
|
22
|
-
spec.
|
21
|
+
spec.add_dependency 'actionview', '>= 4.0'
|
22
|
+
spec.add_dependency 'sprockets', '>= 2.0'
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
|
+
spec.add_development_dependency 'rake'
|
23
25
|
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_plugin_asset_pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tab10id
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: actionview
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sprockets
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,8 +82,14 @@ files:
|
|
54
82
|
- lib/generators/redmine_pipeline/private_assets_initializer/private_assets_initializer_generator.rb
|
55
83
|
- lib/generators/redmine_pipeline/private_assets_initializer/templates/35-patch_assets_mirror.rb
|
56
84
|
- lib/redmine_plugin_asset_pipeline.rb
|
57
|
-
- lib/redmine_plugin_asset_pipeline/
|
58
|
-
- lib/redmine_plugin_asset_pipeline/
|
85
|
+
- lib/redmine_plugin_asset_pipeline/configuration.rb
|
86
|
+
- lib/redmine_plugin_asset_pipeline/infectors.rb
|
87
|
+
- lib/redmine_plugin_asset_pipeline/infectors/application_helper.rb
|
88
|
+
- lib/redmine_plugin_asset_pipeline/infectors/redmine.rb
|
89
|
+
- lib/redmine_plugin_asset_pipeline/infectors/redmine/plugin.rb
|
90
|
+
- lib/redmine_plugin_asset_pipeline/infectors/redmine/themes.rb
|
91
|
+
- lib/redmine_plugin_asset_pipeline/infectors/redmine/themes/theme.rb
|
92
|
+
- lib/redmine_plugin_asset_pipeline/plugin.rb
|
59
93
|
- lib/redmine_plugin_asset_pipeline/sprockets_processor.rb
|
60
94
|
- lib/redmine_plugin_asset_pipeline/version.rb
|
61
95
|
- redmine_plugin_asset_pipeline.gemspec
|
@@ -1,173 +0,0 @@
|
|
1
|
-
require_dependency 'application_helper'
|
2
|
-
|
3
|
-
module ApplicationHelper
|
4
|
-
def stylesheet_link_tag(*sources)
|
5
|
-
options = sources.extract_options!
|
6
|
-
plugin = options.delete(:plugin)
|
7
|
-
debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
|
8
|
-
body = options.key?(:body) ? options.delete(:body) : false
|
9
|
-
digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
|
10
|
-
sources.map! do |source|
|
11
|
-
if plugin
|
12
|
-
"#{plugin}/stylesheets/#{source}"
|
13
|
-
elsif current_theme && current_theme.stylesheets.include?(source)
|
14
|
-
current_theme.stylesheet_path(source)
|
15
|
-
else
|
16
|
-
# NOTE: bugfix aka crutch for asset from gem
|
17
|
-
["stylesheets/#{source}", source].
|
18
|
-
find{|s| asset_for(s, 'css').present?} || "stylesheets/#{source}"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
sources.collect do |source|
|
22
|
-
asset = asset_for(source, 'css')
|
23
|
-
if debug && asset
|
24
|
-
asset.to_a.map do |dep|
|
25
|
-
single_asset_path = asset_path(dep, ext: 'css',
|
26
|
-
body: true,
|
27
|
-
protocol: :request,
|
28
|
-
digest: digest)
|
29
|
-
# TODO: here we must try to make more pretty solution
|
30
|
-
next if single_asset_path.blank?
|
31
|
-
super(dep.pathname.to_s, { href: single_asset_path }.merge!(options))
|
32
|
-
end.compact
|
33
|
-
else
|
34
|
-
single_asset_path = asset_path(source, ext: 'css',
|
35
|
-
body: body,
|
36
|
-
protocol: :request,
|
37
|
-
digest: digest)
|
38
|
-
# TODO: here we must try to make more pretty solution
|
39
|
-
next if single_asset_path.blank?
|
40
|
-
super(source.to_s, { href: single_asset_path }.merge!(options))
|
41
|
-
end
|
42
|
-
end.compact.uniq.join("\n").html_safe
|
43
|
-
end
|
44
|
-
|
45
|
-
def javascript_include_tag(*sources)
|
46
|
-
options = sources.last.is_a?(Hash) ? sources.pop : {}
|
47
|
-
plugin = options.delete(:plugin)
|
48
|
-
debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
|
49
|
-
body = options.key?(:body) ? options.delete(:body) : false
|
50
|
-
digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
|
51
|
-
sources.map! do |source|
|
52
|
-
if plugin
|
53
|
-
"#{plugin}/javascripts/#{source}"
|
54
|
-
else
|
55
|
-
# NOTE: bugfix aka crutch for asset from gem
|
56
|
-
["javascripts/#{source}", source].
|
57
|
-
find{|s| asset_for(s, 'js').present?} || "javascripts/#{source}"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
sources.collect do |source|
|
61
|
-
asset = asset_for(source, 'js')
|
62
|
-
if debug && asset
|
63
|
-
asset.to_a.map do |dep|
|
64
|
-
single_asset_path = asset_path(dep, ext: 'js',
|
65
|
-
body: true,
|
66
|
-
digest: digest)
|
67
|
-
# TODO: here we must try to make more pretty solution
|
68
|
-
next if single_asset_path.blank?
|
69
|
-
super(dep.pathname.to_s, { src: single_asset_path }.merge!(options))
|
70
|
-
end.compact
|
71
|
-
else
|
72
|
-
single_asset_path = asset_path(source, ext: 'js',
|
73
|
-
body: body,
|
74
|
-
digest: digest)
|
75
|
-
# TODO: here we must try to make more pretty solution
|
76
|
-
next if single_asset_path.blank?
|
77
|
-
super(source.to_s, { src: single_asset_path }.merge!(options))
|
78
|
-
end
|
79
|
-
end.compact.uniq.join("\n").html_safe
|
80
|
-
end
|
81
|
-
|
82
|
-
def image_tag(source, options={})
|
83
|
-
if plugin = options.delete(:plugin)
|
84
|
-
source = "#{plugin}/images/#{source}"
|
85
|
-
elsif current_theme && current_theme.images.include?(source)
|
86
|
-
source = current_theme.image_path(source)
|
87
|
-
elsif source[0] != '/'
|
88
|
-
source = "images/#{source}"
|
89
|
-
end
|
90
|
-
super source, options
|
91
|
-
end
|
92
|
-
|
93
|
-
def include_calendar_headers_tags
|
94
|
-
unless @calendar_headers_tags_included
|
95
|
-
@calendar_headers_tags_included = true
|
96
|
-
content_for :header_tags do
|
97
|
-
start_of_week = Setting.start_of_week
|
98
|
-
start_of_week = l(:general_first_day_of_week, default: '1') if start_of_week.blank?
|
99
|
-
# Redmine uses 1..7 (monday..sunday) in settings and locales
|
100
|
-
# JQuery uses 0..6 (sunday..saturday), 7 needs to be changed to 0
|
101
|
-
start_of_week = start_of_week.to_i % 7
|
102
|
-
|
103
|
-
tags = javascript_tag(
|
104
|
-
"var datepickerOptions={dateFormat: 'yy-mm-dd', firstDay: #{start_of_week}, " +
|
105
|
-
"showOn: 'button', buttonImageOnly: true, buttonImage: '" +
|
106
|
-
path_to_image('images/calendar.png') +
|
107
|
-
"', showButtonPanel: true, showWeek: true, showOtherMonths: true, selectOtherMonths: true};")
|
108
|
-
jquery_locale = l('jquery.locale', default: current_language.to_s)
|
109
|
-
unless jquery_locale == 'en'
|
110
|
-
tags << javascript_include_tag("i18n/jquery.ui.datepicker-#{jquery_locale}.js")
|
111
|
-
end
|
112
|
-
tags
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
private
|
118
|
-
|
119
|
-
# copy-paste from Sprocket
|
120
|
-
def debug_assets?
|
121
|
-
compile_assets? && (Rails.application.config.assets.debug || params[:debug_assets])
|
122
|
-
rescue NameError
|
123
|
-
false
|
124
|
-
end
|
125
|
-
|
126
|
-
def compile_assets?
|
127
|
-
Rails.application.config.assets.compile
|
128
|
-
end
|
129
|
-
|
130
|
-
def digest_assets?
|
131
|
-
Rails.application.config.assets.digest
|
132
|
-
end
|
133
|
-
|
134
|
-
def asset_path(source, options = {})
|
135
|
-
source = source.logical_path if source.respond_to?(:logical_path)
|
136
|
-
path = asset_paths.compute_public_path(source, assets_prefix, options.merge(body: true))
|
137
|
-
options[:body] ? "#{path}?body=1" : path
|
138
|
-
end
|
139
|
-
|
140
|
-
def assets_prefix
|
141
|
-
Rails.application.config.assets.prefix.gsub(/^\//, '')
|
142
|
-
end
|
143
|
-
|
144
|
-
def asset_for(source, ext)
|
145
|
-
source = source.to_s
|
146
|
-
return nil if asset_paths.is_uri?(source)
|
147
|
-
source = rewrite_extension(source, ext)
|
148
|
-
Rails.application.assets[source]
|
149
|
-
rescue Sprockets::FileOutsidePaths
|
150
|
-
nil
|
151
|
-
end
|
152
|
-
|
153
|
-
def rewrite_extension(source, ext)
|
154
|
-
source_ext = File.extname(source)[1..-1]
|
155
|
-
|
156
|
-
if !ext || ext == source_ext
|
157
|
-
source
|
158
|
-
elsif source_ext.blank?
|
159
|
-
"#{source}.#{ext}"
|
160
|
-
elsif File.exists?(source) || exact_match_present?(source)
|
161
|
-
source
|
162
|
-
else
|
163
|
-
"#{source}.#{ext}"
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def exact_match_present?(source)
|
168
|
-
pathname = Rails.application.assets.resolve(source)
|
169
|
-
pathname.to_s =~ /#{Regexp.escape(source)}\Z/
|
170
|
-
rescue Sprockets::FileNotFound
|
171
|
-
false
|
172
|
-
end
|
173
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# Patch for copy plugin assets sources to private directory
|
2
|
-
module RedminePluginAssetPipeline
|
3
|
-
module PluginPatch
|
4
|
-
def self.included(base)
|
5
|
-
|
6
|
-
base.extend(ClassMethods)
|
7
|
-
base.send(:include, InstanceMethods)
|
8
|
-
|
9
|
-
base.class_eval do
|
10
|
-
class << self
|
11
|
-
cattr_accessor :private_directory
|
12
|
-
self.private_directory = File.join(Rails.root, 'private', 'plugin_assets')
|
13
|
-
end
|
14
|
-
|
15
|
-
alias_method :mirror_assets_to_public, :mirror_assets
|
16
|
-
alias_method :mirror_assets, :mirror_assets_to_private
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
module ClassMethods
|
21
|
-
end
|
22
|
-
|
23
|
-
module InstanceMethods
|
24
|
-
def private_directory
|
25
|
-
File.join(self.class.private_directory, id.to_s)
|
26
|
-
end
|
27
|
-
|
28
|
-
def mirror_assets_to_private
|
29
|
-
source = assets_directory
|
30
|
-
destination = private_directory
|
31
|
-
|
32
|
-
unless File.exist?(self.class.private_directory)
|
33
|
-
FileUtils.mkdir_p(self.class.private_directory)
|
34
|
-
end
|
35
|
-
|
36
|
-
if File.exist?(destination)
|
37
|
-
FileUtils.rm_rf(destination)
|
38
|
-
end
|
39
|
-
return unless File.directory?(source)
|
40
|
-
|
41
|
-
if RedminePluginAssetPipeline.config.use_ln
|
42
|
-
if File.exist?(source)
|
43
|
-
FileUtils.ln_s(source, destination)
|
44
|
-
end
|
45
|
-
else
|
46
|
-
source_files = Dir[source + "/**/*"]
|
47
|
-
source_dirs = source_files.select { |d| File.directory?(d) }
|
48
|
-
source_files -= source_dirs
|
49
|
-
unless source_files.empty?
|
50
|
-
base_target_dir = File.join(destination, File.dirname(source_files.first).gsub(source, ''))
|
51
|
-
begin
|
52
|
-
FileUtils.mkdir_p(base_target_dir)
|
53
|
-
rescue Exception => e
|
54
|
-
raise "Could not create directory #{base_target_dir}: " + e.message
|
55
|
-
end
|
56
|
-
end
|
57
|
-
source_dirs.each do |dir|
|
58
|
-
# strip down these paths so we have simple, relative paths we can
|
59
|
-
# add to the destination
|
60
|
-
target_dir = File.join(destination, dir.gsub(source, ''))
|
61
|
-
begin
|
62
|
-
FileUtils.mkdir_p(target_dir)
|
63
|
-
rescue Exception => e
|
64
|
-
raise "Could not create directory #{target_dir}: " + e.message
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
source_files.each do |file|
|
69
|
-
begin
|
70
|
-
target = File.join(destination, file.gsub(source, ''))
|
71
|
-
unless File.exist?(target) && FileUtils.identical?(file, target)
|
72
|
-
FileUtils.cp(file, target)
|
73
|
-
end
|
74
|
-
rescue Exception => e
|
75
|
-
raise "Could not copy #{file} to #{target}: " + e.message
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|