redde 0.3.39 → 0.4.0

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
- 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