udongo 5.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
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