redde 0.3.39 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2724ca09fd2d3fcc17a41ca62671f9bad0fe62a5
4
- data.tar.gz: f0c5c9294422dcf37a3a0636c19fb58555665ba2
2
+ SHA256:
3
+ metadata.gz: b5e0be1b746e4912e3b8956e5b8425449cc99cd59a7898cd344298c2981f6534
4
+ data.tar.gz: c7fc72bd1781b24ad1d20e09eb6fa99fa70927154d4814d704f17de7f9fe7185
5
5
  SHA512:
6
- metadata.gz: 61a720788a04988fc12ac3eeabdccabdc299981016a2a207f4d7b07023909e32a23f89806091330bf35fc8a617eeed1a68933e73030c0a8cc2fec2c568c4b82a
7
- data.tar.gz: eec37588201fa4ceb88bbfd99d58ad6a4d541efde14283101434a87956219ab964e0d657d81e091ab7a775689202f747c2d1121b4264db5e2d2d98922c60e4b5
6
+ metadata.gz: cfc5dc125bacb07fb1eec37085685e253d8ed2637f764aa5bc6417597c29f1adb29c95fc40c665284154a5178bd3760aa495627a310279c369bc6ad621ee7230
7
+ data.tar.gz: 1a1b284210da57a843253d91537fd1d229cade37b37d082122888957f96dfbeeeab8166335b809f956ca65917da2428f6a079c8c2036b085e5428b477b992c2f
data/.travis.yml CHANGED
@@ -1,9 +1,12 @@
1
1
  script: bundle exec rspec
2
2
  language: ruby
3
+ services:
4
+ - redis-server
3
5
  notifications:
4
6
  email: false
5
7
  rvm:
6
- - 2.2
8
+ - 2.3
9
+ - 2.4
7
10
  before_install:
8
11
  - gem install bundler
9
12
  before_script:
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Redde
2
- [![Build Status](https://secure.travis-ci.org/redde/redde.png)](http://travis-ci.org/redde/redde)
3
- [![Code Climate](https://codeclimate.com/github/redde/redde.png)](https://codeclimate.com/github/redde/redde)
2
+ [![Build Status](https://travis-ci.org/redde/redde.svg?branch=master)](https://travis-ci.org/redde/redde)
3
+ [![Code Climate](https://codeclimate.com/github/redde/redde/badges/gpa.svg)](https://codeclimate.com/github/redde/redde)
4
4
 
5
5
  Admin generator for redde projects
6
6
 
@@ -1,13 +1,14 @@
1
- #= require jquery
2
- #= require jquery_ujs
3
-
4
- # Пока подключаем все подряд, потом сделать кастомизацию
5
- #= require ./sortable
6
- #= require ./sortTree
7
- #= require ./fileapi
8
- #= require ./redactor
9
- #= require ./file
10
-
11
- $ ->
12
- $(document).on 'click', '[data-href]', (e)->
13
- location.href = $(e.currentTarget).data('href')
1
+ #= require jquery
2
+ #= require jquery_ujs
3
+
4
+ # Пока подключаем все подряд, потом сделать кастомизацию
5
+ #= require ./sortable
6
+ #= require ./sortTree
7
+ #= require ./fileapi
8
+ #= require ./redactor
9
+ #= require ./file
10
+ #= require message-bus
11
+
12
+ $ ->
13
+ $(document).on 'click', '[data-href]', (e)->
14
+ location.href = $(e.currentTarget).data('href')
@@ -1,4 +1,4 @@
1
- #= require jquery-ui/sortable
1
+ #= require jquery-ui/widgets/sortable
2
2
  #= require ./jquery.mjs.nestedSortable.js
3
3
 
4
4
  $ ->
@@ -1,4 +1,4 @@
1
- #= require jquery-ui/sortable
1
+ #= require jquery-ui/widgets/sortable
2
2
 
3
3
  ###
4
4
  variants:
@@ -1,6 +1,7 @@
1
1
  class Admin::BaseController < ActionController::Base
2
2
  layout 'redde'
3
3
  before_action :authenticate_manager!
4
+ after_action :track_viewer, only: [:edit, :update]
4
5
  protect_from_forgery with: :exception
5
6
  include Redde::AdminHelper
6
7
  include Redde::IndexHelper
@@ -71,6 +72,23 @@ class Admin::BaseController < ActionController::Base
71
72
  'сохранена'
72
73
  end
73
74
 
75
+ def use_presence?
76
+ defined?(Redis)
77
+ end
78
+
79
+ def item
80
+ instance_variable_get("@#{record}")
81
+ end
82
+
83
+ def track_viewer
84
+ Redde::Presence::View.new(item, current_manager.id).view if item.present?
85
+ end
86
+
87
+ def viewers
88
+ @viewers ||= Manager.where(Redde::Presence::View.viewers_of(item)) if item
89
+ end
90
+ helper_method :viewers
91
+
74
92
  def url_for_obj(obj, custom_url = nil)
75
93
  return custom_url if custom_url.present?
76
94
  return [:edit, :admin, obj] if params[:commit] == 'Применить'
@@ -11,108 +11,6 @@ module Redde::IndexHelper
11
11
  model_name.columns.select { |i| i.type == :string }.first
12
12
  end
13
13
 
14
- class IndexBuilder
15
- include ActionView::Helpers::TagHelper
16
- include ActionView::Context
17
-
18
- attr_accessor :list, :params
19
-
20
- def initialize(list, params)
21
- @list = list
22
- @params = params
23
- end
24
-
25
- def empty( options = {} )
26
- content_tag(:th, "", class: ['list__head', options[:class]])
27
- end
28
-
29
- def thead insert
30
- content_tag :thead do
31
- content_tag(:tr, empty + visible + insert + empty(class: 'list__head_del') + empty)
32
- end
33
- end
34
-
35
- def visible
36
- empty(class: '_eye') if list.column_names.include?('visible')
37
- end
38
-
39
- class IndexHeadCellBuilder
40
- include ActionView::Helpers::TagHelper
41
- include ActionView::Context
42
-
43
- attr_accessor :list
44
-
45
- def initialize(list)
46
- @list = list
47
- end
48
-
49
- def cell field = nil, options = {}, &block
50
- if field.is_a?(Symbol) || field.is_a?(String)
51
- content_tag :th, list.human_attribute_name(field), class: ['list__head', options[:class]]
52
- elsif field.is_a?(Hash)
53
- content_tag :th, "", class: ['list__head', field[:class]]
54
- elsif field.nil?
55
- content_tag :th, "", class: 'list__head'
56
- end
57
- end
58
- end
59
-
60
- class IndexCellBuilder
61
- include ActionView::Helpers
62
- include ActionView::Context
63
- include ActionView::Helpers::UrlHelper
64
- include Rails.application.routes.url_helpers
65
- include Haml::Helpers
66
-
67
- attr_accessor :item, :builder
68
-
69
- def initialize(item, builder)
70
- @item = item
71
- @builder = builder
72
- init_haml_helpers
73
- end
74
-
75
- def self.content value
76
- case value.class.name
77
- when 'Time' then I18n.l(value, format: '%d %b %Y, %H:%M')
78
- when 'Date' then I18n.l(value, format: '%d %b %Y')
79
- else
80
- value
81
- end
82
- end
83
-
84
- def cell(field, options = {}, &block)
85
- # через content_tag ... do не работает
86
- if field.is_a?(Hash)
87
- content_tag :td, capture(&block), class: ['list__cell', field[:class]]
88
- else
89
- content_tag :td, if block_given? then capture(&block) else IndexCellBuilder.content(item.send(field)) end, class: ['list__cell', options[:class]]
90
- end
91
- end
92
-
93
- def empty(options = {})
94
- content_tag(:td, "", class: ['list__cell', options[:class]])
95
- end
96
-
97
- def handle
98
- return content_tag(:td, "", class: ['list__cell', '_handle'], 'data-sortable-handle' => "") if item.class.column_names.include?('position')
99
- empty
100
- end
101
-
102
- def visible
103
- content_tag :td, class: 'list__cell _eye' do
104
- link_to('', url_for(id: item, controller: builder.params[:controller], action: :update, item.class.model_name.param_key => { visible: !item.visible} ), class: ['list__eye', ('_disactive' if !item.visible)], data: { method: 'put' })
105
- end if item.class.column_names.include?('visible')
106
- end
107
-
108
- def del
109
- content_tag :td, class: 'list__cell list__cell_del' do
110
- link_to('', url_for(id: item, action: :destroy, controller: builder.params[:controller]), method: :delete, data: { confirm: 'Точно удалить?' }, class: 'list__del')
111
- end
112
- end
113
- end
114
- end
115
-
116
14
  def list_table(list, options = {}, &block)
117
15
  raise ArgumentError, "Missing block" unless block_given?
118
16
  builder = IndexBuilder.new(list, params)
@@ -233,7 +131,111 @@ module Redde::IndexHelper
233
131
  end
234
132
 
235
133
  def index_value_for(item, column)
236
- return model_name::INDEX_COLUMNS[column.to_sym].call(item) if defined?(model_name::INDEX_COLUMNS) && model_name::INDEX_COLUMNS.is_a?(Hash) && model_name::INDEX_COLUMNS[column.to_sym].present?
134
+ "#{item.model_name}::INDEX_COLUMNS".constantize[column.to_sym].call(item)
135
+ rescue
237
136
  item.send(column)
238
137
  end
138
+
139
+ class IndexBuilder
140
+ include ActionView::Helpers::TagHelper
141
+ include ActionView::Context
142
+
143
+ attr_accessor :list, :params
144
+
145
+ def initialize(list, params)
146
+ @list = list
147
+ @params = params
148
+ end
149
+
150
+ def empty( options = {} )
151
+ content_tag(:th, "", class: ['list__head', options[:class]])
152
+ end
153
+
154
+ def thead insert
155
+ content_tag :thead do
156
+ content_tag(:tr, empty + visible + insert + empty(class: 'list__head_del') + empty)
157
+ end
158
+ end
159
+
160
+ def visible
161
+ empty(class: '_eye') if list.column_names.include?('visible')
162
+ end
163
+
164
+ class IndexHeadCellBuilder
165
+ include ActionView::Helpers::TagHelper
166
+ include ActionView::Context
167
+
168
+ attr_accessor :list
169
+
170
+ def initialize(list)
171
+ @list = list
172
+ end
173
+
174
+ def cell field = nil, options = {}, &block
175
+ if field.is_a?(Symbol) || field.is_a?(String)
176
+ content_tag :th, list.human_attribute_name(field), class: ['list__head', options[:class]]
177
+ elsif field.is_a?(Hash)
178
+ content_tag :th, "", class: ['list__head', field[:class]]
179
+ elsif field.nil?
180
+ content_tag :th, "", class: 'list__head'
181
+ end
182
+ end
183
+ end
184
+
185
+ class IndexCellBuilder
186
+ include ActionView::Helpers
187
+ include ActionView::Context
188
+ include ActionView::Helpers::UrlHelper
189
+ include Redde::IndexHelper
190
+ include Rails.application.routes.url_helpers
191
+ include Haml::Helpers
192
+
193
+ attr_accessor :item, :builder
194
+
195
+ def initialize(item, builder)
196
+ @item = item
197
+ @builder = builder
198
+ init_haml_helpers
199
+ end
200
+
201
+ def self.content(value)
202
+ case value.class.name
203
+ when 'Time' then I18n.l(value, format: '%d %b %Y, %H:%M')
204
+ when 'Date' then I18n.l(value, format: '%d %b %Y')
205
+ else
206
+ value
207
+ end
208
+ end
209
+
210
+ def cell(field, options = {}, &block)
211
+ # через content_tag ... do не работает
212
+ if field.is_a?(Hash)
213
+ content_tag :td, capture(&block), class: ['list__cell', field[:class]]
214
+ else
215
+ content_tag :td, if block_given? then capture(&block) else raw(IndexCellBuilder.content(index_value_for(item, field))) end, class: ['list__cell', options[:class]]
216
+ end
217
+ end
218
+
219
+ def empty(options = {})
220
+ content_tag(:td, "", class: ['list__cell', options[:class]])
221
+ end
222
+
223
+ def handle
224
+ return content_tag(:td, "", class: ['list__cell', '_handle'], 'data-sortable-handle' => "") if item.class.column_names.include?('position')
225
+ empty
226
+ end
227
+
228
+ def visible
229
+ content_tag :td, class: 'list__cell _eye' do
230
+ link_to('', url_for(id: item, controller: builder.params[:controller], action: :update, item.class.model_name.param_key => { visible: !item.visible} ), class: ['list__eye', ('_disactive' if !item.visible)], data: { method: 'put' })
231
+ end if item.class.column_names.include?('visible')
232
+ end
233
+
234
+ def del
235
+ content_tag :td, class: 'list__cell list__cell_del' do
236
+ link_to('', url_for(id: item, action: :destroy, controller: builder.params[:controller]), method: :delete, data: { confirm: 'Точно удалить?' }, class: 'list__del')
237
+ end
238
+ end
239
+ end
240
+ end
239
241
  end
@@ -2,7 +2,7 @@ class Redde::Photo < ActiveRecord::Base
2
2
  mount_uploader :src, PhotoUploader
3
3
  self.table_name = 'redde_photos'
4
4
 
5
- belongs_to :imageable, polymorphic: true
5
+ belongs_to :imageable, polymorphic: true, optional: true
6
6
  default_scope { order(:position) }
7
7
  before_save :set_token, unless: :persisted_link?
8
8
 
@@ -0,0 +1,28 @@
1
+ module Redde
2
+ module Presence
3
+ class View
4
+ attr_reader :obj, :user_id
5
+ TTL = 15
6
+
7
+ def initialize(obj, user_id)
8
+ @obj = obj
9
+ @user_id = user_id
10
+ end
11
+
12
+ def self.viewers_of(obj)
13
+ Redis.current.keys("#{obj.class.name}:#{obj.id}:*").map do |key|
14
+ key.split(':').last.to_i
15
+ end
16
+ end
17
+
18
+ def view
19
+ Redis.current.set(key, 1)
20
+ Redis.current.expire(key, TTL)
21
+ end
22
+
23
+ def key
24
+ "#{obj.class.name}:#{obj.id}:#{user_id}"
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ module Redde
2
+ module Presence
3
+ require_relative 'presence/view' if defined?(Redis)
4
+ end
5
+ end
@@ -9,4 +9,4 @@
9
9
 
10
10
  -# проверить и написать правильное условие
11
11
  -# f.object.class.reflect_on_association(:seo)
12
- =# render 'admin/seos/block', { f: f } if f.object.methods.include?(:seo)
12
+ -# = render 'admin/seos/block', { f: f } if f.object.methods.include?(:seo)
@@ -1,6 +1,6 @@
1
1
  %li.photos__item{ :id => "photo_#{photo.id}" }
2
2
  = link_to photo.src_url, class: 'photos__link' do
3
- = image_tag photo.src.admin, class: 'photos__img'
3
+ = image_tag photo.src_url(:admin), class: 'photos__img'
4
4
  %span.photos__title= photo.src.file.filename
5
5
  = link_to("",
6
6
  url_for([:admin, photo]),
@@ -1,4 +1,4 @@
1
- class CreateReddePhotos < ActiveRecord::Migration
1
+ class CreateReddePhotos < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  create_table :redde_photos do |t|
4
4
  t.integer :imageable_id
data/lib/redde/engine.rb CHANGED
@@ -2,7 +2,7 @@ module Redde
2
2
  class Engine < ::Rails::Engine
3
3
  config.generators do |g|
4
4
  g.test_framework :rspec, fixture: false
5
- g.fixture_replacement :factory_girl, dir: 'spec/factories'
5
+ g.fixture_replacement :factory_bot, dir: 'spec/factories'
6
6
  g.assets false
7
7
  g.helper false
8
8
  end
@@ -11,5 +11,8 @@ module Redde
11
11
  redde/favicon.png
12
12
  )
13
13
  end
14
+ initializer 'ReddeEngine.add_message_bus' do |app|
15
+ app.middleware.use MessageBus::Rack::Middleware
16
+ end
14
17
  end
15
18
  end
data/lib/redde/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Redde
2
- VERSION = '0.3.39'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
data/lib/redde.rb CHANGED
@@ -16,6 +16,7 @@ require 'jquery-ui-rails'
16
16
  require 'coffee-rails'
17
17
  require 'devise'
18
18
  require 'rails'
19
+ require 'message_bus'
19
20
 
20
21
  Encoding.default_external = Encoding::UTF_8
21
22
  Encoding.default_internal = Encoding::UTF_8
data/redde.gemspec CHANGED
@@ -29,22 +29,24 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency 'mini_magick'
30
30
  spec.add_runtime_dependency 'kaminari'
31
31
  spec.add_runtime_dependency 'ancestry'
32
+ spec.add_runtime_dependency 'message_bus'
33
+ spec.add_runtime_dependency 'redis'
32
34
  spec.add_dependency 'rails', '>= 3.1'
33
35
  spec.add_dependency 'sass-rails'
34
36
 
35
37
  spec.add_development_dependency 'bundler'
36
38
  spec.add_development_dependency 'rake'
37
39
  spec.add_development_dependency 'rspec-rails', '>= 2.7'
38
- spec.add_development_dependency 'factory_girl_rails', '>= 2.7'
40
+ spec.add_development_dependency 'factory_bot_rails', '>= 2.7'
39
41
  spec.add_development_dependency 'guard-rspec'
40
42
  spec.add_development_dependency 'sqlite3'
41
43
  spec.add_development_dependency 'generator_spec'
42
44
  spec.add_development_dependency 'devise'
43
45
  spec.add_development_dependency 'coffee-rails'
44
46
  spec.add_development_dependency 'sprockets-rails'
45
- spec.add_development_dependency 'quiet_assets'
46
47
  spec.add_development_dependency 'capybara'
47
48
  spec.add_development_dependency 'ffaker'
48
49
  spec.add_development_dependency 'rubocop'
49
50
  spec.add_development_dependency 'launchy'
51
+ spec.add_development_dependency 'puma'
50
52
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redde
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.39
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Bovykin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-02-22 00:00:00.000000000 Z
12
+ date: 2019-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jquery-rails
@@ -151,6 +151,34 @@ dependencies:
151
151
  - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: message_bus
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: redis
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
154
182
  - !ruby/object:Gem::Dependency
155
183
  name: rails
156
184
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +250,7 @@ dependencies:
222
250
  - !ruby/object:Gem::Version
223
251
  version: '2.7'
224
252
  - !ruby/object:Gem::Dependency
225
- name: factory_girl_rails
253
+ name: factory_bot_rails
226
254
  requirement: !ruby/object:Gem::Requirement
227
255
  requirements:
228
256
  - - ">="
@@ -320,7 +348,7 @@ dependencies:
320
348
  - !ruby/object:Gem::Version
321
349
  version: '0'
322
350
  - !ruby/object:Gem::Dependency
323
- name: quiet_assets
351
+ name: capybara
324
352
  requirement: !ruby/object:Gem::Requirement
325
353
  requirements:
326
354
  - - ">="
@@ -334,7 +362,7 @@ dependencies:
334
362
  - !ruby/object:Gem::Version
335
363
  version: '0'
336
364
  - !ruby/object:Gem::Dependency
337
- name: capybara
365
+ name: ffaker
338
366
  requirement: !ruby/object:Gem::Requirement
339
367
  requirements:
340
368
  - - ">="
@@ -348,7 +376,7 @@ dependencies:
348
376
  - !ruby/object:Gem::Version
349
377
  version: '0'
350
378
  - !ruby/object:Gem::Dependency
351
- name: ffaker
379
+ name: rubocop
352
380
  requirement: !ruby/object:Gem::Requirement
353
381
  requirements:
354
382
  - - ">="
@@ -362,7 +390,7 @@ dependencies:
362
390
  - !ruby/object:Gem::Version
363
391
  version: '0'
364
392
  - !ruby/object:Gem::Dependency
365
- name: rubocop
393
+ name: launchy
366
394
  requirement: !ruby/object:Gem::Requirement
367
395
  requirements:
368
396
  - - ">="
@@ -376,7 +404,7 @@ dependencies:
376
404
  - !ruby/object:Gem::Version
377
405
  version: '0'
378
406
  - !ruby/object:Gem::Dependency
379
- name: launchy
407
+ name: puma
380
408
  requirement: !ruby/object:Gem::Requirement
381
409
  requirements:
382
410
  - - ">="
@@ -518,6 +546,8 @@ files:
518
546
  - app/models/concerns/redde/tree_sortable.rb
519
547
  - app/models/concerns/redde/with_photo.rb
520
548
  - app/models/redde/photo.rb
549
+ - app/models/redde/presence.rb
550
+ - app/models/redde/presence/view.rb
521
551
  - app/models/redde/system_command.rb
522
552
  - app/models/redde/url_generator.rb
523
553
  - app/uploaders/photo_uploader.rb
@@ -585,8 +615,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
585
615
  - !ruby/object:Gem::Version
586
616
  version: '0'
587
617
  requirements: []
588
- rubyforge_project:
589
- rubygems_version: 2.4.5.1
618
+ rubygems_version: 3.0.4
590
619
  signing_key:
591
620
  specification_version: 4
592
621
  summary: Admin scaffold generator for redde projects