dead_simple_cms 0.9.0

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