netzke-core 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ v0.2.2
2
+ js_ext_config instance method added for overwriting
3
+ Multiuser support
4
+ Using Rails.logger for logging
5
+ "config"-class method for every class inheriting Netzke::Base - for class-level configurations
6
+
1
7
  v0.2.1
2
8
  Fixed the path to ext-base-min.js for production mode.
3
9
  Also works in Safari now.
data/Manifest CHANGED
@@ -35,8 +35,10 @@ test/app_root/config/environments/postgresql.rb
35
35
  test/app_root/config/environments/sqlite.rb
36
36
  test/app_root/config/environments/sqlite3.rb
37
37
  test/app_root/config/routes.rb
38
+ test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb
38
39
  test/app_root/script/console
39
40
  test/core_ext_test.rb
40
41
  test/netzke_core_test.rb
42
+ test/netzke_preference_test.rb
41
43
  test/test_helper.rb
42
44
  uninstall.rb
data/README.mdown CHANGED
@@ -1,11 +1,12 @@
1
- netzke-core
2
- ==========
1
+ # netzke-core
2
+ Create Ext JS + Rails reusable components (widgets) with minimum effort.
3
3
 
4
- Create ExtJS/Rails reusable components (widgets) with minimum effort.
4
+ Note that if you would like to modify this code or experiment with it, you may be better off cloning this project into your app's vendor/plugin directory - it will then behave as a Rails plugin.
5
5
 
6
- Example
7
- =======
6
+ # Example
8
7
 
9
8
  See the tutorials on http://blog.writelesscode.com
10
9
 
11
- Copyright (c) 2008 Sergei Kozlov, released under the MIT license
10
+ Also see the netzke-basepack project.
11
+
12
+ Copyright (c) 2008-2009 Sergei Kozlov, released under the MIT license
@@ -1,8 +1,22 @@
1
1
  class NetzkeLayout < ActiveRecord::Base
2
2
  UNRELATED_ATTRS = %w(created_at updated_at position layout_id)
3
3
 
4
+ # Multi user support
5
+ def self.user
6
+ @@user ||= nil
7
+ end
8
+
9
+ def self.user=(user)
10
+ @@user = user
11
+ end
12
+
4
13
  def self.user_id
5
- @@user_id ||= nil
14
+ user && user.id
15
+ end
16
+
17
+ # normal create, but with a user_id merged-in
18
+ def self.create_with_user(config)
19
+ create(config.merge(:user_id => user_id))
6
20
  end
7
21
 
8
22
  def layout_items
@@ -10,7 +24,7 @@ class NetzkeLayout < ActiveRecord::Base
10
24
  end
11
25
 
12
26
  def self.by_widget(widget_name)
13
- self.find(:first, :conditions => {:widget_name => widget_name, :user_id => self.user_id})
27
+ self.find(:first, :conditions => {:widget_name => widget_name, :user_id => user_id})
14
28
  end
15
29
 
16
30
  def move_item(old_index, new_index)
@@ -1,12 +1,23 @@
1
+ # TODO: would be great to support somethnig like:
2
+ # NetzkePreference["name"].merge!({:a => 1, :b => 2}) # if NetzkePreference["name"] returns a hash
3
+ # or
4
+ # NetzkePreference["name"] << 2 # if NetzkePreference["name"] returns an array
5
+ # etc
6
+ #
1
7
  class NetzkePreference < ActiveRecord::Base
2
- CONVERTION_METHODS= {'Fixnum' => 'to_i', 'String' => 'to_s', 'Float' => 'to_f', 'Symbol' => 'to_sym'}
3
-
8
+ ELEMENTARY_CONVERTION_METHODS= {'Fixnum' => 'to_i', 'String' => 'to_s', 'Float' => 'to_f', 'Symbol' => 'to_sym'}
9
+
10
+ # Multi user support
11
+ def self.user
12
+ @@user ||= nil
13
+ end
14
+
4
15
  def self.user=(user)
5
16
  @@user = user
6
17
  end
7
18
 
8
- def self.user
9
- @@user ||= nil
19
+ def self.user_id
20
+ user && user.id
10
21
  end
11
22
 
12
23
  def self.widget_name=(value)
@@ -27,19 +38,21 @@ class NetzkePreference < ActiveRecord::Base
27
38
  r = norm_value == 'false' ? false : (norm_value == 'true' || norm_value)
28
39
  elsif klass == 'NilClass'
29
40
  r = nil
30
- elsif klass == 'Array'
41
+ elsif klass == 'Array' || klass == 'Hash'
31
42
  r = JSON.parse(norm_value)
32
43
  else
33
- r = norm_value.send(CONVERTION_METHODS[klass])
44
+ r = norm_value.send(ELEMENTARY_CONVERTION_METHODS[klass])
34
45
  end
35
46
  r
36
47
  end
37
48
 
38
49
  def normalized_value=(new_value)
39
50
  # norm_value = (new_value.to_s if new_value == true or new_value == false) || new_value
40
- case new_value.class.to_s
51
+ case new_value.class.name
41
52
  when "Array"
42
53
  write_attribute(:value, new_value.to_json)
54
+ when "Hash"
55
+ write_attribute(:value, new_value.to_json)
43
56
  else
44
57
  write_attribute(:value, new_value.to_s)
45
58
  end
@@ -48,7 +61,7 @@ class NetzkePreference < ActiveRecord::Base
48
61
 
49
62
  def self.[](pref_name)
50
63
  pref_name = pref_name.to_s
51
- conditions = {:name => pref_name, :user_id => self.user, :widget_name => self.widget_name}
64
+ conditions = {:name => pref_name, :user_id => user_id, :widget_name => self.widget_name}
52
65
  pref = self.find(:first, :conditions => conditions)
53
66
  # pref = @@user.nil? ? self.find_by_name(pref_name) : self.find_by_name_and_user_id(pref_name, @@user.id)
54
67
  pref && pref.normalized_value
@@ -56,11 +69,17 @@ class NetzkePreference < ActiveRecord::Base
56
69
 
57
70
  def self.[]=(pref_name, new_value)
58
71
  pref_name = pref_name.to_s
59
- conditions = {:name => pref_name, :user_id => self.user, :widget_name => self.widget_name}
60
- pref = self.find(:first, :conditions => conditions) || self.create(conditions)
61
- # pref = self.user.nil? ? self.find_or_create_by_name(pref_name) : self.find_or_create_by_name_and_user_id(pref_name, self.user.id)
62
- pref.normalized_value = new_value
63
- pref.save!
72
+ conditions = {:name => pref_name, :user_id => user_id, :widget_name => self.widget_name}
73
+ pref = self.find(:first, :conditions => conditions)
74
+
75
+ # if assigning nil, simply delete the eventually found preference
76
+ if new_value.nil?
77
+ pref && pref.destroy
78
+ else
79
+ pref ||= self.new(conditions)
80
+ pref.normalized_value = new_value
81
+ pref.save!
82
+ end
64
83
  end
65
84
 
66
85
  end
data/lib/netzke/base.rb CHANGED
@@ -4,43 +4,41 @@ module Netzke
4
4
  #
5
5
  # Configuration:
6
6
  # * Define NETZKE_BOOT_CONFIG in environment.rb to specify which Netzke functionality should be disabled
7
- # to reduce the size of /netzke/netzke.[js|css]. Those Netzke gems that use additional JS-code
7
+ # to reduce the size of /netzke/netzke.[js|css]. Those Netzke gems that use additional JS/CSS-code
8
8
  # should be aware of this constant.
9
9
  #
10
10
  class Base
11
- # Helper class to read/write from/to widget's persistent preferences. TODO: rework it.
12
- class Config
13
- def initialize(widget_name)
14
- @widget_name = widget_name
15
- end
16
- def []=(k,v)
17
- NetzkePreference.widget_name = @widget_name
18
- NetzkePreference[k] = v
19
- end
20
- def [](k)
21
- NetzkePreference.widget_name = @widget_name
22
- NetzkePreference[k]
23
- end
24
- end
25
-
26
11
  # Client-side code (generates JS-class of the widget)
27
12
  include Netzke::JsClassBuilder
28
13
 
29
- # Class methods
30
- class << self
31
- # Global Netzke configuration
14
+ module ClassMethods
15
+
16
+ # Global Netzke::Base configuration
32
17
  def config
33
- @@config ||= {
34
- # locations of javascript and css files (which will be automatically collected into one file and sent as /netzke/netzke.js and /netzke/netzke.css respectively)
18
+ set_default_config({
35
19
  :javascripts => [],
36
- :css => []
37
- }
20
+ :css => [],
21
+ :layout_manager => "NetzkeLayout",
22
+ :persistent_config_manager => "NetzkePreference"
23
+ })
38
24
  end
39
-
25
+
40
26
  def short_widget_class_name
41
27
  name.split("::").last
42
28
  end
43
29
 
30
+ def user
31
+ @@user ||= nil
32
+ end
33
+
34
+ def user=(user)
35
+ @@user = user
36
+
37
+ # also set up the managers
38
+ persistent_config_manager_class && persistent_config_manager_class.user = user
39
+ layout_manager_class && layout_manager_class.user = user
40
+ end
41
+
44
42
  #
45
43
  # Use this class method to declare connection points between client side of a widget and its server side. A method in a widget class with the same name will be (magically) called by the client side of the widget. See Grid widget for an example
46
44
  #
@@ -72,24 +70,58 @@ module Netzke
72
70
  widget_class = "Netzke::#{config[:widget_class_name]}".constantize
73
71
  widget_class.new(config)
74
72
  end
73
+
74
+ def persistent_config_manager_class
75
+ config[:persistent_config_manager].constantize
76
+ rescue NameError
77
+ nil
78
+ end
79
+
80
+ def layout_manager_class
81
+ Netzke::Base.config[:layout_manager].constantize
82
+ rescue NameError
83
+ nil
84
+ end
85
+
86
+ private
87
+ def set_default_config(default_config)
88
+ @@config ||= {}
89
+ @@config[self.name] ||= default_config
90
+ @@config[self.name]
91
+ end
92
+
75
93
  end
76
-
94
+ extend ClassMethods
95
+
77
96
  attr_accessor :config, :server_confg, :parent, :logger, :id_name, :permissions
78
97
  attr_reader :pref
79
98
 
80
99
  def initialize(config = {}, parent = nil)
81
- @logger = Logger.new("debug.log")
82
100
  @config = initial_config.recursive_merge(config)
83
101
  @parent = parent
84
102
  @id_name = parent.nil? ? config[:name].to_s : "#{parent.id_name}__#{config[:name]}"
85
103
 
86
104
  @flash = []
87
- @pref = Config.new(@id_name)
88
105
 
89
106
  @config[:ext_config] ||= {} # configuration used to instantiate JS class
90
-
107
+
91
108
  process_permissions_config
92
109
  end
110
+
111
+ # Rails' logger
112
+ def logger
113
+ Rails.logger
114
+ end
115
+
116
+ # Store some setting in the database as if it was a hash, e.g.:
117
+ # persistent_config["window.size"] = 100
118
+ # persistent_config["window.size"] => 100
119
+ # This method is current_user-aware
120
+ def persistent_config
121
+ config_klass = self.class.persistent_config_manager_class
122
+ config_klass && config_klass.widget_name = id_name # pass to the config class our unique name
123
+ config_klass || {} # if we don't have the presistent config manager, all the calls to it will always return nil, and the "="-operation will be ignored
124
+ end
93
125
 
94
126
  def initial_config
95
127
  {}
@@ -185,9 +217,10 @@ module Netzke
185
217
  config[:allow] = [config[:allow]] if config[:allow].is_a?(Symbol) # so that config[:allow] => :write works
186
218
  config[:allow] && config[:allow].each{|p| @permissions.merge!(p.to_sym => true)} # allow
187
219
 
188
- # ... and then merge it with NetzkePreferences (if not instantiated to only generate JS-class code)
220
+ # ... and then merge it with NetzkePreferences
189
221
  available_permissions.each do |p|
190
- @permissions[p.to_sym] = @pref["permissions.#{p}"] if !@pref["permissions.#{p}"].nil?
222
+ persistent_permisson = persistent_config["permissions.#{p}"]
223
+ @permissions[p.to_sym] = persistent_permisson unless persistent_permisson.nil?
191
224
  end
192
225
  end
193
226
  end
@@ -2,6 +2,12 @@ module Netzke
2
2
  module ControllerExtensions
3
3
  def self.included(base)
4
4
  base.extend ControllerClassMethods
5
+ base.send(:before_filter, :set_user)
6
+ end
7
+
8
+ # pickup
9
+ def set_user
10
+ Netzke::Base.user = current_user if defined?(current_user)
5
11
  end
6
12
 
7
13
  def method_missing(method_name)
@@ -29,7 +29,7 @@ module Netzke
29
29
 
30
30
  res.merge!(:widget_class_name => short_widget_class_name)
31
31
 
32
- res.merge!(config[:ext_config])
32
+ res.merge!(js_ext_config)
33
33
  res.merge!(:id => @id_name)
34
34
 
35
35
  # include tools and actions
@@ -41,11 +41,13 @@ module Netzke
41
41
  # include permissions
42
42
  res.merge!(:permissions => permissions) unless available_permissions.empty?
43
43
 
44
- # include eventual region_config
45
- res.merge!(:region_config => config[:region_config])
46
44
  res
47
45
  end
48
46
 
47
+ def js_ext_config
48
+ config[:ext_config] || {}
49
+ end
50
+
49
51
  # Generate instantiating - used when a widget is generated stand-alone (as a part of a HTML page)
50
52
  def js_widget_instance
51
53
  %Q(var #{config[:name].to_js} = new Ext.componentCache['#{short_widget_class_name}'](#{js_config.to_js});)
data/lib/netzke-core.rb CHANGED
@@ -19,25 +19,21 @@ require 'vendor/facets/hash/recursive_merge'
19
19
  end
20
20
 
21
21
  if defined? ActionController
22
- # Provide controllers with netzke class method
23
22
  ActionController::Base.class_eval do
24
23
  include Netzke::ControllerExtensions
25
24
  end
26
25
 
27
- # Include the route to netzke controller
26
+ # Include the route to the Netzke controller
28
27
  ActionController::Routing::RouteSet::Mapper.send :include, Netzke::Routing::MapperExtensions
29
28
  end
30
29
 
31
30
  if defined? ActionView
32
- # Helpers to be put into layouts
33
31
  ActionView::Base.send :include, Netzke::ActionViewExt
34
32
  end
35
33
 
36
- # Make this plugin auto-reloaded for easier development
34
+ # Make this plugin auto-reloadable for easier development
37
35
  ActiveSupport::Dependencies.load_once_paths.delete(File.join(File.dirname(__FILE__)))
38
36
 
39
- # Include the javascript
37
+ # Include javascript & styles
40
38
  Netzke::Base.config[:javascripts] << "#{File.dirname(__FILE__)}/../javascripts/core.js"
41
-
42
- # Include CSS
43
39
  Netzke::Base.config[:css] << "#{File.dirname(__FILE__)}/../css/core.css"
data/netzke-core.gemspec CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{netzke-core}
5
- s.version = "0.2.1"
5
+ s.version = "0.2.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sergei Kozlov"]
9
- s.date = %q{2009-01-07}
9
+ s.date = %q{2009-01-23}
10
10
  s.description = %q{Build ExtJS/Rails widgets with minimum effort}
11
11
  s.email = %q{sergei@writelesscode.com}
12
12
  s.extra_rdoc_files = ["CHANGELOG", "lib/app/controllers/netzke_controller.rb", "lib/app/models/netzke_layout.rb", "lib/app/models/netzke_preference.rb", "lib/netzke/action_view_ext.rb", "lib/netzke/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/feedback_ghost.rb", "lib/netzke/js_class_builder.rb", "lib/netzke/routing.rb", "lib/netzke-core.rb", "lib/vendor/facets/hash/recursive_merge.rb", "LICENSE", "README.mdown", "tasks/netzke_core_tasks.rake"]
13
- s.files = ["CHANGELOG", "css/core.css", "generators/netzke_core/netzke_core_generator.rb", "generators/netzke_core/templates/create_netzke_layouts.rb", "generators/netzke_core/templates/create_netzke_preferences.rb", "generators/netzke_core/USAGE", "init.rb", "install.rb", "javascripts/core.js", "lib/app/controllers/netzke_controller.rb", "lib/app/models/netzke_layout.rb", "lib/app/models/netzke_preference.rb", "lib/netzke/action_view_ext.rb", "lib/netzke/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/feedback_ghost.rb", "lib/netzke/js_class_builder.rb", "lib/netzke/routing.rb", "lib/netzke-core.rb", "lib/vendor/facets/hash/recursive_merge.rb", "LICENSE", "Manifest", "netzke-core.gemspec", "Rakefile", "README.mdown", "tasks/netzke_core_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/script/console", "test/core_ext_test.rb", "test/netzke_core_test.rb", "test/test_helper.rb", "uninstall.rb"]
13
+ s.files = ["CHANGELOG", "css/core.css", "generators/netzke_core/netzke_core_generator.rb", "generators/netzke_core/templates/create_netzke_layouts.rb", "generators/netzke_core/templates/create_netzke_preferences.rb", "generators/netzke_core/USAGE", "init.rb", "install.rb", "javascripts/core.js", "lib/app/controllers/netzke_controller.rb", "lib/app/models/netzke_layout.rb", "lib/app/models/netzke_preference.rb", "lib/netzke/action_view_ext.rb", "lib/netzke/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/feedback_ghost.rb", "lib/netzke/js_class_builder.rb", "lib/netzke/routing.rb", "lib/netzke-core.rb", "lib/vendor/facets/hash/recursive_merge.rb", "LICENSE", "Manifest", "netzke-core.gemspec", "Rakefile", "README.mdown", "tasks/netzke_core_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb", "test/app_root/script/console", "test/core_ext_test.rb", "test/netzke_core_test.rb", "test/netzke_preference_test.rb", "test/test_helper.rb", "uninstall.rb"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://writelesscode.com}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Netzke-core", "--main", "README.mdown"]
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.rubyforge_project = %q{netzke-core}
19
19
  s.rubygems_version = %q{1.3.1}
20
20
  s.summary = %q{Build ExtJS/Rails widgets with minimum effort}
21
- s.test_files = ["test/core_ext_test.rb", "test/netzke_core_test.rb"]
21
+ s.test_files = ["test/core_ext_test.rb", "test/netzke_core_test.rb", "test/netzke_preference_test.rb"]
22
22
 
23
23
  if s.respond_to? :specification_version then
24
24
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -0,0 +1,18 @@
1
+ class CreateNetzkePreferences < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :netzke_preferences do |t|
4
+ t.string :name
5
+ t.string :pref_type
6
+ t.string :value
7
+ t.integer :user_id
8
+ t.integer :role_id
9
+ t.string :widget_name
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+
15
+ def self.down
16
+ drop_table :netzke_preferences
17
+ end
18
+ end
@@ -40,15 +40,24 @@ module Netzke
40
40
  end
41
41
  end
42
42
 
43
+ # mocking the User class
44
+ class User
45
+ attr_accessor :id
46
+ def initialize(id)
47
+ @id = id
48
+ end
49
+ end
50
+
43
51
  class NetzkeCoreTest < ActiveSupport::TestCase
44
52
  include Netzke
45
53
 
46
54
  def setup
47
- object = mock()
48
- object.stubs(:normalized_value)
49
- object.stubs(:normalized_value=)
50
- # object.stubs(:save!)
51
- NetzkePreference.stubs(:find).returns(object)
55
+ # object = mock()
56
+ # object.stubs(:normalized_value)
57
+ # object.stubs(:normalized_value=)
58
+ # # object.stubs(:save!)
59
+ # NetzkePreference.stubs(:find).returns(object)
60
+
52
61
  end
53
62
 
54
63
  test "base class loaded" do
@@ -131,4 +140,25 @@ class NetzkeCoreTest < ActiveSupport::TestCase
131
140
  assert(Widget, widget.class)
132
141
  assert('a_widget', widget.config[:name])
133
142
  end
143
+
144
+ test "class configuration" do
145
+ assert_equal(NetzkeLayout, Netzke::Base.layout_manager_class)
146
+ end
147
+
148
+ # test "multiuser" do
149
+ # Netzke::Base.current_user = User.new(1)
150
+ # Widget.new(:prohibit => :all, :name => 'widget')
151
+ #
152
+ # Netzke::Base.current_user = User.new(2)
153
+ # Widget.new(:prohibit => :read, :name => 'widget')
154
+ #
155
+ # Netzke::Base.current_user = User.new(1)
156
+ # widget = Widget.new(:name => 'widget')
157
+ # assert_equal({:read => false, :update => false}, widget.permissions)
158
+ #
159
+ # Netzke::Base.current_user = User.new(2)
160
+ # widget = Widget.new(:name => 'widget')
161
+ # assert_equal({:read => false, :update => true}, widget.permissions)
162
+ #
163
+ # end
134
164
  end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+ require 'netzke-core'
3
+ class NetzkePreferenceTest < ActiveSupport::TestCase
4
+ test "basic values" do
5
+ an_integer = 1976
6
+ a_float = 1976.1345
7
+ a_symbol = :a_symbol
8
+ a_true = true
9
+ a_false = false
10
+ a_nil = nil
11
+ a_hash = {"a" => an_integer, "b" => a_true, "c" => nil, "d" => a_float}
12
+ an_array = [1, "a", a_hash, [1,3,4], a_true, a_false, a_nil, a_float]
13
+
14
+
15
+ p = NetzkePreference
16
+ p[:a_hash] = a_hash
17
+ p["an_integer"] = an_integer
18
+ p[:a_true] = a_true
19
+ p[:a_false] = a_false
20
+ p[:a_nil] = a_nil
21
+ p[:an_array] = an_array
22
+ p[:a_symbol] = a_symbol
23
+ p[:a_float] = a_float
24
+
25
+ assert_equal(a_hash, p[:a_hash])
26
+ assert_equal(an_integer, p[:an_integer])
27
+ assert_equal(a_true, p[:a_true])
28
+ assert_equal(a_false, p[:a_false])
29
+ assert_equal(an_array, p[:an_array])
30
+ assert_equal(a_nil, p[:a_nil])
31
+ assert_equal(a_symbol, p[:a_symbol])
32
+ assert_equal(a_float, p[:a_float])
33
+
34
+ assert_equal(nil, p[:non_existing])
35
+ end
36
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netzke-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Kozlov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-07 00:00:00 -06:00
12
+ date: 2009-01-23 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -74,9 +74,11 @@ files:
74
74
  - test/app_root/config/environments/sqlite.rb
75
75
  - test/app_root/config/environments/sqlite3.rb
76
76
  - test/app_root/config/routes.rb
77
+ - test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb
77
78
  - test/app_root/script/console
78
79
  - test/core_ext_test.rb
79
80
  - test/netzke_core_test.rb
81
+ - test/netzke_preference_test.rb
80
82
  - test/test_helper.rb
81
83
  - uninstall.rb
82
84
  has_rdoc: true
@@ -113,3 +115,4 @@ summary: Build ExtJS/Rails widgets with minimum effort
113
115
  test_files:
114
116
  - test/core_ext_test.rb
115
117
  - test/netzke_core_test.rb
118
+ - test/netzke_preference_test.rb