netzke-core 0.1.1.1

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 (40) hide show
  1. data/CHANGELOG +13 -0
  2. data/LICENSE +20 -0
  3. data/Manifest +39 -0
  4. data/README.mdown +11 -0
  5. data/Rakefile +14 -0
  6. data/generators/netzke_core/USAGE +8 -0
  7. data/generators/netzke_core/netzke_core_generator.rb +13 -0
  8. data/generators/netzke_core/templates/create_netzke_layouts.rb +14 -0
  9. data/generators/netzke_core/templates/create_netzke_preferences.rb +18 -0
  10. data/generators/netzke_core/templates/netzke.html.erb +10 -0
  11. data/init.rb +1 -0
  12. data/install.rb +1 -0
  13. data/javascripts/core.js +124 -0
  14. data/lib/app/controllers/netzke_controller.rb +16 -0
  15. data/lib/app/models/netzke_layout.rb +75 -0
  16. data/lib/app/models/netzke_preference.rb +66 -0
  17. data/lib/netzke-core.rb +28 -0
  18. data/lib/netzke/base.rb +210 -0
  19. data/lib/netzke/controller_extensions.rb +95 -0
  20. data/lib/netzke/core_ext.rb +77 -0
  21. data/lib/netzke/js_class_builder.rb +114 -0
  22. data/lib/vendor/facets/hash/recursive_merge.rb +28 -0
  23. data/netzke-core.gemspec +32 -0
  24. data/tasks/netzke_core_tasks.rake +4 -0
  25. data/test/app_root/app/controllers/application.rb +2 -0
  26. data/test/app_root/config/boot.rb +114 -0
  27. data/test/app_root/config/database.yml +21 -0
  28. data/test/app_root/config/environment.rb +13 -0
  29. data/test/app_root/config/environments/in_memory.rb +0 -0
  30. data/test/app_root/config/environments/mysql.rb +0 -0
  31. data/test/app_root/config/environments/postgresql.rb +0 -0
  32. data/test/app_root/config/environments/sqlite.rb +0 -0
  33. data/test/app_root/config/environments/sqlite3.rb +0 -0
  34. data/test/app_root/config/routes.rb +4 -0
  35. data/test/app_root/script/console +6 -0
  36. data/test/core_ext_test.rb +35 -0
  37. data/test/netzke_core_test.rb +133 -0
  38. data/test/test_helper.rb +20 -0
  39. data/uninstall.rb +1 -0
  40. metadata +109 -0
@@ -0,0 +1,28 @@
1
+ class Hash
2
+ # Same as Hash#merge but recursively merges sub-hashes.
3
+ def recursive_merge(other)
4
+ hash = self.dup
5
+ other.each do |key, value|
6
+ myval = self[key]
7
+ if value.is_a?(Hash) && myval.is_a?(Hash)
8
+ hash[key] = myval.recursive_merge(value)
9
+ else
10
+ hash[key] = value
11
+ end
12
+ end
13
+ hash
14
+ end
15
+
16
+ # Same as Hash#merge! but recursively merges sub-hashes.
17
+ def recursive_merge!(other)
18
+ other.each do |key, value|
19
+ myval = self[key]
20
+ if value.is_a?(Hash) && myval.is_a?(Hash)
21
+ myval.recursive_merge!(value)
22
+ else
23
+ self[key] = value
24
+ end
25
+ end
26
+ self
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{netzke-core}
5
+ s.version = "0.1.1.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Sergei Kozlov"]
9
+ s.date = %q{2009-01-01}
10
+ s.description = %q{Build ExtJS/Rails widgets with minimum effort}
11
+ s.email = %q{sergei@writelesscode.com}
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/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/js_class_builder.rb", "lib/netzke-core.rb", "lib/vendor/facets/hash/recursive_merge.rb", "LICENSE", "README.mdown", "tasks/netzke_core_tasks.rake"]
13
+ s.files = ["CHANGELOG", "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/templates/netzke.html.erb", "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/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/js_class_builder.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"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://writelesscode.com}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Netzke-core", "--main", "README.mdown"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{netzke-core}
19
+ s.rubygems_version = %q{1.3.1}
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"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ else
29
+ end
30
+ else
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :netzke-core do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,114 @@
1
+ # Allow customization of the rails framework path
2
+ RAILS_FRAMEWORK_ROOT = (ENV['RAILS_FRAMEWORK_ROOT'] || "#{File.dirname(__FILE__)}/../../../../../../vendor/rails") unless defined?(RAILS_FRAMEWORK_ROOT)
3
+
4
+ # Don't change this file!
5
+ # Configure your app in config/environment.rb and config/environments/*.rb
6
+
7
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
8
+
9
+ module Rails
10
+ class << self
11
+ def boot!
12
+ unless booted?
13
+ preinitialize
14
+ pick_boot.run
15
+ end
16
+ end
17
+
18
+ def booted?
19
+ defined? Rails::Initializer
20
+ end
21
+
22
+ def pick_boot
23
+ (vendor_rails? ? VendorBoot : GemBoot).new
24
+ end
25
+
26
+ def vendor_rails?
27
+ File.exist?(RAILS_FRAMEWORK_ROOT)
28
+ end
29
+
30
+ def preinitialize
31
+ load(preinitializer_path) if File.exist?(preinitializer_path)
32
+ end
33
+
34
+ def preinitializer_path
35
+ "#{RAILS_ROOT}/config/preinitializer.rb"
36
+ end
37
+ end
38
+
39
+ class Boot
40
+ def run
41
+ load_initializer
42
+ Rails::Initializer.run(:set_load_path)
43
+ end
44
+ end
45
+
46
+ class VendorBoot < Boot
47
+ def load_initializer
48
+ require "#{RAILS_FRAMEWORK_ROOT}/railties/lib/initializer"
49
+ Rails::Initializer.run(:install_gem_spec_stubs)
50
+ end
51
+ end
52
+
53
+ class GemBoot < Boot
54
+ def load_initializer
55
+ self.class.load_rubygems
56
+ load_rails_gem
57
+ require 'initializer'
58
+ end
59
+
60
+ def load_rails_gem
61
+ if version = self.class.gem_version
62
+ gem 'rails', version
63
+ else
64
+ gem 'rails'
65
+ end
66
+ rescue Gem::LoadError => load_error
67
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
68
+ exit 1
69
+ end
70
+
71
+ class << self
72
+ def rubygems_version
73
+ Gem::RubyGemsVersion rescue nil
74
+ end
75
+
76
+ def gem_version
77
+ if defined? RAILS_GEM_VERSION
78
+ RAILS_GEM_VERSION
79
+ elsif ENV.include?('RAILS_GEM_VERSION')
80
+ ENV['RAILS_GEM_VERSION']
81
+ else
82
+ parse_gem_version(read_environment_rb)
83
+ end
84
+ end
85
+
86
+ def load_rubygems
87
+ require 'rubygems'
88
+ min_version = '1.1.1'
89
+ unless rubygems_version >= min_version
90
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
91
+ exit 1
92
+ end
93
+
94
+ rescue LoadError
95
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
96
+ exit 1
97
+ end
98
+
99
+ def parse_gem_version(text)
100
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
101
+ end
102
+
103
+ private
104
+ def read_environment_rb
105
+ environment_rb = "#{RAILS_ROOT}/config/environment.rb"
106
+ environment_rb = "#{HELPER_RAILS_ROOT}/config/environment.rb" unless File.exists?(environment_rb)
107
+ File.read(environment_rb)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ # All that for this:
114
+ Rails.boot!
@@ -0,0 +1,21 @@
1
+ in_memory:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ verbosity: quiet
5
+ sqlite:
6
+ adapter: sqlite
7
+ dbfile: plugin_test.sqlite.db
8
+ sqlite3:
9
+ adapter: sqlite3
10
+ dbfile: plugin_test.sqlite3.db
11
+ postgresql:
12
+ adapter: postgresql
13
+ username: postgres
14
+ password: postgres
15
+ database: plugin_test
16
+ mysql:
17
+ adapter: mysql
18
+ host: localhost
19
+ username: root
20
+ password:
21
+ database: plugin_test
@@ -0,0 +1,13 @@
1
+ require File.join(File.dirname(__FILE__), 'boot')
2
+
3
+ Rails::Initializer.run do |config|
4
+ config.cache_classes = false
5
+ config.whiny_nils = true
6
+ config.plugin_locators.unshift(
7
+ Class.new(Rails::Plugin::Locator) do
8
+ def plugins
9
+ [Rails::Plugin.new(File.expand_path('.'))]
10
+ end
11
+ end
12
+ ) unless defined?(PluginTestHelper::PluginLocator)
13
+ end
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.connect ':controller/:action/:id'
3
+ map.connect ':controller/:action/:id.:format'
4
+ end
@@ -0,0 +1,6 @@
1
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
2
+ libs = " -r irb/completion"
3
+ libs << " -r test/test_helper"
4
+ libs << " -r console_app"
5
+ libs << " -r console_with_helpers"
6
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+ require 'netzke/core_ext'
3
+
4
+ require 'json'
5
+
6
+ class CoreExtTest < ActiveSupport::TestCase
7
+ test "to_js" do
8
+ assert_equal({"aProperty" => true}, JSON.parse({:a_property => true}.to_js))
9
+ assert_equal({"aProperty" => true}, JSON.parse({:a_property => true, :nil_property => nil}.to_js))
10
+ assert_equal([{"aProperty" => true}, {"anotherProperty" => false}], JSON.parse([{:a_property => true}, {:another_property => false}].to_js))
11
+ assert_equal([{"aProperty" => true}, {"anotherProperty" =>false}], JSON.parse([{:a_property => true, :nil_property => nil}, {:another_property => false}].to_js))
12
+ end
13
+
14
+ test "recursive delete if nil" do
15
+ assert_equal({:a => 1, :b => {:c => 4, :d => 5}}, {:a => 1, :aa => nil, :b => {:c => 4, :d => 5, :cc => nil}}.recursive_delete_if_nil)
16
+
17
+ assert_equal({:a => [{:e => 5}, {:f => 7}], :b => {:c => 4, :d => 5}}, {:a => [{:e => 5, :ee => nil},{:f => 7, :ff => nil}], :aa => nil, :b => {:c => 4, :d => 5, :cc => nil}}.recursive_delete_if_nil)
18
+
19
+ assert_equal([
20
+ {:a => [{:e => 5}]},
21
+ {},
22
+ {:b => {:c => 4, :d => 5}}
23
+ ], [
24
+ {:a => [{:e => 5, :ee => nil}]},
25
+ {:aa => nil},
26
+ {:b => {:c => 4, :d => 5, :cc => nil}}
27
+ ].recursive_delete_if_nil)
28
+ end
29
+
30
+ test "convert keys" do
31
+ assert_equal([
32
+ {:aB => 1, :cDD => [{:lookMa => true},{:wowNow => true}]}
33
+ ],[:a_b => 1, :c_d_d => [{:look_ma => true},{:wow_now => true}]].convert_keys{|k| k.camelize(:lower)})
34
+ end
35
+ end
@@ -0,0 +1,133 @@
1
+ require 'test_helper'
2
+
3
+ require 'netzke-core'
4
+
5
+ # test widgets
6
+ module Netzke
7
+ class Widget < Base
8
+ interface :method_one, :method_two
9
+ def initial_aggregatees
10
+ {
11
+ :nested_one => {:widget_class_name => 'NestedWidgetOne'},
12
+ :nested_two => {:widget_class_name => 'NestedWidgetTwo'}
13
+ }
14
+ end
15
+
16
+ # def initial_dependencies
17
+ # %w{NestedWidgetOne NestedWidgetTwo DeepNestedWidget}
18
+ # end
19
+
20
+ def available_permissions
21
+ %w(read update)
22
+ end
23
+
24
+ def initial_config
25
+ {
26
+ :config_uno => true,
27
+ :config_dos => false
28
+ }
29
+ end
30
+ end
31
+
32
+ class NestedWidgetOne < Base
33
+ end
34
+
35
+ class NestedWidgetTwo < Base
36
+ def initial_aggregatees
37
+ {
38
+ :nested => {:widget_class_name => 'DeepNestedWidget'}
39
+ }
40
+ end
41
+ end
42
+
43
+ class DeepNestedWidget < Base
44
+ end
45
+ end
46
+
47
+ class NetzkeCoreTest < ActiveSupport::TestCase
48
+ include Netzke
49
+
50
+ def setup
51
+ object = mock()
52
+ object.stubs(:normalized_value)
53
+ object.stubs(:normalized_value=)
54
+ # object.stubs(:save!)
55
+ NetzkePreference.stubs(:find).returns(object)
56
+ end
57
+
58
+ test "base class loaded" do
59
+ assert_kind_of Netzke::Base, Netzke::Base.new
60
+ end
61
+
62
+ test "short widget class name" do
63
+ assert_equal 'Widget', Widget.short_widget_class_name
64
+ end
65
+
66
+ test "interface" do
67
+ widget_class = Widget
68
+ assert_equal [:get_widget, :method_one, :method_two], widget_class.interface_points
69
+ end
70
+
71
+ test "aggregatees" do
72
+ widget = Widget.new(:name => 'my_widget')
73
+
74
+ # instantiate aggregatees
75
+ nested_widget_one = widget.aggregatee_instance(:nested_one)
76
+ nested_widget_two = widget.aggregatee_instance(:nested_two)
77
+ deep_nested_widget = widget.aggregatee_instance(:nested_two__nested)
78
+
79
+ # check the classes of aggregation instances
80
+ assert_kind_of NestedWidgetOne, nested_widget_one
81
+ assert_kind_of NestedWidgetTwo, nested_widget_two
82
+ assert_kind_of DeepNestedWidget, deep_nested_widget
83
+
84
+ # check the internal names of aggregation instances
85
+ assert_equal 'my_widget', widget.id_name
86
+ assert_equal 'my_widget__nested_one', nested_widget_one.id_name
87
+ assert_equal 'my_widget__nested_two', nested_widget_two.id_name
88
+ assert_equal 'my_widget__nested_two__nested', deep_nested_widget.id_name
89
+ end
90
+
91
+ test "permissions" do
92
+ widget = Widget.new
93
+ assert_equal({:read => true, :update => true}, widget.permissions)
94
+
95
+ widget = Widget.new(:prohibit => :all)
96
+ assert_equal({:read => false, :update => false}, widget.permissions)
97
+
98
+ widget = Widget.new(:prohibit => :read)
99
+ assert_equal({:read => false, :update => true}, widget.permissions)
100
+
101
+ widget = Widget.new(:prohibit => [:read, :update])
102
+ assert_equal({:read => false, :update => false}, widget.permissions)
103
+
104
+ widget = Widget.new(:prohibit => :all, :allow => :read)
105
+ assert_equal({:read => true, :update => false}, widget.permissions)
106
+
107
+ widget = Widget.new(:prohibit => :all, :allow => [:read, :update])
108
+ assert_equal({:read => true, :update => true}, widget.permissions)
109
+ end
110
+
111
+ test "default config" do
112
+ widget = Widget.new
113
+ assert_equal({:ext_config => {}, :config_uno => true, :config_dos => false}, widget.config)
114
+
115
+ widget = Widget.new(:name => 'widget', :config_uno => false)
116
+ assert_equal({:name => 'widget', :ext_config => {}, :config_uno => false, :config_dos => false}, widget.config)
117
+ end
118
+
119
+ test "dependencies calculated based on aggregations" do
120
+ widget = Widget.new
121
+ assert(widget.dependencies.include?('NestedWidgetOne'))
122
+ assert(widget.dependencies.include?('NestedWidgetTwo'))
123
+ assert(!widget.dependencies.include?('DeepNestedWidget'))
124
+ end
125
+
126
+ test "dependencies in JS class generators" do
127
+ js_code = Widget.js_class_code
128
+ assert(js_code.index("Ext.componentCache['NestedWidgetOne']"))
129
+ assert(js_code.index("Ext.componentCache['NestedWidgetTwo']"))
130
+ assert(js_code.index("Ext.componentCache['DeepNestedWidget']"))
131
+ end
132
+
133
+ end
@@ -0,0 +1,20 @@
1
+ # Set the default environment to sqlite3's in_memory database
2
+ ENV['RAILS_ENV'] ||= 'in_memory'
3
+
4
+ # Load the Rails environment and testing framework
5
+ require "#{File.dirname(__FILE__)}/app_root/config/environment"
6
+ require 'test_help'
7
+ require 'action_view/test_case' # Load additional test classes not done automatically by < Rails 2.2.2
8
+
9
+ # Undo changes to RAILS_ENV
10
+ silence_warnings {RAILS_ENV = ENV['RAILS_ENV']}
11
+
12
+ # Run the migrations
13
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
14
+
15
+ # Set default fixture loading properties
16
+ Test::Unit::TestCase.class_eval do
17
+ self.use_transactional_fixtures = true
18
+ self.use_instantiated_fixtures = false
19
+ self.fixture_path = "#{File.dirname(__FILE__)}/fixtures"
20
+ end
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here