dokno 1.0.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -6
  3. data/app/assets/javascripts/dokno.js +79 -27
  4. data/app/assets/stylesheets/dokno/application.css +1 -1
  5. data/app/controllers/dokno/application_controller.rb +3 -0
  6. data/app/controllers/dokno/articles_controller.rb +22 -8
  7. data/app/controllers/dokno/categories_controller.rb +15 -2
  8. data/app/controllers/dokno/user_concern.rb +5 -3
  9. data/app/helpers/dokno/application_helper.rb +1 -3
  10. data/app/models/dokno/article.rb +87 -38
  11. data/app/models/dokno/category.rb +39 -15
  12. data/app/views/dokno/_article_formatting.html.erb +17 -18
  13. data/app/views/dokno/_article_panel.html.erb +16 -18
  14. data/app/views/dokno/_panel_formatting.html.erb +47 -57
  15. data/app/views/dokno/articles/_article_form.html.erb +47 -6
  16. data/app/views/dokno/articles/show.html.erb +45 -39
  17. data/app/views/dokno/categories/_category_form.html.erb +6 -1
  18. data/app/views/dokno/categories/index.html.erb +40 -37
  19. data/app/views/layouts/dokno/application.html.erb +34 -9
  20. data/app/views/partials/_category_header.html.erb +29 -0
  21. data/app/views/partials/_form_errors.html.erb +0 -1
  22. data/app/views/partials/_logs.html.erb +7 -5
  23. data/app/views/partials/_pagination.html.erb +20 -18
  24. data/config/routes.rb +1 -1
  25. data/db/migrate/20201203190330_baseline.rb +4 -4
  26. data/db/migrate/20201211192306_add_review_due_at_to_articles.rb +6 -0
  27. data/db/migrate/20201213165700_add_starred_to_article.rb +5 -0
  28. data/lib/dokno/config/config.rb +53 -40
  29. data/lib/dokno/engine.rb +4 -4
  30. data/lib/dokno/version.rb +1 -1
  31. data/lib/generators/dokno/templates/config/initializers/dokno.rb +18 -5
  32. metadata +87 -17
@@ -3,8 +3,8 @@ Dokno::Engine.routes.draw do
3
3
  resources :articles
4
4
 
5
5
  get '/(:cat_code)', to: 'categories#index', as: :article_index
6
+ get '/up_for_review', to: 'categories#index', as: :up_for_review
6
7
  get 'article_panel/(:slug)', to: 'articles#panel', as: :panel
7
- post 'article_log', to: 'articles#article_log', as: :article_log
8
8
  post 'article_preview', to: 'articles#preview', as: :preview
9
9
  post 'article_status', to: 'articles#status', as: :status
10
10
  root 'categories#index'
@@ -13,12 +13,12 @@ class Baseline < ActiveRecord::Migration[6.0]
13
13
  t.string "slug"
14
14
  t.string "title"
15
15
  t.text "markdown"
16
- t.datetime "created_at", precision: 6, null: false
17
- t.datetime "updated_at", precision: 6, null: false
18
16
  t.text "summary"
19
17
  t.boolean "active", default: true
20
18
  t.bigint "views", default: 0
21
19
  t.datetime "last_viewed_at"
20
+ t.datetime "created_at", precision: 6, null: false
21
+ t.datetime "updated_at", precision: 6, null: false
22
22
  t.index ["slug"], name: "index_dokno_articles_on_slug", unique: true
23
23
  end
24
24
 
@@ -32,10 +32,10 @@ class Baseline < ActiveRecord::Migration[6.0]
32
32
 
33
33
  create_table "dokno_categories", force: :cascade do |t|
34
34
  t.string "name"
35
- t.datetime "created_at", precision: 6, null: false
36
- t.datetime "updated_at", precision: 6, null: false
37
35
  t.bigint "category_id"
38
36
  t.string "code", null: false
37
+ t.datetime "created_at", precision: 6, null: false
38
+ t.datetime "updated_at", precision: 6, null: false
39
39
  t.index ["category_id"], name: "index_dokno_categories_on_category_id"
40
40
  t.index ["code"], name: "index_dokno_categories_on_code", unique: true
41
41
  t.index ["name"], name: "index_dokno_categories_on_name", unique: true
@@ -0,0 +1,6 @@
1
+ class AddReviewDueAtToArticles < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :dokno_articles, :review_due_at, :datetime
4
+ add_index :dokno_articles, :review_due_at
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddStarredToArticle < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :dokno_articles, :starred, :boolean, default: false
4
+ end
5
+ end
@@ -1,4 +1,8 @@
1
1
  module Dokno
2
+ module Error
3
+ class Config < StandardError; end
4
+ end
5
+
2
6
  def self.configure
3
7
  yield config
4
8
  config.validate
@@ -8,62 +12,71 @@ module Dokno
8
12
  @config ||= Config.new
9
13
  end
10
14
 
11
- def self.config=(val)
12
- @config = val
13
- end
14
-
15
15
  class Config
16
- # (String) Host application name for display within the mounted dashboard
17
- attr_accessor :app_name
16
+ # Dokno configuration options
17
+ #
18
+ # app_name (String)
19
+ # Host app name for display within the mounted dashboard
20
+ # tag_whitelist (Enumerable)
21
+ # Determines which HTML tags are allowed in Article markdown
22
+ # attr_whitelist (Enumerable)
23
+ # Determines which HTML attributes are allowed in Article markdown
24
+ # app_user_object (String)
25
+ # Host app's user object
26
+ # app_user_auth_method (Symbol)
27
+ # Host app's user object method to be used for edit authorization.
28
+ # Should return boolean
29
+ # app_user_name_method (Symbol)
30
+ # Host app's user object method that returns the authenticated user's name or other
31
+ # identifier that will be included in change log events.
32
+ # Should return a string
33
+ # article_review_period (ActiveSupport::Duration)
34
+ # The amount of time before articles should be reviewed for accuracy/relevance
35
+ # article_review_prompt_days (Integer)
36
+ # The number of days prior to an article being up for review that users should be prompted
18
37
 
19
- # (Enumerable) Determines which HTML tags are allowed in Article markdown
38
+ attr_accessor :app_name
20
39
  attr_accessor :tag_whitelist
21
-
22
- # (Enumerable) Determines which HTML attributes are allowed in Article markdown
23
40
  attr_accessor :attr_whitelist
24
-
25
- # (String) Host application's user object
26
41
  attr_accessor :app_user_object
27
-
28
- # (Symbol) Host application's user object method that should be used to authorize users to edit Dokno data
29
- # Should return boolean.
30
42
  attr_accessor :app_user_auth_method
31
-
32
- # (Symbol) Host application's user object method that should return the authenticated user's name or other
33
- # identifier that will be included in change log events. Should return a string.
34
43
  attr_accessor :app_user_name_method
44
+ attr_accessor :article_review_period
45
+ attr_accessor :article_review_prompt_days
35
46
 
36
47
  # Defaults
37
- TAG_WHITELIST = %w[code img h1 h2 h3 h4 h5 h6 a em u i b strong ol ul li table thead tbody tfoot tr th td blockquote hr br p]
38
- ATTR_WHITELIST = %w[src alt title href target]
39
- APP_USER_OBJECT = 'current_user'
40
- APP_USER_AUTH_METHOD = 'admin?'
41
- APP_USER_NAME_METHOD = 'name'
48
+ TAG_WHITELIST = %w[code img h1 h2 h3 h4 h5 h6 a em u i b strong ol ul li table thead tbody tfoot tr th td blockquote hr br p]
49
+ ATTR_WHITELIST = %w[src alt title href target]
50
+ APP_USER_OBJECT = 'current_user'
51
+ APP_USER_AUTH_METHOD = :admin?
52
+ APP_USER_NAME_METHOD = :name
53
+ ARTICLE_REVIEW_PERIOD = 1.year
54
+ ARTICLE_REVIEW_PROMPT_DAYS = 30
42
55
 
43
56
  def initialize
44
- self.app_name = Rails.application.class.module_parent.name.underscore.humanize.upcase
45
- self.tag_whitelist = TAG_WHITELIST
46
- self.attr_whitelist = ATTR_WHITELIST
47
- self.app_user_object = APP_USER_OBJECT
48
- self.app_user_auth_method = APP_USER_AUTH_METHOD
49
- self.app_user_name_method = APP_USER_NAME_METHOD
57
+ self.app_name = Rails.application.class.module_parent.name.underscore.humanize.upcase
58
+ self.tag_whitelist = TAG_WHITELIST
59
+ self.attr_whitelist = ATTR_WHITELIST
60
+ self.app_user_object = APP_USER_OBJECT
61
+ self.app_user_auth_method = APP_USER_AUTH_METHOD
62
+ self.app_user_name_method = APP_USER_NAME_METHOD
63
+ self.article_review_period = ARTICLE_REVIEW_PERIOD
64
+ self.article_review_prompt_days = ARTICLE_REVIEW_PROMPT_DAYS
50
65
  end
51
66
 
52
67
  def validate
53
- validate_tag_whitelist
54
- validate_attr_whitelist
68
+ validate_config_option(option: 'tag_whitelist', expected_class: Enumerable, example: '%w[a p strong]')
69
+ validate_config_option(option: 'attr_whitelist', expected_class: Enumerable, example: '%w[class href]')
70
+ validate_config_option(option: 'app_user_object', expected_class: String, example: 'current_user')
71
+ validate_config_option(option: 'app_user_auth_method', expected_class: Symbol, example: ':admin?')
72
+ validate_config_option(option: 'app_user_name_method', expected_class: Symbol, example: ':name')
73
+ validate_config_option(option: 'article_review_period', expected_class: ActiveSupport::Duration, example: '1.year')
74
+ validate_config_option(option: 'article_review_prompt_days', expected_class: Integer, example: '30')
55
75
  end
56
76
 
57
- def validate_tag_whitelist
58
- return unless !tag_whitelist.is_a?(Enumerable)
59
-
60
- raise "#{config_error_prefix} tag_whitelist must be Enumerable"
61
- end
62
-
63
- def validate_attr_whitelist
64
- return unless !attr_whitelist.is_a?(Enumerable)
65
-
66
- raise "#{config_error_prefix} attr_whitelist must be Enumerable"
77
+ def validate_config_option(option:, expected_class:, example:)
78
+ return unless !send(option.to_sym).is_a? expected_class
79
+ raise Error::Config, "#{config_error_prefix} #{option} must be #{expected_class}, e.g. #{example}"
67
80
  end
68
81
 
69
82
  def config_error_prefix
@@ -4,10 +4,6 @@ module Dokno
4
4
  class Engine < ::Rails::Engine
5
5
  isolate_namespace Dokno
6
6
 
7
- initializer 'Dokno precompile', group: :all do |app|
8
- app.config.assets.precompile << "dokno_manifest.js"
9
- end
10
-
11
7
  config.generators do |g|
12
8
  g.test_framework :rspec
13
9
  end
@@ -18,6 +14,10 @@ module Dokno
18
14
  end
19
15
  end
20
16
 
17
+ initializer 'Dokno precompile', group: :all do |app|
18
+ app.config.assets.precompile << "dokno_manifest.js"
19
+ end
20
+
21
21
  initializer 'local_helper.action_controller' do
22
22
  ActiveSupport.on_load :action_controller do
23
23
  helper Dokno::ApplicationHelper
@@ -1,3 +1,3 @@
1
1
  module Dokno
2
- VERSION = '1.0.0'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -1,14 +1,27 @@
1
1
  Dokno.configure do |config|
2
- config.tag_whitelist = Dokno::Config::TAG_WHITELIST
3
- config.attr_whitelist = Dokno::Config::ATTR_WHITELIST
2
+ # To control the permitted HTML tags and attributes within articles,
3
+ # uncomment and change the defaults.
4
+ # (Enumerable) tag_whitelist
5
+ # (Enumerable) attr_whitelist
6
+ # config.tag_whitelist = %w[code img h1 h2 h3 h4 h5 h6 a em u i b strong ol ul li table thead tbody tfoot tr th td blockquote hr br p]
7
+ # config.attr_whitelist = %w[src alt title href target]
4
8
 
5
9
  # To restrict Dokno data modification and include indentifying information
6
10
  # in change log entries, provide the appropriate user values for your app below.
7
11
  # (String) app_user_object
8
12
  # (Symbol) app_user_auth_method
9
13
  # (Symbol) app_user_name_method
14
+ # config.app_user_object = 'current_user'
15
+ # config.app_user_auth_method = :admin?
16
+ # config.app_user_name_method = :name
10
17
 
11
- # config.app_user_object = 'current_user'
12
- # config.app_user_auth_method = :admin?
13
- # config.app_user_name_method = :name
18
+ # To control the amount of time before a created/updated article is flagged
19
+ # for accuracy/relevance review, uncomment and change the default.
20
+ # (ActiveSupport::Duration) article_review_period
21
+ # config.article_review_period = 1.year
22
+
23
+ # To control the number of days prior to an article being up for review
24
+ # that users should be prompted to re-review, uncomment and change the default.
25
+ # (Integer) article_review_prompt_days
26
+ # config.article_review_prompt_days = 30
14
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dokno
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Courtney Payne
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-03 00:00:00.000000000 Z
11
+ date: 2020-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bullet
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '6.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '6.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.34'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.34'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: database_cleaner-active_record
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
82
  version: '1.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: faker
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.15'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.15'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: pg
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +128,20 @@ dependencies:
86
128
  - - "~>"
87
129
  - !ruby/object:Gem::Version
88
130
  version: '3.9'
131
+ - !ruby/object:Gem::Dependency
132
+ name: puma
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '5.1'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '5.1'
89
145
  - !ruby/object:Gem::Dependency
90
146
  name: rails
91
147
  requirement: !ruby/object:Gem::Requirement
@@ -127,50 +183,61 @@ dependencies:
127
183
  - !ruby/object:Gem::Version
128
184
  version: 4.0.1
129
185
  - !ruby/object:Gem::Dependency
130
- name: simplecov
186
+ name: selenium-webdriver
131
187
  requirement: !ruby/object:Gem::Requirement
132
188
  requirements:
133
189
  - - "~>"
134
190
  - !ruby/object:Gem::Version
135
- version: 0.19.1
191
+ version: '3.142'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 3.142.7
136
195
  type: :development
137
196
  prerelease: false
138
197
  version_requirements: !ruby/object:Gem::Requirement
139
198
  requirements:
140
199
  - - "~>"
141
200
  - !ruby/object:Gem::Version
142
- version: 0.19.1
201
+ version: '3.142'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 3.142.7
143
205
  - !ruby/object:Gem::Dependency
144
- name: bullet
206
+ name: simplecov
145
207
  requirement: !ruby/object:Gem::Requirement
146
208
  requirements:
147
209
  - - "~>"
148
210
  - !ruby/object:Gem::Version
149
- version: '6.1'
211
+ version: 0.19.1
150
212
  type: :development
151
213
  prerelease: false
152
214
  version_requirements: !ruby/object:Gem::Requirement
153
215
  requirements:
154
216
  - - "~>"
155
217
  - !ruby/object:Gem::Version
156
- version: '6.1'
218
+ version: 0.19.1
157
219
  - !ruby/object:Gem::Dependency
158
- name: faker
220
+ name: webdrivers
159
221
  requirement: !ruby/object:Gem::Requirement
160
222
  requirements:
161
223
  - - "~>"
162
224
  - !ruby/object:Gem::Version
163
- version: '2.15'
225
+ version: '4.4'
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: 4.4.1
164
229
  type: :development
165
230
  prerelease: false
166
231
  version_requirements: !ruby/object:Gem::Requirement
167
232
  requirements:
168
233
  - - "~>"
169
234
  - !ruby/object:Gem::Version
170
- version: '2.15'
235
+ version: '4.4'
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: 4.4.1
171
239
  description: Dokno allows you to easily mount a self-contained knowledgebase / wiki
172
- / help system to your Rails app where you and your users can author articles relevant
173
- to your app.
240
+ / help system to your Rails app.
174
241
  email:
175
242
  - cpayne624@gmail.com
176
243
  executables: []
@@ -211,11 +278,14 @@ files:
211
278
  - app/views/dokno/categories/index.html.erb
212
279
  - app/views/dokno/categories/new.html.erb
213
280
  - app/views/layouts/dokno/application.html.erb
281
+ - app/views/partials/_category_header.html.erb
214
282
  - app/views/partials/_form_errors.html.erb
215
283
  - app/views/partials/_logs.html.erb
216
284
  - app/views/partials/_pagination.html.erb
217
285
  - config/routes.rb
218
286
  - db/migrate/20201203190330_baseline.rb
287
+ - db/migrate/20201211192306_add_review_due_at_to_articles.rb
288
+ - db/migrate/20201213165700_add_starred_to_article.rb
219
289
  - lib/dokno.rb
220
290
  - lib/dokno/config/config.rb
221
291
  - lib/dokno/engine.rb
@@ -230,7 +300,7 @@ licenses:
230
300
  metadata:
231
301
  bug_tracker_uri: https://github.com/cpayne624/dokno/issues
232
302
  changelog_uri: https://github.com/cpayne624/dokno/blob/master/CHANGELOG.md
233
- post_install_message:
303
+ post_install_message:
234
304
  rdoc_options: []
235
305
  require_paths:
236
306
  - lib
@@ -245,8 +315,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
315
  - !ruby/object:Gem::Version
246
316
  version: '0'
247
317
  requirements: []
248
- rubygems_version: 3.1.4
249
- signing_key:
318
+ rubygems_version: 3.2.0.rc.1
319
+ signing_key:
250
320
  specification_version: 4
251
321
  summary: Dokno (dough-no) is a lightweight mountable Rails Engine for storing and
252
322
  managing your app's domain knowledge.