dead_simple_cms 0.9.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 (66) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/README.md +266 -0
  6. data/Rakefile +17 -0
  7. data/dead_simple_cms.gemspec +47 -0
  8. data/lib/dead_simple_cms.rb +132 -0
  9. data/lib/dead_simple_cms/attribute/collection.rb +45 -0
  10. data/lib/dead_simple_cms/attribute/type/all.rb +104 -0
  11. data/lib/dead_simple_cms/attribute/type/base.rb +79 -0
  12. data/lib/dead_simple_cms/attribute/type/collection_support.rb +26 -0
  13. data/lib/dead_simple_cms/configuration.rb +50 -0
  14. data/lib/dead_simple_cms/file_uploader/base.rb +29 -0
  15. data/lib/dead_simple_cms/group.rb +58 -0
  16. data/lib/dead_simple_cms/group/configuration.rb +32 -0
  17. data/lib/dead_simple_cms/group/presenter.rb +23 -0
  18. data/lib/dead_simple_cms/rails/action_controller/extensions.rb +24 -0
  19. data/lib/dead_simple_cms/rails/action_controller/fragment_sweeper.rb +19 -0
  20. data/lib/dead_simple_cms/rails/action_view/extensions.rb +14 -0
  21. data/lib/dead_simple_cms/rails/action_view/form_builders/default.rb +16 -0
  22. data/lib/dead_simple_cms/rails/action_view/form_builders/interface.rb +72 -0
  23. data/lib/dead_simple_cms/rails/action_view/form_builders/simple_form.rb +43 -0
  24. data/lib/dead_simple_cms/rails/action_view/form_builders/simple_form_with_bootstrap.rb +19 -0
  25. data/lib/dead_simple_cms/rails/action_view/presenter.rb +63 -0
  26. data/lib/dead_simple_cms/section.rb +103 -0
  27. data/lib/dead_simple_cms/section/builder.rb +73 -0
  28. data/lib/dead_simple_cms/storage/base.rb +49 -0
  29. data/lib/dead_simple_cms/storage/database.rb +33 -0
  30. data/lib/dead_simple_cms/storage/memory.rb +20 -0
  31. data/lib/dead_simple_cms/storage/rails_cache.rb +19 -0
  32. data/lib/dead_simple_cms/storage/redis.rb +23 -0
  33. data/lib/dead_simple_cms/util/identifier.rb +40 -0
  34. data/lib/dead_simple_cms/util/identifier/dictionary.rb +65 -0
  35. data/lib/dead_simple_cms/version.rb +3 -0
  36. data/spec/dead_simple_cms/attribute/collection_spec.rb +46 -0
  37. data/spec/dead_simple_cms/attribute/type/all_spec.rb +252 -0
  38. data/spec/dead_simple_cms/attribute/type/base_spec.rb +117 -0
  39. data/spec/dead_simple_cms/configuration_spec.rb +117 -0
  40. data/spec/dead_simple_cms/file_uploader/base_spec.rb +35 -0
  41. data/spec/dead_simple_cms/group/configuration_spec.rb +24 -0
  42. data/spec/dead_simple_cms/group/presenter_spec.rb +28 -0
  43. data/spec/dead_simple_cms/group_spec.rb +65 -0
  44. data/spec/dead_simple_cms/rails/action_view/form_builders/default_spec.rb +8 -0
  45. data/spec/dead_simple_cms/rails/action_view/form_builders/simple_form_spec.rb +8 -0
  46. data/spec/dead_simple_cms/rails/action_view/form_builders/simple_form_with_bootstrap_spec.rb +8 -0
  47. data/spec/dead_simple_cms/rails/action_view/fragment_sweeper_spec.rb +22 -0
  48. data/spec/dead_simple_cms/rails/action_view/presenter_spec.rb +54 -0
  49. data/spec/dead_simple_cms/section/builder_spec.rb +28 -0
  50. data/spec/dead_simple_cms/section_spec.rb +78 -0
  51. data/spec/dead_simple_cms/storage/base_spec.rb +59 -0
  52. data/spec/dead_simple_cms/storage/database_spec.rb +51 -0
  53. data/spec/dead_simple_cms/storage/memory_spec.rb +25 -0
  54. data/spec/dead_simple_cms/storage/rails_cache_spec.rb +33 -0
  55. data/spec/dead_simple_cms/storage/redis_spec.rb +33 -0
  56. data/spec/dead_simple_cms/util/identifier/dictionary/duplciate_item_spec.rb +10 -0
  57. data/spec/dead_simple_cms/util/identifier/dictionary/invalid_entry_class_spec.rb +10 -0
  58. data/spec/dead_simple_cms/util/identifier/dictionary_spec.rb +42 -0
  59. data/spec/dead_simple_cms/util/identifier_spec.rb +27 -0
  60. data/spec/setup.rb +26 -0
  61. data/spec/setup/banner_presenter.rb +19 -0
  62. data/spec/setup/rspec_template_builder.rb +104 -0
  63. data/spec/setup/shared.rb +57 -0
  64. data/spec/setup/test_file_uploader.rb +12 -0
  65. data/spec/spec_helper.rb +48 -0
  66. metadata +221 -0
@@ -0,0 +1,117 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Attribute::Type::Base do
4
+
5
+ module DeadSimpleCMS
6
+ module Attribute
7
+ module Type
8
+ class FakeAttribute < Base
9
+ self.default_input_type = :string
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ let(:fake_attribute_class) { DeadSimpleCMS::Attribute::Type::FakeAttribute }
16
+ let(:group_hierarchy) do
17
+ klass = DeadSimpleCMS::Group
18
+ [klass.root, klass.new(:second), klass.new(:third)]
19
+ end
20
+
21
+ subject { fake_attribute_class.new(:fake_identifier, :label => "Fake Label", :default => 413, :hint => "some hint",
22
+ :group_hierarchy => group_hierarchy) }
23
+
24
+ describe ".builder_method_name" do
25
+ it "should derive from the class name" do
26
+ fake_attribute_class.builder_method_name.should == "fake_attribute"
27
+ end
28
+ end
29
+
30
+ its(:label) { should == "Fake Label" }
31
+ its(:identifier) { should == :fake_identifier }
32
+ its(:default_input_type) { should == :string }
33
+ its(:input_type) { should == :string }
34
+ its(:hint) { should == "some hint" }
35
+ its(:required) { should be false }
36
+ its(:group_hierarchy) { should == group_hierarchy }
37
+ its(:section_identifier) { should == :root_second_third_fake_identifier }
38
+
39
+ describe "#label=" do
40
+ it "should be able to set a new label" do
41
+ subject.label = "New Label"
42
+ subject.label.should == "New Label"
43
+ end
44
+ end
45
+
46
+ describe "#root_group?" do
47
+
48
+ its (:root_group?) { should be false }
49
+
50
+ context "when last group is root" do
51
+ before(:each) { subject.group_hierarchy << DeadSimpleCMS::Group.root }
52
+
53
+ its (:root_group?) { should be true }
54
+ end
55
+ end
56
+
57
+ describe "#default" do
58
+
59
+ its (:default) { should == 413 }
60
+
61
+ context "when default is passed in as a Proc" do
62
+ before(:each) do
63
+ delayed_value = 123
64
+ subject.instance_variable_set(:@default, lambda { delayed_value } )
65
+ end
66
+
67
+ its (:default) { should == 123 }
68
+
69
+ end
70
+ end
71
+
72
+ describe "#value" do
73
+
74
+ context "when @value is set" do
75
+ before(:each) { subject.instance_variable_set(:@value, nil) }
76
+
77
+ its(:value) { should be nil }
78
+
79
+ it "should not attempt to hit the storage" do
80
+ subject.should_receive(:attributes_from_storage).never
81
+ subject.value
82
+ end
83
+ end
84
+
85
+ context "when @value is not set" do
86
+ it "should read the attribute from the storage" do
87
+ subject.should_receive(:attributes_from_storage).and_return(subject.section_identifier => :bar)
88
+ subject.value.should == :bar
89
+ end
90
+
91
+ it "should not fallback on the default if the attribute is present in the storage" do
92
+ subject.should_receive(:attributes_from_storage).and_return(subject.section_identifier => nil)
93
+ subject.value.should be nil
94
+ end
95
+ end
96
+
97
+ end
98
+
99
+ describe "#value=" do
100
+
101
+ it "should convert the value" do
102
+ subject.should_receive(:convert_value).with("value")
103
+ subject.value = "value"
104
+ end
105
+
106
+ end
107
+
108
+ describe "#convert_value" do
109
+
110
+ it "should return nil if the value is blank" do
111
+ subject.send(:convert_value, "").should be nil
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
@@ -0,0 +1,117 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Configuration do
4
+
5
+ describe "#section" do
6
+
7
+ let(:identifier) { :some_section }
8
+
9
+ around(:each) do |example|
10
+ subject.section(identifier)
11
+ example.run
12
+ DeadSimpleCMS.sections.delete(identifier)
13
+ end
14
+
15
+ it "should create a helper method for the section" do
16
+ DeadSimpleCMS.sections.should respond_to(identifier)
17
+ end
18
+
19
+ it "should add the section to DeadSimpleCMS.sections" do
20
+ DeadSimpleCMS.sections.key?(identifier)
21
+ end
22
+ end
23
+
24
+ describe "#group_configuration" do
25
+
26
+ let(:identifier) { :some_group_configuration }
27
+
28
+ around(:each) do |example|
29
+ subject.group_configuration(identifier) { }
30
+ example.run
31
+ DeadSimpleCMS.group_configurations.delete(identifier)
32
+ end
33
+
34
+ it "shoudl add the group configuration to the DeadSimpleCMS.group_configurations" do
35
+ DeadSimpleCMS.group_configurations.key?(identifier)
36
+ end
37
+
38
+ end
39
+
40
+ describe "#register_attribute_classes" do
41
+
42
+ let(:attribute_class) { DeadSimpleCMS::Attribute::Type::Text }
43
+
44
+ it "should define an attribute method on the Section::Builder class" do
45
+ DeadSimpleCMS::Section::Builder.should_receive(:define_attribute_builder_method).with(attribute_class)
46
+ subject.register_attribute_classes(attribute_class)
47
+ end
48
+
49
+ it "shoudl define an attribute method on the Group::Configuration class" do
50
+ DeadSimpleCMS::Group::Configuration.should_receive(:define_attribute_builder_method).with(attribute_class)
51
+ subject.register_attribute_classes(attribute_class)
52
+ end
53
+
54
+ end
55
+
56
+ describe "#storage_class" do
57
+
58
+ around(:each) do |example|
59
+ tmp = DeadSimpleCMS::Section.storage_class
60
+ example.run
61
+ DeadSimpleCMS::Section.storage_class = tmp
62
+ end
63
+
64
+ it "should set the storage class with a Symbol" do
65
+ subject.storage_class :database
66
+ subject.storage_class.should == DeadSimpleCMS::Storage::Database
67
+ end
68
+
69
+ end
70
+
71
+ describe "#storage_serializer_class" do
72
+
73
+ around(:each) do |example|
74
+ tmp = DeadSimpleCMS::Storage::Base.serializer_class
75
+ example.run
76
+ DeadSimpleCMS::Storage::Base.serializer_class = tmp
77
+ end
78
+
79
+ it "should set the storage serializer" do
80
+ subject.storage_serializer_class(:klass)
81
+ subject.storage_serializer_class.should == :klass
82
+ end
83
+
84
+ end
85
+
86
+ describe "#default_form_builder" do
87
+
88
+ around(:each) do |example|
89
+ tmp = DeadSimpleCMS::Rails::ActionView::Presenter.form_builder
90
+ example.run
91
+ DeadSimpleCMS::Rails::ActionView::Presenter.form_builder = tmp
92
+ end
93
+
94
+ it "should set the default form builder with a symbol" do
95
+ subject.default_form_builder(:default)
96
+ subject.default_form_builder.should == DeadSimpleCMS::Rails::ActionView::FormBuilders::Default
97
+ end
98
+
99
+ end
100
+
101
+ describe "#file_uploader_class" do
102
+
103
+ around(:each) do |example|
104
+ tmp = DeadSimpleCMS::Attribute::Type::File.uploader_class
105
+ example.run
106
+ DeadSimpleCMS::Attribute::Type::File.uploader_class = tmp
107
+ end
108
+
109
+ it "should set the file uploader class" do
110
+ subject.file_uploader_class(:klass)
111
+ subject.file_uploader_class.should == :klass
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::FileUploader::Base do
4
+
5
+ let(:file_attribute) do
6
+ DeadSimpleCMS::Attribute::Type::File.new(:image, :file_ext => "jpg").tap do |file_attribute|
7
+ file_attribute.data = :data
8
+ end
9
+ end
10
+
11
+ subject { described_class.new(file_attribute) }
12
+
13
+ its(:file_attribute) { should == file_attribute }
14
+ its(:file_ext) { should == file_attribute.file_ext }
15
+ its(:data) { should == file_attribute.data }
16
+
17
+ specify { lambda { subject.upload! }.should raise_error(NotImplementedError, "Please overwrite this with your own upload functionality.") }
18
+ specify { lambda { subject.url }.should raise_error(NotImplementedError, "Please overwrite this with your own url constructor.") }
19
+
20
+ describe "#path" do
21
+
22
+ before(:each) do
23
+ file_attribute.stub(:group_hierarchy).and_return([DeadSimpleCMS::Group.new(:foo), DeadSimpleCMS::Group.new(:bar)])
24
+ file_attribute.stub(:section).and_return(DeadSimpleCMS::Section.new(:car))
25
+ end
26
+
27
+ its(:path) { should == "dead_simple_cms/car/foo/bar/image.jpg" }
28
+
29
+ it "should remove nils when joining" do
30
+ subject.path(nil).should == "car/foo/bar/image.jpg"
31
+ end
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Group::Configuration do
4
+
5
+ let(:options) { {} }
6
+
7
+ subject do
8
+ described_class.new(:group_configuration_identifier, options) do
9
+ string :string_var, :default => true
10
+ end
11
+ end
12
+
13
+ include_examples :group_display
14
+
15
+ its(:identifier) { should == :group_configuration_identifier }
16
+
17
+ describe ".define_attribute_builder_method" do
18
+
19
+ it "should add to the attribute_arguments" do
20
+ subject.attribute_arguments[:string_var].should == ["string", {:default => true}]
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Group::Presenter do
4
+
5
+ let(:view_context) { double("view context") }
6
+ let(:group) { DeadSimpleCMS::Group.new(:group_identifier) }
7
+ let(:sample_presenter_class) do
8
+ Class.new(described_class) do
9
+ attr_reader :sample_argument
10
+ def initialize_extra_arguments(sample_argument)
11
+ @sample_argument = sample_argument
12
+ end
13
+ end
14
+ end
15
+
16
+ subject { sample_presenter_class.new(view_context, group, "sample argument") }
17
+
18
+ its(:group) { should == group }
19
+
20
+ its(:sample_argument) { should == "sample argument" }
21
+
22
+ it "should delegate methods to the view_context" do
23
+ view_context.stub(:some_method).and_return(:value)
24
+ subject.some_method.should == :value
25
+ end
26
+
27
+ end
28
+
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Group do
4
+
5
+ let(:options) { {} }
6
+ subject { described_class.new(:group_identifier, options) }
7
+
8
+ its(:identifier) { should == :group_identifier }
9
+ its(:groups) { should be_an_instance_of DeadSimpleCMS::Util::Identifier::Dictionary }
10
+
11
+ include_examples :group_display
12
+
13
+ describe ".root" do
14
+ specify { described_class.root.should be_an_instance_of described_class }
15
+ end
16
+
17
+ describe "#presenter" do
18
+ context "when presenter_class is set" do
19
+
20
+ let(:presenter_class) { Struct.new(:view_context) }
21
+
22
+ before(:each) { subject.display(presenter_class) }
23
+
24
+ specify { subject.presenter(:view_context).should be_an_instance_of presenter_class }
25
+
26
+ end
27
+ end
28
+
29
+ describe "#render" do
30
+
31
+ end
32
+
33
+ describe "#root?" do
34
+
35
+ its(:root?) { should be false }
36
+
37
+ context "when identifier is ROOT_IDENTIFIER" do
38
+ subject { described_class.new(described_class::ROOT_IDENTIFIER) }
39
+ its(:root?) { should be true }
40
+ end
41
+
42
+ end
43
+
44
+ describe "#add_group" do
45
+
46
+ let(:nested_group) { described_class.new(:nested_group) }
47
+ before(:each) { subject.add_group(nested_group) }
48
+
49
+ it "should add the group to the #groups" do
50
+ subject.groups.keys.should include(:nested_group)
51
+ end
52
+
53
+ it "should create a group reader and return it" do
54
+ subject.nested_group.should == nested_group
55
+ end
56
+
57
+ it "should create an _attributes= writer" do
58
+ nested_group.should_receive(:update_attributes).with(:value)
59
+ subject.nested_group_attributes = :value
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Rails::ActionView::FormBuilders::Default do
4
+
5
+ # TODO: Write tests for default form builders
6
+
7
+ end
8
+
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Rails::ActionView::FormBuilders::SimpleForm do
4
+
5
+ # TODO: Write tests for default SimpleForm builders
6
+
7
+ end
8
+
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Rails::ActionView::FormBuilders::SimpleFormWithBootstrap do
4
+
5
+ # TODO: Write tests for simple form with bootstrap
6
+
7
+ end
8
+
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe DeadSimpleCMS::Rails::ActionView::FragmentSweeper do
4
+
5
+ before(:each) do
6
+
7
+ end
8
+
9
+ describe ".instance" do
10
+
11
+ end
12
+
13
+ describe "#observed_classes" do
14
+
15
+ end
16
+
17
+ describe "#after_save" do
18
+
19
+ end
20
+
21
+ end
22
+