NACK.
I'm currently adding the spec for this to the story on the backlog -- give it about
20m and it'll be there. Please read it :)
Thanks,
Ken
On May 2, 2011, at 7:36 AM, tsedovic(a)redhat.com wrote:
From: Tomas Sedovic <tsedovic(a)redhat.com>
---
src/app/models/view_state.rb | 35 ++++++++++++++++
src/app/models/view_state_key_value.rb | 22 ++++++++++
.../20110502094034_create_view_state_key_values.rb | 15 +++++++
.../migrate/20110502094458_create_view_states.rb | 12 +++++
src/spec/factories/view_state.rb | 2 +
src/spec/factories/view_state_key_value.rb | 5 ++
src/spec/models/view_state_key_value_spec.rb | 44 ++++++++++++++++++++
src/spec/models/view_state_spec.rb | 27 ++++++++++++
8 files changed, 162 insertions(+), 0 deletions(-)
create mode 100644 src/app/models/view_state.rb
create mode 100644 src/app/models/view_state_key_value.rb
create mode 100644 src/db/migrate/20110502094034_create_view_state_key_values.rb
create mode 100644 src/db/migrate/20110502094458_create_view_states.rb
create mode 100644 src/spec/factories/view_state.rb
create mode 100644 src/spec/factories/view_state_key_value.rb
create mode 100644 src/spec/models/view_state_key_value_spec.rb
create mode 100644 src/spec/models/view_state_spec.rb
diff --git a/src/app/models/view_state.rb b/src/app/models/view_state.rb
new file mode 100644
index 0000000..9596c77
--- /dev/null
+++ b/src/app/models/view_state.rb
@@ -0,0 +1,35 @@
+# == Schema Information
+# Schema version: 20110502094458
+#
+# Table name: view_states
+#
+# id :integer not null, primary key
+# created_at :datetime
+# updated_at :datetime
+#
+
+class ViewState < ActiveRecord::Base
+ has_many :view_state_key_values
+
+ def [](key)
+ key = key.to_s if key.is_a? Symbol
+ kv = view_state_key_values.first :conditions => {:key => key}
+ kv.value unless kv.nil?
+ end
+
+ def []=(key, value)
+ key = key.to_s if key.is_a? Symbol
+
+ kv = view_state_key_values.first :conditions => {:key => key}
+ if kv.nil?
+ kv = ViewStateKeyValue.new(:key => key, :view_state_id => id)
+ end
+
+ kv.value = value
+ kv.save!
+ end
+
+ def to_hash
+ Hash[view_state_key_values.all.map {|kv| [kv.key, kv.value]}]
+ end
+end
diff --git a/src/app/models/view_state_key_value.rb
b/src/app/models/view_state_key_value.rb
new file mode 100644
index 0000000..4f25e84
--- /dev/null
+++ b/src/app/models/view_state_key_value.rb
@@ -0,0 +1,22 @@
+# == Schema Information
+# Schema version: 20110502094458
+#
+# Table name: view_state_key_values
+#
+# id :integer not null, primary key
+# key :string(255)
+# value :string(255)
+# view_state_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+#
+
+class ViewStateKeyValue < ActiveRecord::Base
+ belongs_to :view_state
+
+ validates_presence_of :key
+ validates_presence_of :value
+ validates_presence_of :view_state_id
+
+ validates_uniqueness_of :key, :scope => :view_state_id
+end
diff --git a/src/db/migrate/20110502094034_create_view_state_key_values.rb
b/src/db/migrate/20110502094034_create_view_state_key_values.rb
new file mode 100644
index 0000000..8d1927e
--- /dev/null
+++ b/src/db/migrate/20110502094034_create_view_state_key_values.rb
@@ -0,0 +1,15 @@
+class CreateViewStateKeyValues < ActiveRecord::Migration
+ def self.up
+ create_table :view_state_key_values do |t|
+ t.string :key, :null => false
+ t.string :value
+ t.integer :view_state_id, :null => false
+
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :view_state_key_values
+ end
+end
diff --git a/src/db/migrate/20110502094458_create_view_states.rb
b/src/db/migrate/20110502094458_create_view_states.rb
new file mode 100644
index 0000000..d8fcb34
--- /dev/null
+++ b/src/db/migrate/20110502094458_create_view_states.rb
@@ -0,0 +1,12 @@
+class CreateViewStates < ActiveRecord::Migration
+ def self.up
+ create_table :view_states do |t|
+
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :view_states
+ end
+end
diff --git a/src/spec/factories/view_state.rb b/src/spec/factories/view_state.rb
new file mode 100644
index 0000000..4024fcf
--- /dev/null
+++ b/src/spec/factories/view_state.rb
@@ -0,0 +1,2 @@
+Factory.define :view_state do |vs|
+end
diff --git a/src/spec/factories/view_state_key_value.rb
b/src/spec/factories/view_state_key_value.rb
new file mode 100644
index 0000000..d162927
--- /dev/null
+++ b/src/spec/factories/view_state_key_value.rb
@@ -0,0 +1,5 @@
+Factory.define :view_state_key_value do |kv|
+ kv.sequence(:key) { |n| "ViewStateKey#{n}" }
+ kv.sequence(:value) { |n| "ViewStateValue#{n}" }
+ kv.association :view_state
+end
diff --git a/src/spec/models/view_state_key_value_spec.rb
b/src/spec/models/view_state_key_value_spec.rb
new file mode 100644
index 0000000..3f84800
--- /dev/null
+++ b/src/spec/models/view_state_key_value_spec.rb
@@ -0,0 +1,44 @@
+require 'spec_helper'
+
+describe ViewStateKeyValue do
+
+ before(:each) do
+ end
+
+ it "should require a non-empty key" do
+ kv = Factory.build :view_state_key_value
+ kv.should be_valid
+
+ kv.key = nil
+ kv.should_not be_valid
+
+ kv.key = ""
+ kv.should_not be_valid
+ end
+
+ it "should require an association with ViewState" do
+ kv = Factory.build :view_state_key_value
+ kv.should be_valid
+
+ kv.view_state_id = nil
+ kv.should_not be_valid
+ end
+
+ it "should require that all the associated keys be unique" do
+ vs = Factory :view_state
+
+ kv1 = Factory :view_state_key_value, :view_state_id => vs.id
+ kv2 = Factory :view_state_key_value, :view_state_id => vs.id
+
+ kv1.should be_valid
+ kv2.should be_valid
+
+ kv1.key = kv2.key
+ kv1.should_not be_valid
+
+ different_view_state = Factory :view_state
+ kv1.view_state_id = different_view_state.id
+ kv1.should be_valid
+ end
+
+end
diff --git a/src/spec/models/view_state_spec.rb b/src/spec/models/view_state_spec.rb
new file mode 100644
index 0000000..d92a6d9
--- /dev/null
+++ b/src/spec/models/view_state_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe ViewState do
+
+ before(:each) do
+ @view_state = Factory :view_state
+ Factory :view_state_key_value, :key => "sort", :value =>
"id", :view_state_id => @view_state.id
+ Factory :view_state_key_value, :key => "sort-direction", :value =>
"asc", :view_state_id => @view_state.id
+ end
+
+ it "should provide a way to access keys" do
+ @view_state.to_hash.keys.sort.should eql(['sort',
'sort-direction'])
+ end
+
+ it "should provide a way to access values" do
+ @view_state[:sort].should eql("id")
+ end
+
+ it "should provide a way to set values" do
+ @view_state[:newkey] = "new value"
+
+ @view_state[:newkey].should eql("new value")
+
+ kv = ViewStateKeyValue.first :conditions => {:key => "newkey"}
+ kv.value.should eql("new value")
+ end
+end
--
1.7.4.4
_______________________________________________
aeolus-devel mailing list
aeolus-devel(a)lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/aeolus-devel