redmine_extensions 0.2.5 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 002eb7a53213f9d31059a1c7bcc099463893c3b4
4
- data.tar.gz: 3e26d2836b750e51d43361822f6c2f9da2453e5a
3
+ metadata.gz: 4f421201ad531afbd5de4df6dbaabcdb76a0118d
4
+ data.tar.gz: f8590c69aeb9812efdfe110682fff9f91d9ba900
5
5
  SHA512:
6
- metadata.gz: c04c0b3b80337845436b639be277afba66b7322613f57973cccfe58fd640de034c3cad54120de67237967f1455873990667a7604ec894a901f951dda4a94a6eb
7
- data.tar.gz: 642bf45996d775e20dad82f5c56fbb4d1e6f5252ec371a8a6104e8e3138a7ebd03948c8ccc0df21f5eec52527326b1993e4b742a81b343d1a25777b3fbce94cf
6
+ metadata.gz: d2f2030116481690fdae03a6c749a4bd367c7bf69a37685acaeed8a62f2e2cb21d37afac4bc4a32ec68792a5e9a9212aa8775217adfd420fdf3ec93c32292225
7
+ data.tar.gz: 04ba05638b6a38cd141ad892c71ff7fc3771e308f7638200bce082e4ed060e6a3182f5dda0a226caa499280d31351156811ece6c28303992b8a5414e660989e7
@@ -0,0 +1,33 @@
1
+ <% if RedmineExtensions::PatchManager.reloadable_patches_applied > 1 %>
2
+ <div class="patches-applied">
3
+ <i class="icon icon-reload"></i> Patches applied (<%= RedmineExtensions::PatchManager.reloadable_patches_applied %>x)
4
+ </div>
5
+
6
+ <style>
7
+ .patches-applied {
8
+ position: fixed;
9
+ bottom: 0;
10
+ left: 0;
11
+ padding: 2px 10px;
12
+ background: #f44336;
13
+ border-top: 1px solid #b71c1c;
14
+ border-right: 1px solid #b71c1c;
15
+ animation: patches-applied-pulse 2s 5;
16
+ color: #fff;
17
+ z-index: 9999999;
18
+ }
19
+
20
+ @keyframes patches-applied-pulse {
21
+ 0% {
22
+ box-shadow: 0 0 0 0 rgba(229, 115, 115, 0.4);
23
+ }
24
+ 70% {
25
+ box-shadow: 0 0 0 20px rgba(229, 115, 115, 0);
26
+ }
27
+ 100% {
28
+ box-shadow: 0 0 0 0 rgba(229, 115, 115, 0);
29
+ }
30
+ }
31
+ </style>
32
+ <% end %>
33
+
@@ -1,6 +1,6 @@
1
1
  require 'active_support/dependencies'
2
2
  require_relative './patch_manager'
3
- require_relative './redmine_patches/patches'
3
+ require_relative './redmine_patches/controllers/application_controller_patch'
4
4
 
5
5
  require_relative './query_output'
6
6
 
@@ -70,9 +70,6 @@ module RedmineExtensions
70
70
  unless Redmine::Plugin.installed?(:easy_extensions)
71
71
  ActiveSupport.run_load_hooks(:easyproject, self)
72
72
  end
73
-
74
- require_relative './easy_query_adapter'
75
- require_relative './easy_entity_formatters/easy_entity_formatter'
76
73
  end
77
74
 
78
75
  # initializer :add_html_formatting do |app|
@@ -1,6 +1,10 @@
1
1
  module RedmineExtensions
2
2
  class Hooks < Redmine::Hook::ViewListener
3
3
 
4
+ if Rails.env.development?
5
+ render_on :view_layouts_base_body_bottom, partial: 'redmine_extensions/development_mode'
6
+ end
7
+
4
8
  if defined?(EasyExtensions)
5
9
  if EasyExtensions.try(:deferred_js)
6
10
 
@@ -37,5 +41,6 @@ module RedmineExtensions
37
41
  javascript_include_tag('redmine_extensions/redmine_extensions')
38
42
  end
39
43
  end
44
+
40
45
  end
41
46
  end
@@ -4,6 +4,11 @@ module RedmineExtensions
4
4
 
5
5
  PERSISTING_PATCHES = [:force_first, :ruby, :rails, :redmine_plugins, :others]
6
6
 
7
+ @@patches_locations = {}
8
+
9
+ @@reloading_code = false
10
+ @@reloadable_patches_applied = 0
11
+
7
12
  # is called after EasyPatchesSection load
8
13
  def self.initialize_sections
9
14
  @@registered_patches ||= ActiveSupport::OrderedHash.new
@@ -18,6 +23,20 @@ module RedmineExtensions
18
23
  @@registered_patches[:models] ||= EasyPatchesSection.new
19
24
  end
20
25
 
26
+ def self.patches_locations
27
+ @@patches_locations
28
+ end
29
+
30
+ def self.with_reloading_code
31
+ @@reloading_code = true
32
+ yield
33
+ ensure
34
+ @@reloading_code = false
35
+ end
36
+
37
+ def self.reloadable_patches_applied
38
+ @@reloadable_patches_applied
39
+ end
21
40
 
22
41
  # register_patch
23
42
  # => original_klass_to_patch: 'Project', 'CustomField'
@@ -29,8 +48,19 @@ module RedmineExtensions
29
48
  # => :last
30
49
  # => :if => Proc.new{ Object.const_defined?(:EasyBudgetSheetQuery) }
31
50
  def self.register_patch(original_klasses_to_patch, patching_module, options={})
51
+ return if @@reloading_code
52
+
32
53
  options ||= {}
33
54
 
55
+ begin
56
+ const = patching_module.constantize
57
+ @@patches_locations[patching_module] = const.methods(false).map{|m| const.method(m) }.first.source_location.first
58
+ rescue
59
+ # [0] is register_*_patch
60
+ from_location = caller_locations[1]
61
+ @@patches_locations[patching_module] = from_location.absolute_path
62
+ end
63
+
34
64
  raise ArgumentError, 'EasyPatchManager->register_patch: The \'patching_module\' have to be a string!' unless patching_module.is_a?(String)
35
65
 
36
66
  if original_klasses_to_patch.is_a?(String)
@@ -136,14 +166,21 @@ module RedmineExtensions
136
166
 
137
167
  def self.apply_reloadable_patches
138
168
  (@@registered_patches.keys - PERSISTING_PATCHES).each do |section|
139
- # pp "applying #{@@registered_patches[section].count} patches for section '#{section}'"
169
+ reloading_log "Applying #{section} patches (#{@@registered_patches[section].count})"
140
170
  @@registered_patches[section].apply_all_patches
141
171
  end
142
172
 
173
+ reloading_log("Applying page module patches")
143
174
  apply_easy_page_patches
175
+
176
+ @@reloadable_patches_applied += 1
144
177
  true
145
178
  end
146
179
 
180
+ def self.reloading_log(message)
181
+ return if @@reloadable_patches_applied <= 1
182
+ puts "PatchManager: #{message}"
183
+ end
147
184
 
148
185
  class EasyPatchesSection
149
186
  include Enumerable
@@ -349,8 +386,10 @@ module RedmineExtensions
349
386
  return unless cond.call
350
387
  end
351
388
 
352
- pm_klass = patching_module.constantize
353
- oktp_klass = original_klass_to_patch.constantize
389
+ pm_klass = easy_constantize(patching_module)
390
+ # pm_klass.class_eval { unloadable }
391
+
392
+ oktp_klass = easy_constantize(original_klass_to_patch)
354
393
 
355
394
  if @options[:prepend]
356
395
  oktp_klass.prepend pm_klass # unless oktp_klass.include?(pm_klass)
@@ -359,6 +398,20 @@ module RedmineExtensions
359
398
  end
360
399
  end
361
400
 
401
+ def easy_constantize(name)
402
+ const = name.constantize
403
+ rescue NameError
404
+ if RedmineExtensions::PatchManager.patches_locations.has_key?(name)
405
+ RedmineExtensions::PatchManager.with_reloading_code do
406
+ load RedmineExtensions::PatchManager.patches_locations[patching_module]
407
+ end
408
+
409
+ name.constantize
410
+ else
411
+ raise
412
+ end
413
+ end
414
+
362
415
  end
363
416
 
364
417
  end
@@ -1,3 +1,3 @@
1
1
  module RedmineExtensions
2
- VERSION = '0.2.5'
2
+ VERSION = '0.2.6'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Easy Software Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-21 00:00:00.000000000 Z
11
+ date: 2018-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -181,6 +181,7 @@ files:
181
181
  - app/views/easy_queries/_index.html.erb
182
182
  - app/views/easy_queries/_settings.html.erb
183
183
  - app/views/easy_settings/edit.html.erb
184
+ - app/views/redmine_extensions/_development_mode.html.erb
184
185
  - config/locales/cs.yml
185
186
  - config/locales/en.yml
186
187
  - config/routes.rb
@@ -238,9 +239,7 @@ files:
238
239
  - lib/redmine_extensions/core_ext/object.rb
239
240
  - lib/redmine_extensions/core_ext/string.rb
240
241
  - lib/redmine_extensions/deprecator.rb
241
- - lib/redmine_extensions/easy_entity_formatters/easy_entity_formatter.rb
242
242
  - lib/redmine_extensions/easy_form_builder.rb
243
- - lib/redmine_extensions/easy_query_adapter.rb
244
243
  - lib/redmine_extensions/easy_query_helpers/outputs.rb
245
244
  - lib/redmine_extensions/easy_settings.rb
246
245
  - lib/redmine_extensions/easy_settings/form_model.rb
@@ -264,7 +263,6 @@ files:
264
263
  - lib/redmine_extensions/rails_patches/form_builder_patch.rb
265
264
  - lib/redmine_extensions/rails_patches/route_set_generator_patch.rb
266
265
  - lib/redmine_extensions/redmine_patches/controllers/application_controller_patch.rb
267
- - lib/redmine_extensions/redmine_patches/patches.rb
268
266
  - lib/redmine_extensions/tags/autocomplete_field.rb
269
267
  - lib/redmine_extensions/version.rb
270
268
  - lib/tasks/redmine_extensions_tasks.rake
@@ -1,27 +0,0 @@
1
- class EasyEntityFormatter
2
-
3
- def initialize(view_context)
4
- @view_context = view_context
5
- end
6
-
7
- def view
8
- @view_context
9
- end
10
-
11
- def l(*args)
12
- view.l(*args)
13
- end
14
-
15
- def format_column(column, entity)
16
- format_object column.value_object(entity)
17
- end
18
-
19
- def format_object(value)
20
- view.format_object(value)
21
- end
22
-
23
- def ending_buttons?
24
- false
25
- end
26
-
27
- end
@@ -1,175 +0,0 @@
1
- require 'query'
2
-
3
- module RedmineExtensions
4
- module QueryColumnAdapter
5
- def self.included(base)
6
- base.extend ClassMethods
7
- base.include InstanceMethods
8
-
9
- base.class_eval do
10
- attr_accessor :includes
11
- attr_accessor :joins
12
- attr_accessor :preload
13
- end
14
- end
15
-
16
- module InstanceMethods
17
- end
18
-
19
- module ClassMethods
20
- end
21
- end
22
-
23
- module QueryAdapter
24
-
25
- attr_writer :outputs
26
-
27
- def outputs
28
- @outputs ||= ['list']
29
- end
30
-
31
- def output=(output_t)
32
- self.outputs = Array.wrap(output_t)
33
- end
34
-
35
- def default_find_include
36
- [].freeze
37
- end
38
-
39
- def default_find_preload
40
- [].freeze
41
- end
42
-
43
- def default_find_joins
44
- [].freeze
45
- end
46
-
47
- def default_list_columns
48
- [].freeze
49
- end
50
-
51
- def formatter
52
- @formatter
53
- end
54
-
55
- def init_formatter(object)
56
- return @formatter if @formatter
57
-
58
- if entity
59
- begin
60
- formatter_klass = "#{entity}Formatter".constantize
61
- rescue NameError
62
- end
63
- end
64
-
65
- formatter_klass ||= EasyEntityFormatter
66
- @formatter = formatter_klass.new(object)
67
- end
68
-
69
- def entity
70
- self.class.queried_class
71
- end
72
-
73
- def entity_scope
74
- if !@entity_scope.nil?
75
- @entity_scope
76
- elsif entity.respond_to?(:visible)
77
- entity.visible
78
- else
79
- entity
80
- end
81
- end
82
-
83
- def set_entity_scope(entity, reference_collection = nil)
84
- return nil if entity.nil? || reference_collection.nil?
85
-
86
- @entity_scope = entity.send(reference_collection.to_sym)
87
-
88
- self.filters = {}
89
-
90
- @entity_scope
91
- end
92
-
93
- def create_entity_scope(options={})
94
- scope = entity_scope.where(statement)
95
-
96
- includes = default_find_include.dup
97
- includes.concat(Array.wrap(options[:includes]))
98
-
99
- preload = default_find_preload.dup
100
- preload.concat(Array.wrap(options[:preload]))
101
-
102
- joins = default_find_joins.dup
103
- joins.concat(Array.wrap(options[:joins]))
104
-
105
- filters.keys.each do |filter|
106
- f = available_filters[filter]
107
- next if f.blank?
108
-
109
- includes.concat(Array.wrap(f[:includes])) if f[:includes]
110
- joins.concat(Array.wrap(f[:joins])) if f[:joins]
111
- end if filters
112
-
113
- columns.each do |c|
114
- includes.concat(Array.wrap(c.includes)) if c.includes
115
- joins.concat(Array.wrap(c.joins)) if c.joins
116
- preload.concat(Array.wrap(c.preload)) if c.preload
117
- end
118
-
119
- if project
120
- includes << :project
121
- end
122
-
123
- includes.uniq!
124
- joins.uniq!
125
- preload.uniq!
126
-
127
- scope.includes(includes).references(includes).joins(joins).preload(preload)
128
- end
129
-
130
- def entities(options={})
131
- create_entity_scope(options).order(options[:order]).to_a
132
- end
133
-
134
- def add_available_column(name, options={})
135
- @available_columns ||= []
136
-
137
- @available_columns << QueryColumn.new(name.to_sym, options)
138
- end
139
-
140
- def to_partial_path
141
- 'easy_queries/index'
142
- end
143
-
144
- def default_columns_names
145
- default_list_columns
146
- end
147
-
148
- def queried_table_name
149
- entity.table_name
150
- end
151
-
152
- end
153
-
154
- module QueryAdapterDefaults
155
-
156
- def initialize(attributes=nil, *args)
157
- super
158
- self.filters ||= {}
159
- end
160
-
161
- end
162
-
163
- end
164
-
165
- class EasyQueryAdapter < Query
166
- end
167
-
168
- if Redmine::Plugin.installed?(:easy_extensions)
169
- # EasyQuery exist
170
- else
171
- QueryColumn.include RedmineExtensions::QueryColumnAdapter
172
- RedmineExtensions::PatchManager.register_model_patch('Query', 'RedmineExtensions::QueryAdapter')
173
- EasyQuery = EasyQueryAdapter
174
- EasyQuery.prepend RedmineExtensions::QueryAdapterDefaults
175
- end
@@ -1,5 +0,0 @@
1
- require 'active_support/dependencies'
2
- patch_path = File.join(File.dirname(__FILE__), '**', '*_patch.rb')
3
- Dir.glob(patch_path).each do |file|
4
- require file
5
- end