udongo 5.1.0 → 5.2.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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/backend/application.js +1 -1
  3. data/app/controllers/backend/assets_controller.rb +52 -0
  4. data/app/models/asset.rb +37 -0
  5. data/app/models/asset_image.rb +172 -0
  6. data/app/models/concerns/imageable.rb +13 -0
  7. data/app/models/image.rb +11 -0
  8. data/app/uploaders/asset_uploader.rb +36 -0
  9. data/app/views/backend/assets/_filter.html.erb +17 -0
  10. data/app/views/backend/assets/_form.html.erb +28 -0
  11. data/app/views/backend/assets/edit.html.erb +5 -0
  12. data/app/views/backend/assets/index.html.erb +48 -0
  13. data/app/views/backend/assets/new.html.erb +4 -0
  14. data/app/views/backend/snippets/edit.html.erb +1 -1
  15. data/app/views/backend/users/index.html.erb +2 -2
  16. data/app/views/layouts/backend/_top_navigation.html.erb +1 -0
  17. data/changelog.md +9 -0
  18. data/config/locales/en.yml +2 -1
  19. data/config/locales/en_backend.yml +6 -0
  20. data/config/locales/en_general.yml +1 -0
  21. data/config/locales/fr.yml +1 -1
  22. data/config/locales/nl.yml +2 -1
  23. data/config/locales/nl_backend.yml +5 -0
  24. data/config/locales/nl_general.yml +1 -0
  25. data/config/routes.rb +2 -0
  26. data/db/migrate/20170225144523_create_assets.rb +14 -0
  27. data/db/migrate/20170228183831_create_images.rb +18 -0
  28. data/lib/udongo/configs/assets.rb +10 -0
  29. data/lib/udongo/version.rb +1 -1
  30. data/readme.md +11 -0
  31. data/spec/factories/addresses.rb +6 -0
  32. data/spec/factories/admins.rb +10 -0
  33. data/spec/factories/assets.rb +5 -0
  34. data/spec/factories/comments.rb +9 -0
  35. data/spec/factories/content_columns.rb +10 -0
  36. data/spec/factories/content_images.rb +9 -0
  37. data/spec/factories/content_rows.rb +5 -0
  38. data/spec/factories/content_texts.rb +4 -0
  39. data/spec/factories/email_templates.rb +8 -0
  40. data/spec/factories/emails.rb +11 -0
  41. data/spec/factories/images.rb +5 -0
  42. data/spec/factories/logs.rb +4 -0
  43. data/spec/factories/meta.rb +7 -0
  44. data/spec/factories/navigation_items.rb +5 -0
  45. data/spec/factories/navigations.rb +6 -0
  46. data/spec/factories/notes.rb +6 -0
  47. data/spec/factories/pages.rb +5 -0
  48. data/spec/factories/queued_tasks.rb +5 -0
  49. data/spec/factories/redirects.rb +7 -0
  50. data/spec/factories/search_indices.rb +6 -0
  51. data/spec/factories/search_modules.rb +5 -0
  52. data/spec/factories/search_synonyms.rb +7 -0
  53. data/spec/factories/settings.rb +7 -0
  54. data/spec/factories/snippets.rb +6 -0
  55. data/spec/factories/stores.rb +6 -0
  56. data/spec/factories/tagged_items.rb +5 -0
  57. data/spec/factories/tags.rb +7 -0
  58. data/spec/factories/users.rb +9 -0
  59. data/spec/support/concerns/cacheable.rb +10 -0
  60. data/spec/support/concerns/commentable.rb +10 -0
  61. data/spec/support/concerns/content_type.rb +20 -0
  62. data/spec/support/concerns/deletable.rb +33 -0
  63. data/spec/support/concerns/draggable.rb +29 -0
  64. data/spec/support/concerns/emailable.rb +7 -0
  65. data/spec/support/concerns/flexible_content.rb +22 -0
  66. data/spec/support/concerns/imageable.rb +15 -0
  67. data/spec/support/concerns/locale.rb +21 -0
  68. data/spec/support/concerns/loggable.rb +19 -0
  69. data/spec/support/concerns/notable.rb +10 -0
  70. data/spec/support/concerns/parentable.rb +73 -0
  71. data/spec/support/concerns/person.rb +15 -0
  72. data/spec/support/concerns/publishable.rb +41 -0
  73. data/spec/support/concerns/searchable.rb +130 -0
  74. data/spec/support/concerns/seo.rb +54 -0
  75. data/spec/support/concerns/sortable.rb +67 -0
  76. data/spec/support/concerns/spammable.rb +53 -0
  77. data/spec/support/concerns/storable.rb +18 -0
  78. data/spec/support/concerns/taggable.rb +51 -0
  79. data/spec/support/concerns/translatable.rb +71 -0
  80. data/spec/support/concerns/visible.rb +64 -0
  81. metadata +66 -2
@@ -0,0 +1,54 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :seo do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+ let(:instance) { create(klass) }
7
+
8
+ describe '#seo' do
9
+ it 'always returns a meta object' do
10
+ expect(instance.seo(:nl).class).to eq Meta
11
+ end
12
+
13
+ describe 'fetch locale specific meta object' do
14
+ it 'new' do
15
+ instance.seo(:nl) == instance.seo(:nl)
16
+ end
17
+
18
+ it 'saved' do
19
+ meta = instance.meta.create(locale: 'nl', slug: 'test')
20
+ expect(instance.seo(:nl)).to eq meta
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '.find_by_slug' do
26
+ it :result do
27
+ instance.meta.create!(locale: 'nl', slug: 'test')
28
+ expect(model.find_by_slug('test', locale: :nl)).to eq instance
29
+ end
30
+
31
+ it 'no result' do
32
+ expect(model.find_by_slug('test', locale: :nl)).to eq nil
33
+ end
34
+ end
35
+
36
+ describe '.find_by_slug!' do
37
+ it :result do
38
+ instance.meta.create!(locale: 'nl', slug: 'test')
39
+ expect(model.find_by_slug!('test', locale: :nl)).to eq instance
40
+ end
41
+
42
+ it 'no result' do
43
+ expect{ model.find_by_slug!('test', locale: :nl) }.to raise_exception RuntimeError
44
+ end
45
+ end
46
+
47
+ it '#respond_to?' do
48
+ expect(build(klass)).to respond_to(:meta, :seo)
49
+ end
50
+
51
+ it '.respond_to?' do
52
+ expect(model).to respond_to(:find_by_slug, :find_by_slug!)
53
+ end
54
+ end
@@ -0,0 +1,67 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :sortable do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+
7
+ describe 'scopes' do
8
+ it :default_scope do
9
+ a = create(klass, position: 2)
10
+ b = create(klass, position: 3)
11
+ c = create(klass, position: 1)
12
+ expect(model.all).to eq [c, a, b]
13
+ end
14
+
15
+ it 'new records' do
16
+ a = create(klass)
17
+ b = create(klass)
18
+ c = create(klass)
19
+ expect(model.all).to eq [a, b, c]
20
+ end
21
+ end
22
+
23
+ describe '#set_position' do
24
+ before :each do
25
+ @first = create klass, position: 1
26
+
27
+ if @first.scope_condition.is_a?(Hash)
28
+ @second = create klass, @first.scope_condition.merge!({ position: 2 })
29
+ else
30
+ @second = create klass, position: 2
31
+ end
32
+ end
33
+
34
+ it :parentable do
35
+ if @first.respond_to?(:parentable) && @first.parentable? && @first.scope_name == 'parent_id'
36
+ two = create(klass, parent_id: @first.id)
37
+ three = create(klass)
38
+
39
+ three.set_position 2, @first.id
40
+ expect(three.parent_id).to eq @first.id
41
+ end
42
+ end
43
+
44
+ context 'draggable' do
45
+ it :with do
46
+ if @first.respond_to?(:draggable)
47
+ @first.update_attribute :draggable, false
48
+ @first.set_position 2
49
+
50
+ expect(model.find(@first.id).position).to eq 1
51
+ expect(model.find(@second.id).position).to eq 2
52
+ end
53
+ end
54
+
55
+ # You can't test the state without draggable/parentable reliably, due
56
+ # to scope issues.
57
+ end
58
+ end
59
+
60
+ it '.respond_to?' do
61
+ expect(model).to respond_to(:acts_as_list, :sortable)
62
+ end
63
+
64
+ it '#respond_to?' do
65
+ expect(model.new).to respond_to(:set_position, :set_list_position)
66
+ end
67
+ end
@@ -0,0 +1,53 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :spammable do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+
7
+ describe 'scopes' do
8
+ before(:each) do
9
+ @a = create(klass, marked_as_spam: nil)
10
+ @b = create(klass, marked_as_spam: false)
11
+ @c = create(klass, marked_as_spam: true)
12
+ end
13
+
14
+ it(:spam) { expect(model.spam).to eq [@c] }
15
+ it(:not_spam) { expect(model.not_spam).to eq [@a, @b] }
16
+ end
17
+
18
+ describe 'defaults' do
19
+ it 'not set' do
20
+ expect(build(klass)).not_to be_marked_as_spam
21
+ end
22
+
23
+ describe 'set' do
24
+ it :true do
25
+ expect(build(klass, marked_as_spam: true)).to be_marked_as_spam
26
+ end
27
+
28
+ it :false do
29
+ expect(build(klass, marked_as_spam: false)).not_to be_marked_as_spam
30
+ end
31
+ end
32
+ end
33
+
34
+ it '#mark_as_spam!' do
35
+ object = build(klass)
36
+ object.mark_as_spam!
37
+ expect(object).to be_marked_as_spam
38
+ end
39
+
40
+ it '#unmark_as_spam!' do
41
+ object = build(klass, marked_as_spam: true)
42
+ object.unmark_as_spam!
43
+ expect(object).not_to be_marked_as_spam
44
+ end
45
+
46
+ it '.respond_to?' do
47
+ expect(model).to respond_to(:spam, :not_spam)
48
+ end
49
+
50
+ it '#respond_to?' do
51
+ expect(model.new).to respond_to(:mark_as_spam!)
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :storable do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+
7
+ it '#storable?' do
8
+ expect(build(klass)).to be_storable
9
+ end
10
+
11
+ it '#respond_to?' do
12
+ expect(build(klass)).to respond_to(:store, :storable?)
13
+ end
14
+
15
+ it '.respond_to?' do
16
+ expect(model).to respond_to(:storable_field, :store_config)
17
+ end
18
+ end
@@ -0,0 +1,51 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :taggable do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+ let(:instance) { create(klass) }
7
+
8
+ it '#tags' do
9
+ tag = create(:tag, locale: :nl, name: 'foo', slug: 'foo')
10
+ instance.tagged_items.create!(tag: tag)
11
+ expect(instance.tags(:nl)).to eq [tag]
12
+ end
13
+
14
+ it '#tags_string' do
15
+ tag1 = create(:tag, locale: :nl, name: 'foo', slug: 'foo')
16
+ tag2 = create(:tag, locale: :nl, name: 'bar', slug: 'bar')
17
+ instance.tagged_items.create!(tag: tag1)
18
+ instance.tagged_items.create!(tag: tag2)
19
+ expect(instance.tags_string(:nl)).to eq 'foo,bar'
20
+ end
21
+
22
+ describe '#related' do
23
+ let(:instance2) { create(klass) }
24
+ let(:tag1) { create(:tag, locale: :nl, name: 'foo', slug: 'foo') }
25
+ let(:tag2) { create(:tag, locale: :nl, name: 'bar', slug: 'bar') }
26
+
27
+ it :blank do
28
+ instance.tagged_items.create!(tag: tag1)
29
+ instance2.tagged_items.create!(tag: tag2)
30
+ expect(instance.related(:nl)).to eq []
31
+ end
32
+
33
+ it :results do
34
+ instance.tagged_items.create!(tag: tag1)
35
+ instance.tagged_items.create!(tag: tag2)
36
+ instance2.tagged_items.create!(tag: tag1)
37
+ instance2.tagged_items.create!(tag: tag2)
38
+ expect(instance.related(:nl)).to eq [instance2]
39
+ expect(instance2.related(:nl)).to eq [instance]
40
+ end
41
+ end
42
+
43
+ it '#taggable?' do
44
+ expect(instance).to be_taggable
45
+ end
46
+
47
+ it '#respond_to?' do
48
+ expect(model.new).to respond_to(:tagged_items, :related, :tags, :tags_string, :taggable?)
49
+ end
50
+ end
51
+
@@ -0,0 +1,71 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :translatable do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+
7
+ describe '#locales' do
8
+ it 'defaults to an empty array' do
9
+ expect(build(klass).locales.class).to eq Array
10
+ end
11
+
12
+ it 'updates when a translation is added' do
13
+ object = create(klass)
14
+ field = model.translatable_fields_list.first
15
+ object.translation(:nl).send("#{field}=", 'foo')
16
+ object.save
17
+
18
+ # 13/01 - if this is done with eq instead of include, the searchable spec
19
+ # fails because of the following in app/models/concerns/searchable.rb:
20
+ #
21
+ # Udongo.config.i18n.app.locales.each do |locale|
22
+ # value = translation(locale.to_sym).send(key) <---
23
+ # ...
24
+ # end
25
+ expect(object.locales).to include 'nl'
26
+ end
27
+ end
28
+
29
+ it '#translatable?' do
30
+ expect(build(klass)).to be_translatable
31
+ end
32
+
33
+ describe 'scopes' do
34
+ describe '.with_locale' do
35
+ it 'no results' do
36
+ expect(model.with_locale(:nl)).to eq []
37
+ end
38
+
39
+ it 'dutch only' do
40
+ field = model.translatable_fields_list.first
41
+
42
+ object = create(klass)
43
+ object.translation(:nl).send("#{field}=", 'foo')
44
+ object.save
45
+
46
+ expect(model.with_locale(:nl)).to eq [object]
47
+ end
48
+
49
+ it 'dutch and english' do
50
+ field = model.translatable_fields_list.first
51
+
52
+ object = create(klass)
53
+ object.translation(:nl).send("#{field}=", 'foo')
54
+ object.translation(:en).send("#{field}=", 'foo')
55
+ object.save
56
+
57
+ expect(model.with_locale(:nl)).to eq [object]
58
+ end
59
+ end
60
+ end
61
+
62
+ it '#respond_to?' do
63
+ expect(build(klass)).to respond_to(:translation, :translatable?)
64
+ end
65
+
66
+ it '.respond_to?' do
67
+ expect(model).to respond_to(
68
+ :translatable_field, :translatable_fields, :with_locale
69
+ )
70
+ end
71
+ end
@@ -0,0 +1,64 @@
1
+ require 'rails_helper'
2
+
3
+ shared_examples_for :visible do
4
+ let(:model) { described_class }
5
+ let(:klass) { model.to_s.underscore.to_sym }
6
+
7
+ describe 'scopes' do
8
+ it :visible do
9
+ a = create(klass, visible: true)
10
+ b = create(klass, visible: false)
11
+ expect(model.visible).to eq [a]
12
+ end
13
+
14
+ it :hidden do
15
+ a = create(klass, visible: true)
16
+ b = create(klass, visible: false)
17
+ expect(model.hidden).to eq [b]
18
+ end
19
+ end
20
+
21
+ context 'hidden' do
22
+ let(:item) { build(klass, visible: false) }
23
+
24
+ it '#hidden?' do
25
+ expect(item.hidden?).to be true
26
+ end
27
+
28
+ it '#hide!' do
29
+ item.hide!
30
+ expect(item.hidden?).to be true
31
+ end
32
+
33
+ it '#show!' do
34
+ item.show!
35
+ expect(item.visible?).to be true
36
+ end
37
+ end
38
+
39
+ context 'visible' do
40
+ let(:item) { build(klass, visible: true) }
41
+
42
+ it '#hidden?' do
43
+ expect(item.hidden?).to be false
44
+ end
45
+
46
+ it '#hide!' do
47
+ item.hide!
48
+ expect(item.hidden?).to be true
49
+ end
50
+
51
+ it '#show!' do
52
+ item.show!
53
+ expect(item.visible).to be true
54
+ end
55
+ end
56
+
57
+ it '.respond_to?' do
58
+ expect(model).to respond_to(:visible, :hidden)
59
+ end
60
+
61
+ it '#respond_to?' do
62
+ expect(model.new).to respond_to(:hidden?, :hide!, :show!)
63
+ end
64
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: udongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davy Hellemans
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-02-15 00:00:00.000000000 Z
12
+ date: 2017-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -451,6 +451,7 @@ files:
451
451
  - app/assets/stylesheets/backend/pages/_login.scss
452
452
  - app/assets/stylesheets/backend/udongo.scss
453
453
  - app/controllers/backend/admins_controller.rb
454
+ - app/controllers/backend/assets_controller.rb
454
455
  - app/controllers/backend/base_controller.rb
455
456
  - app/controllers/backend/content/rows/columns_controller.rb
456
457
  - app/controllers/backend/content/rows/images_controller.rb
@@ -504,6 +505,8 @@ files:
504
505
  - app/models/address.rb
505
506
  - app/models/admin.rb
506
507
  - app/models/application_record.rb
508
+ - app/models/asset.rb
509
+ - app/models/asset_image.rb
507
510
  - app/models/ckeditor/asset.rb
508
511
  - app/models/ckeditor/attachment_file.rb
509
512
  - app/models/ckeditor/picture.rb
@@ -517,6 +520,7 @@ files:
517
520
  - app/models/concerns/draggable.rb
518
521
  - app/models/concerns/emailable.rb
519
522
  - app/models/concerns/flexible_content.rb
523
+ - app/models/concerns/imageable.rb
520
524
  - app/models/concerns/locale.rb
521
525
  - app/models/concerns/loggable.rb
522
526
  - app/models/concerns/notable.rb
@@ -539,6 +543,7 @@ files:
539
543
  - app/models/content_text.rb
540
544
  - app/models/email.rb
541
545
  - app/models/email_template.rb
546
+ - app/models/image.rb
542
547
  - app/models/log.rb
543
548
  - app/models/meta.rb
544
549
  - app/models/navigation.rb
@@ -557,6 +562,7 @@ files:
557
562
  - app/models/tag.rb
558
563
  - app/models/tagged_item.rb
559
564
  - app/models/user.rb
565
+ - app/uploaders/asset_uploader.rb
560
566
  - app/uploaders/ckeditor_attachment_file_uploader.rb
561
567
  - app/uploaders/ckeditor_picture_uploader.rb
562
568
  - app/uploaders/content_image_uploader.rb
@@ -573,6 +579,11 @@ files:
573
579
  - app/views/backend/admins/edit.html.erb
574
580
  - app/views/backend/admins/index.html.erb
575
581
  - app/views/backend/admins/new.html.erb
582
+ - app/views/backend/assets/_filter.html.erb
583
+ - app/views/backend/assets/_form.html.erb
584
+ - app/views/backend/assets/edit.html.erb
585
+ - app/views/backend/assets/index.html.erb
586
+ - app/views/backend/assets/new.html.erb
576
587
  - app/views/backend/content/_image.html.erb
577
588
  - app/views/backend/content/_rows.html.erb
578
589
  - app/views/backend/content/_text.html.erb
@@ -722,6 +733,8 @@ files:
722
733
  - db/migrate/20170202170310_rename_key_to_name_for_search_indices.rb
723
734
  - db/migrate/20170212150903_cleanup_user_model.rb
724
735
  - db/migrate/20170215132531_add_active_to_users.rb
736
+ - db/migrate/20170225144523_create_assets.rb
737
+ - db/migrate/20170228183831_create_images.rb
725
738
  - lib/tasks/task_extras.rb
726
739
  - lib/tasks/udongo_tasks.rake
727
740
  - lib/udongo.rb
@@ -730,6 +743,7 @@ files:
730
743
  - lib/udongo/assets/precompiler.rb
731
744
  - lib/udongo/breadcrumb.rb
732
745
  - lib/udongo/config.rb
746
+ - lib/udongo/configs/assets.rb
733
747
  - lib/udongo/configs/base.rb
734
748
  - lib/udongo/configs/flexible_content.rb
735
749
  - lib/udongo/configs/i18n.rb
@@ -759,6 +773,56 @@ files:
759
773
  - lib/udongo/will_paginate/options.rb
760
774
  - lib/udongo/will_paginate/renderer.rb
761
775
  - readme.md
776
+ - spec/factories/addresses.rb
777
+ - spec/factories/admins.rb
778
+ - spec/factories/assets.rb
779
+ - spec/factories/comments.rb
780
+ - spec/factories/content_columns.rb
781
+ - spec/factories/content_images.rb
782
+ - spec/factories/content_rows.rb
783
+ - spec/factories/content_texts.rb
784
+ - spec/factories/email_templates.rb
785
+ - spec/factories/emails.rb
786
+ - spec/factories/images.rb
787
+ - spec/factories/logs.rb
788
+ - spec/factories/meta.rb
789
+ - spec/factories/navigation_items.rb
790
+ - spec/factories/navigations.rb
791
+ - spec/factories/notes.rb
792
+ - spec/factories/pages.rb
793
+ - spec/factories/queued_tasks.rb
794
+ - spec/factories/redirects.rb
795
+ - spec/factories/search_indices.rb
796
+ - spec/factories/search_modules.rb
797
+ - spec/factories/search_synonyms.rb
798
+ - spec/factories/settings.rb
799
+ - spec/factories/snippets.rb
800
+ - spec/factories/stores.rb
801
+ - spec/factories/tagged_items.rb
802
+ - spec/factories/tags.rb
803
+ - spec/factories/users.rb
804
+ - spec/support/concerns/cacheable.rb
805
+ - spec/support/concerns/commentable.rb
806
+ - spec/support/concerns/content_type.rb
807
+ - spec/support/concerns/deletable.rb
808
+ - spec/support/concerns/draggable.rb
809
+ - spec/support/concerns/emailable.rb
810
+ - spec/support/concerns/flexible_content.rb
811
+ - spec/support/concerns/imageable.rb
812
+ - spec/support/concerns/locale.rb
813
+ - spec/support/concerns/loggable.rb
814
+ - spec/support/concerns/notable.rb
815
+ - spec/support/concerns/parentable.rb
816
+ - spec/support/concerns/person.rb
817
+ - spec/support/concerns/publishable.rb
818
+ - spec/support/concerns/searchable.rb
819
+ - spec/support/concerns/seo.rb
820
+ - spec/support/concerns/sortable.rb
821
+ - spec/support/concerns/spammable.rb
822
+ - spec/support/concerns/storable.rb
823
+ - spec/support/concerns/taggable.rb
824
+ - spec/support/concerns/translatable.rb
825
+ - spec/support/concerns/visible.rb
762
826
  - vendor/assets/images/jstree/default/32px.png
763
827
  - vendor/assets/images/jstree/default/40px.png
764
828
  - vendor/assets/images/jstree/default/throbber.gif