extjs-mvc 0.3.10 → 0.4.0.a
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.
- data/LICENSE +1 -1
- data/README.rdoc +5 -173
- data/Rakefile +18 -20
- data/VERSION +1 -1
- data/bin/xmvc +13 -0
- data/lib/extjs-mvc/README +20 -0
- data/lib/extjs-mvc/builder.rb +83 -0
- data/lib/extjs-mvc/builders/all_builder.rb +15 -0
- data/lib/extjs-mvc/builders/app_builder.rb +36 -0
- data/lib/extjs-mvc/builders/base.rb +138 -0
- data/lib/extjs-mvc/builders/css_builder.rb +36 -0
- data/lib/extjs-mvc/builders/docs_builder.rb +20 -0
- data/lib/extjs-mvc/builders/mvc_builder.rb +33 -0
- data/lib/extjs-mvc/builders/plugin_builder.rb +53 -0
- data/lib/extjs-mvc/cli.rb +52 -0
- data/lib/extjs-mvc/generator.rb +79 -0
- data/lib/extjs-mvc/generators/app.rb +57 -0
- data/lib/extjs-mvc/generators/base.rb +53 -0
- data/lib/extjs-mvc/generators/controller.rb +41 -0
- data/lib/extjs-mvc/generators/model.rb +41 -0
- data/lib/extjs-mvc/generators/scaffold.rb +17 -0
- data/lib/extjs-mvc/generators/templates/Controller.js +17 -0
- data/lib/extjs-mvc/generators/templates/Model.js +9 -0
- data/lib/extjs-mvc/generators/templates/ModelSpec.js +12 -0
- data/lib/extjs-mvc/generators/templates/View.js +16 -0
- data/lib/extjs-mvc/generators/templates/_Action.js +7 -0
- data/lib/extjs-mvc/generators/templates/app/README.rdoc +152 -0
- data/lib/extjs-mvc/generators/templates/app/app/App.js +64 -0
- data/lib/extjs-mvc/generators/templates/app/app/controllers/ApplicationController.js +10 -0
- data/lib/extjs-mvc/generators/templates/app/app/controllers/HomeController.js +10 -0
- data/lib/extjs-mvc/generators/templates/app/app/views/home/Index.js +17 -0
- data/lib/extjs-mvc/generators/templates/app/app/views/layout/Menu.js +23 -0
- data/lib/extjs-mvc/generators/templates/app/config/application.js +1 -0
- data/lib/extjs-mvc/generators/templates/app/config/boot.js +67 -0
- data/lib/extjs-mvc/generators/templates/app/config/build.xml +77 -0
- data/lib/extjs-mvc/generators/templates/app/config/database.js +4 -0
- data/lib/extjs-mvc/generators/templates/app/config/environment.json +58 -0
- data/lib/extjs-mvc/generators/templates/app/config/environments/development.json +1 -0
- data/lib/extjs-mvc/generators/templates/app/config/environments/production.json +4 -0
- data/lib/extjs-mvc/generators/templates/app/config/routes.js +27 -0
- data/lib/extjs-mvc/generators/templates/app/config/settings.yml +3 -0
- data/lib/extjs-mvc/generators/templates/app/public/index.html +19 -0
- data/lib/extjs-mvc/generators/templates/app/public/stylesheets/ext-mvc-all.css +49 -0
- data/{test/active_record_test.rb → lib/extjs-mvc/generators/templates/app/spec/SpecHelper.js} +0 -0
- data/lib/extjs-mvc/generators/templates/app/spec/index.html +66 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/EXAMPLE.html +68 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/LICENSE +22 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/README.markdown +307 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/jquery-1.2.3.js +3408 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/jquery.fn.js +29 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/jquery.print.js +108 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.assets.js +36 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.behaviors.js +91 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.builder.js +80 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.css +90 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.events.js +42 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.matchers.js +145 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/lib/screw.server.js +21 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/spec/behaviors_spec.js +178 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/spec/matchers_spec.js +237 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/spec/print_spec.js +119 -0
- data/{test/controller_test.rb → lib/extjs-mvc/generators/templates/app/vendor/screw-unit/spec/spec_helper.js} +0 -0
- data/lib/extjs-mvc/generators/templates/app/vendor/screw-unit/spec/suite.html +18 -0
- data/lib/extjs-mvc/generators/templates/scaffold/ScaffoldController.js +18 -0
- data/lib/extjs-mvc/generators/view.rb +29 -0
- data/lib/extjs-mvc/plugin.rb +105 -0
- data/lib/extjs-mvc/scripts.rb +15 -0
- data/lib/extjs-mvc/settings.rb +75 -0
- data/lib/extjs-mvc/setup.rb +5 -0
- data/lib/extjs-mvc/stats.rb +241 -0
- data/lib/extjs-mvc/test.rb +11 -0
- data/lib/extjs-mvc/testserver.ru +95 -0
- data/lib/extjs-mvc/ui.rb +58 -0
- data/lib/extjs-mvc/update.rb +73 -0
- data/lib/extjs-mvc.rb +70 -32
- data/lib/js/App.js +219 -0
- data/lib/js/MVC.js +260 -0
- data/lib/js/Presenter.js +52 -0
- data/lib/js/README.rdoc +69 -0
- data/lib/js/build +21 -0
- data/lib/js/controller/Controller.js +278 -0
- data/lib/js/controller/CrudController.js +460 -0
- data/lib/js/lib/Array.js +26 -0
- data/lib/js/lib/Booter.js +415 -0
- data/lib/js/lib/ClassManager.js +191 -0
- data/lib/js/lib/ControllerClassManager.js +95 -0
- data/lib/js/lib/Dependencies.js +44 -0
- data/lib/js/lib/DispatchMatcher.js +98 -0
- data/lib/js/lib/Dispatcher.js +129 -0
- data/lib/js/lib/Environment.js +43 -0
- data/lib/js/lib/Inflector.js +138 -0
- data/lib/js/lib/ModelClassManager.js +19 -0
- data/lib/js/lib/Route.js +139 -0
- data/lib/js/lib/Router.js +282 -0
- data/lib/js/lib/String.js +94 -0
- data/lib/js/lib/ViewClassManager.js +229 -0
- data/lib/js/lib/notes.txt +32 -0
- data/lib/js/model/AdapterManager.js +30 -0
- data/lib/js/model/Association.js +26 -0
- data/lib/js/model/Base.js +63 -0
- data/lib/js/model/BelongsToAssociation.js +116 -0
- data/lib/js/model/Cache.js +131 -0
- data/lib/js/model/HasManyAssociation.js +160 -0
- data/lib/js/model/Model.js +331 -0
- data/lib/js/model/UrlBuilder.js +106 -0
- data/lib/js/model/adapters/AbstractAdapter.js +296 -0
- data/lib/js/model/adapters/MemoryAdapter.js +103 -0
- data/lib/js/model/adapters/RESTAdapter.js +345 -0
- data/lib/js/model/adapters/RESTJSONAdapter.js +68 -0
- data/lib/js/model/adapters/notes.txt +42 -0
- data/lib/js/model/associations/Association.js +192 -0
- data/lib/js/model/associations/notes.txt +87 -0
- data/lib/js/model/validations/Errors.js +136 -0
- data/lib/js/model/validations/Plugin.js +139 -0
- data/lib/js/model/validations/Validations.js +276 -0
- data/lib/js/notes/Charts.graffle +0 -0
- data/lib/js/overrides/Ext.Component.js +21 -0
- data/lib/js/overrides/Ext.extend.js +142 -0
- data/lib/js/spec/Array.spec.js +15 -0
- data/lib/js/spec/ExtMVC.spec.js +65 -0
- data/lib/js/spec/Model.spec.js +370 -0
- data/lib/js/spec/OS.spec.js +83 -0
- data/lib/js/spec/Router.spec.js +99 -0
- data/lib/js/spec/SpecHelper.js +106 -0
- data/lib/js/spec/String.spec.js +83 -0
- data/lib/js/spec/model/AbstractAdapter.spec.js +49 -0
- data/lib/js/spec/model/Associations.spec.js +99 -0
- data/lib/js/spec/model/Cache.spec.js +5 -0
- data/lib/js/spec/model/RESTAdapter.spec.js +19 -0
- data/lib/js/spec/model/ValidationErrors.spec.js +64 -0
- data/lib/js/spec/model/Validations.spec.js +166 -0
- data/lib/js/spec/model/ValidationsPlugin.spec.js +108 -0
- data/lib/js/spec/suite.html +60 -0
- data/lib/js/specs-old/JSSpec.css +216 -0
- data/lib/js/specs-old/JSSpec.js +1512 -0
- data/lib/js/specs-old/all.html +66 -0
- data/lib/js/specs-old/base.js +14 -0
- data/lib/js/specs-old/controller.js +17 -0
- data/lib/js/specs-old/diff_match_patch.js +1 -0
- data/lib/js/specs-old/model.js +70 -0
- data/lib/js/specs-old/route.js +38 -0
- data/lib/js/specs-old/router.js +59 -0
- data/lib/js/specs-old/string.js +22 -0
- data/lib/js/testrunner/JSpecFormatter.js +111 -0
- data/lib/js/testrunner/TestClient.js +181 -0
- data/lib/js/testrunner/TestGrid.js +351 -0
- data/lib/js/testrunner/TestRunner.js +110 -0
- data/lib/js/testrunner/TestViewport.js +94 -0
- data/lib/js/vendor/screw-unit/EXAMPLE.html +68 -0
- data/lib/js/vendor/screw-unit/LICENSE +22 -0
- data/lib/js/vendor/screw-unit/README.markdown +307 -0
- data/lib/js/vendor/screw-unit/lib/jquery-1.2.3.js +3408 -0
- data/lib/js/vendor/screw-unit/lib/jquery.fn.js +29 -0
- data/lib/js/vendor/screw-unit/lib/jquery.print.js +108 -0
- data/lib/js/vendor/screw-unit/lib/screw.assets.js +36 -0
- data/lib/js/vendor/screw-unit/lib/screw.behaviors.js +91 -0
- data/lib/js/vendor/screw-unit/lib/screw.builder.js +80 -0
- data/lib/js/vendor/screw-unit/lib/screw.css +91 -0
- data/lib/js/vendor/screw-unit/lib/screw.events.js +42 -0
- data/lib/js/vendor/screw-unit/lib/screw.matchers.js +145 -0
- data/lib/js/vendor/screw-unit/lib/screw.server.js +21 -0
- data/lib/js/vendor/screw-unit/spec/behaviors_spec.js +178 -0
- data/lib/js/vendor/screw-unit/spec/matchers_spec.js +237 -0
- data/lib/js/vendor/screw-unit/spec/print_spec.js +119 -0
- data/{test/data_mapper_test.rb → lib/js/vendor/screw-unit/spec/spec_helper.js} +0 -0
- data/lib/js/vendor/screw-unit/spec/suite.html +18 -0
- data/lib/js/view/FormWindow.js +184 -0
- data/lib/js/view/HasManyEditorGridPanel.js +211 -0
- data/lib/js/view/scaffold/Edit.js +46 -0
- data/lib/js/view/scaffold/Index.js +561 -0
- data/lib/js/view/scaffold/New.js +20 -0
- data/lib/js/view/scaffold/ScaffoldFormPanel.js +255 -0
- data/test/helper.rb +10 -0
- data/test/test_extjs-mvc-gem.rb +7 -0
- metadata +232 -56
- data/README +0 -12
- data/lib/controller/controller.rb +0 -28
- data/lib/core_ext/array/extract_options.rb +0 -15
- data/lib/extjs/component.rb +0 -71
- data/lib/extjs/data/store.rb +0 -131
- data/lib/helpers/component.rb +0 -37
- data/lib/helpers/store.rb +0 -7
- data/lib/model/active_record.rb +0 -89
- data/lib/model/base.rb +0 -370
- data/lib/model/data_mapper.rb +0 -66
- data/lib/model/mongo_mapper.rb +0 -64
- data/lib/test/macros.rb +0 -20
- data/test/app/config/application.rb +0 -70
- data/test/app/config/database.yml +0 -3
- data/test/app/db/schema.rb +0 -75
- data/test/app/models/active_record/address.rb +0 -4
- data/test/app/models/active_record/data_type.rb +0 -3
- data/test/app/models/active_record/group.rb +0 -4
- data/test/app/models/active_record/house.rb +0 -4
- data/test/app/models/active_record/location.rb +0 -5
- data/test/app/models/active_record/person.rb +0 -4
- data/test/app/models/active_record/user.rb +0 -6
- data/test/app/models/active_record/user_group.rb +0 -4
- data/test/component_test.rb +0 -15
- data/test/debug.log +0 -2969
- data/test/model_test.rb +0 -526
- data/test/mongo_mapper_test.rb +0 -0
- data/test/store_test.rb +0 -0
- data/test/test_helper.rb +0 -32
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
|
@@ -1,185 +1,17 @@
|
|
|
1
|
-
= mvc
|
|
2
|
-
|
|
3
|
-
A collection of helpers, MVC mixins and PORs (plain-old-ruby-object) to assist with auto-generating ExtJS Stores (Ext.data.Store) including its associated DataReader (Ext.data.JsonReader, Ext.data.XmlReader) and DataWriter (Ext.data.JsonWriter, Ext.data.XmlWriter). Also contains a helper for rendering javascript component definitions via partials.
|
|
4
|
-
|
|
5
|
-
See tutorial http://www.extjs.com/blog/2009/09/30/ext-js-on-rails-a-comprehensivetutorial/
|
|
6
|
-
|
|
7
|
-
===Installation
|
|
8
|
-
% sudo gem install gemcutter
|
|
9
|
-
% gem tumble (only have to do this once, adds gemcutter as primary gem-source)
|
|
10
|
-
% sudo gem install extjs-mvc
|
|
11
|
-
|
|
12
|
-
<b>Rails Installation:</b>
|
|
13
|
-
In <tt>environment.rb</tt>,
|
|
14
|
-
|
|
15
|
-
Rails::Initializer.run do |config|
|
|
16
|
-
config.gem "extjs-mvc"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
<b>Merb installation:</b>
|
|
20
|
-
In <tt>config/dependencies.rb</tt>, Add extjs-mvc as a new dependency
|
|
21
|
-
|
|
22
|
-
dependency "extjs-mvc"
|
|
23
|
-
|
|
24
|
-
=== An ORM Model mixin: ExtJS::Model
|
|
25
|
-
extjs-mvc contains Model mixin named <tt>ExtJS::Model</tt> which works for <b>three</b> popular ORM frameworks, ActiveRecord, DataMapper and MongoMapper. The API for each framework is identical.
|
|
26
|
-
|
|
27
|
-
Simply include the mixin into your model. Use the class-method <tt>extjs_fields</tt> to specify those
|
|
28
|
-
fields with will be used to render the <tt>Ext.data.Record.create</tt> field-def'n.
|
|
29
|
-
|
|
30
|
-
class User < ActiveRecord::Base
|
|
31
|
-
include ExtJS::Model
|
|
32
|
-
|
|
33
|
-
extjs_fields :exclude => [:password, :password_confirmation]
|
|
34
|
-
|
|
35
|
-
# OR
|
|
36
|
-
extjs_fields :name, :description
|
|
37
|
-
|
|
38
|
-
# OR
|
|
39
|
-
extjs_fields :only => [:name, :description] # actually the same as above
|
|
40
|
-
|
|
41
|
-
# OR
|
|
42
|
-
extjs_fields :additional => [:computed] # includes all database columns and an additional computed field
|
|
43
|
-
|
|
44
|
-
# OR define a column as a Hash
|
|
45
|
-
extjs_fields :description, :name => {"sortDir" => "ASC"}, :created_at => {"dateFormat" => "c"}
|
|
46
|
-
|
|
47
|
-
# OR render associations, association-fields will have their "mapping" property set automatically
|
|
48
|
-
extjs_fields :name, :description, :company => [:name, :description]
|
|
49
|
-
|
|
50
|
-
def computed
|
|
51
|
-
name.blank? ? login : name
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
After including the model mixin <tt>ExtJS::Model</tt>, try typing the following in <tt>irb</tt> console:
|
|
56
|
-
>> User.extjs_record
|
|
57
|
-
=> { :idProperty=>"id", :fields=>[
|
|
58
|
-
{:type=>'int', :allowBlank=>true, :name=>"id"},
|
|
59
|
-
{:type=>'string', :allowBlank=>false, :name=>"first", :defaultValue => nil},
|
|
60
|
-
{:type=>'string', :allowBlank=>false, :name=>"last", :defaultValue => nil},
|
|
61
|
-
{:type=>'string', :allowBlank=>false, :name=>"email", :defaultValue => nil}
|
|
62
|
-
]}
|
|
63
|
-
|
|
64
|
-
An auto-generated <tt>Ext.data.JsonReader</tt> configuration!
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
You can also define different sets of fields for different representations of your model.
|
|
68
|
-
|
|
69
|
-
E.g. with the following definition:
|
|
70
|
-
|
|
71
|
-
class User < ActiveRecord::Base
|
|
72
|
-
include ExtJS::Model
|
|
73
|
-
|
|
74
|
-
extjs_fieldset :grid, fields => [:name, :description, :company => [:name, :description]]
|
|
75
|
-
extjs_fieldset :combo, [:full_name]
|
|
76
|
-
|
|
77
|
-
def full_name
|
|
78
|
-
"#{first_name} #{name}"
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
You can get store configs for both representations with
|
|
83
|
-
User.extjs_record(:grid)
|
|
84
|
-
or
|
|
85
|
-
User.extjs_record(:combo)
|
|
86
|
-
|
|
87
|
-
And the corresponding data for the representations with
|
|
88
|
-
User.first.to_record(:grid)
|
|
89
|
-
or
|
|
90
|
-
User.first.to_record(:combo)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
=== An ActionController mixin: ExtJS::Controller
|
|
94
|
-
The <tt>extjs-mvc</tt> Gem includes a framework agnostic Controller mixin which works with both Rails and Merb. Include this mixin into any controller which will need to generate an <tt>Ext.data.Store</tt>.
|
|
95
|
-
<b>usage:</b>
|
|
96
|
-
|
|
97
|
-
class UsersController < ActionController::Base
|
|
98
|
-
include ExtJS::Controller
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
=== View Helper: ExtJS::Helpers::Component
|
|
102
|
-
|
|
103
|
-
<b>usage:</b>
|
|
104
|
-
|
|
105
|
-
class UserController < ActionController::Base
|
|
106
|
-
include ExtJS::Controller
|
|
107
|
-
helper ExtJS::Helpers::Component
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
Now render Ext components using helper method <tt>extjs_component</tt>
|
|
111
|
-
|
|
112
|
-
@viewport = extjs_component(
|
|
113
|
-
"xtype" => "viewport",
|
|
114
|
-
"frame" => true,
|
|
115
|
-
"layout" => "border")
|
|
116
|
-
@viewport.add("xtype" => "panel", "contentEl" => "hd", "region" => "north", "height" => 30)
|
|
117
|
-
@viewport.add(:partial => "/users/grid", "itemId" => "users-grid", "region" => "west")
|
|
118
|
-
@viewport.add(:partial => "/tasks/grid", "itemId" => "tasks-grid", "region" => "center")
|
|
119
|
-
@viewport.add("xtype" => "panel", "contentEl" => "ft", "region" => "south", "height" => 20)
|
|
120
|
-
|
|
121
|
-
Note how it can also render partials. Partials will be invoked with a local-variable named "container", a reference to the
|
|
122
|
-
parent Ext::Component instance which added the partial. If no "container" is specified, it would be expected that your partial
|
|
123
|
-
would provide its own "renderTo" or "contentEl" property, just as in Ext.Component from ExtJS javascript library.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
=== View Helper: ExtJS::Helpers::Store
|
|
127
|
-
|
|
128
|
-
Renders an Ext.data.Store with helper method <tt>extjs_store</tt>
|
|
129
|
-
|
|
130
|
-
class UserController < ActionController::Base
|
|
131
|
-
include ExtJS::Controller
|
|
132
|
-
helper ExtJS::Helpers::Store
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
Now render a store in an erb template:
|
|
136
|
-
|
|
137
|
-
@store = extjs_store(
|
|
138
|
-
:controller => "users",
|
|
139
|
-
:fieldset => :grid, # <-- Specify a particular fieldset as defined in the Model (used to render DataReader)
|
|
140
|
-
:proxy => "http" # <-- default
|
|
141
|
-
:format => "json" # <-- default
|
|
142
|
-
:model => "user", # <-- default: controller_name.singularize
|
|
143
|
-
:writer => {:encode => false},
|
|
144
|
-
:config => { # <-- standard Ext.data.Store config-params
|
|
145
|
-
"autoLoad" => true
|
|
146
|
-
"autoSave" => true
|
|
147
|
-
}
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
%= @store.render %
|
|
151
|
-
|
|
152
|
-
=== A Testing Mixin: ExtJS::TestMacros
|
|
153
|
-
The <tt>extjs-mvc</tt> Gem includes a small set of testing macros to help unit-test models.
|
|
154
|
-
This requires the 'Shoulda' gem from thoughtbot. Include this mixin inside the
|
|
155
|
-
<tt>ActiveSupport::TestCase</tt> class in <tt>test/test_helper.rb</tt>
|
|
156
|
-
|
|
157
|
-
==== Usage
|
|
158
|
-
<tt>test/test_helper.rb</tt>
|
|
159
|
-
class ActiveSupport::TestCase
|
|
160
|
-
extend ExtJS::TestMacros
|
|
161
|
-
#...
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
In individual model unit tests:
|
|
165
|
-
class ModelTest < ActiveSupport::TestCase
|
|
166
|
-
should_require_extjs_fields :name, :email, :city
|
|
167
|
-
#...
|
|
168
|
-
#other tests
|
|
169
|
-
end
|
|
1
|
+
= extjs-mvc-gem
|
|
170
2
|
|
|
3
|
+
Description goes here.
|
|
171
4
|
|
|
172
5
|
== Note on Patches/Pull Requests
|
|
173
|
-
|
|
6
|
+
|
|
174
7
|
* Fork the project.
|
|
175
8
|
* Make your feature addition or bug fix.
|
|
176
9
|
* Add tests for it. This is important so I don't break it in a
|
|
177
10
|
future version unintentionally.
|
|
178
11
|
* Commit, do not mess with rakefile, version, or history.
|
|
179
|
-
(if you want to have your own version, that is fine but
|
|
180
|
-
bump version in a commit by itself I can ignore when I pull)
|
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
|
181
13
|
* Send me a pull request. Bonus points for topic branches.
|
|
182
14
|
|
|
183
15
|
== Copyright
|
|
184
16
|
|
|
185
|
-
Copyright (c)
|
|
17
|
+
Copyright (c) 2010 Christocracy. See LICENSE for details.
|
data/Rakefile
CHANGED
|
@@ -5,30 +5,32 @@ begin
|
|
|
5
5
|
require 'jeweler'
|
|
6
6
|
Jeweler::Tasks.new do |gem|
|
|
7
7
|
gem.name = "extjs-mvc"
|
|
8
|
-
gem.summary = %Q{
|
|
9
|
-
gem.description = %Q{MVC
|
|
8
|
+
gem.summary = %Q{A Rails-like MVC for the Ext JS javascript framework}
|
|
9
|
+
gem.description = %Q{A full-stack, Rails-like MVC for the Ext JS javascript framework (originally known as extmvc/extmvc)}
|
|
10
10
|
gem.email = "christocracy@gmail.com"
|
|
11
|
-
gem.homepage = "http://github.com/extjs
|
|
12
|
-
gem.authors = ["Chris Scott"]
|
|
13
|
-
gem.
|
|
14
|
-
gem.
|
|
15
|
-
gem.
|
|
11
|
+
gem.homepage = "http://github.com/christocracy/extjs-mvc-gem"
|
|
12
|
+
gem.authors = ["Ed Spencer and Chris Scott"]
|
|
13
|
+
gem.add_dependency "extlib"
|
|
14
|
+
gem.add_dependency "json"
|
|
15
|
+
gem.add_dependency "thor"
|
|
16
|
+
gem.add_dependency "jammit-core"
|
|
17
|
+
gem.add_dependency "hpricot"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
|
21
|
+
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test,js}/**/*", 'lib/jeweler/templates/.gitignore']
|
|
16
22
|
|
|
17
|
-
gem.test_files = []
|
|
18
|
-
gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore']
|
|
19
|
-
|
|
20
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
|
21
24
|
end
|
|
22
25
|
Jeweler::GemcutterTasks.new
|
|
23
26
|
rescue LoadError
|
|
24
|
-
puts "Jeweler (or a dependency) not available. Install it with:
|
|
27
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
|
25
28
|
end
|
|
26
29
|
|
|
27
|
-
|
|
28
30
|
require 'rake/testtask'
|
|
29
31
|
Rake::TestTask.new(:test) do |test|
|
|
30
32
|
test.libs << 'lib' << 'test'
|
|
31
|
-
test.pattern = 'test
|
|
33
|
+
test.pattern = 'test/**/test_*.rb'
|
|
32
34
|
test.verbose = true
|
|
33
35
|
end
|
|
34
36
|
|
|
@@ -36,7 +38,7 @@ begin
|
|
|
36
38
|
require 'rcov/rcovtask'
|
|
37
39
|
Rcov::RcovTask.new do |test|
|
|
38
40
|
test.libs << 'test'
|
|
39
|
-
test.pattern = 'test
|
|
41
|
+
test.pattern = 'test/**/test_*.rb'
|
|
40
42
|
test.verbose = true
|
|
41
43
|
end
|
|
42
44
|
rescue LoadError
|
|
@@ -51,14 +53,10 @@ task :default => :test
|
|
|
51
53
|
|
|
52
54
|
require 'rake/rdoctask'
|
|
53
55
|
Rake::RDocTask.new do |rdoc|
|
|
54
|
-
|
|
55
|
-
version = File.read('VERSION')
|
|
56
|
-
else
|
|
57
|
-
version = ""
|
|
58
|
-
end
|
|
56
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
|
59
57
|
|
|
60
58
|
rdoc.rdoc_dir = 'rdoc'
|
|
61
|
-
rdoc.title = "mvc #{version}"
|
|
59
|
+
rdoc.title = "extjs-mvc-gem #{version}"
|
|
62
60
|
rdoc.rdoc_files.include('README*')
|
|
63
61
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
64
62
|
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4.0.a
|
data/bin/xmvc
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
|
|
3
|
+
# Check if an older version of extjs-mvc is installed
|
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
|
5
|
+
require 'extjs-mvc'
|
|
6
|
+
require 'extjs-mvc/cli'
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
ExtJS::MVC::CLI.start
|
|
10
|
+
rescue ExtJS::MVC::Error => e
|
|
11
|
+
ExtJS::MVC.ui.error(e.message)
|
|
12
|
+
exit e.status_code
|
|
13
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
This directory contains a collection of Ruby scripts and classes which allow automation of common project tasks.
|
|
2
|
+
You can remove this directory if you don't use any of these tasks.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
|
|
6
|
+
From within the MVC application base directory:
|
|
7
|
+
|
|
8
|
+
ruby script/generate model MyModel field_1:string field_2:int field_3:boolean
|
|
9
|
+
ruby script/generate view viewNamespace viewName
|
|
10
|
+
ruby script/generate controller controllerName viewName1 viewName2 ...
|
|
11
|
+
ruby script/generate scaffold MyModel field_1:string field_2:int field_3:boolean
|
|
12
|
+
|
|
13
|
+
ruby script/plugin install git://github.com/extmvc/loadingmessage-plugin.git LoadingMessage (second arg optional)
|
|
14
|
+
ruby script/plugin install MyPluginFolder (where MyPluginFolder is a folder within the vendor/plugins directory)
|
|
15
|
+
ruby script/plugin uninstall MyPluginFolder
|
|
16
|
+
|
|
17
|
+
ruby script/build all
|
|
18
|
+
ruby script/build js
|
|
19
|
+
ruby script/build css
|
|
20
|
+
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#require 'builders/base'
|
|
2
|
+
#require 'builders/all_builder'
|
|
3
|
+
#require 'builders/app_builder'
|
|
4
|
+
#require 'builders/css_builder'
|
|
5
|
+
#require 'builders/docs_builder'
|
|
6
|
+
#require 'builders/mvc_builder'
|
|
7
|
+
#require 'builders/plugins_builders'
|
|
8
|
+
|
|
9
|
+
module ExtJS
|
|
10
|
+
module MVC
|
|
11
|
+
class BuilderManager
|
|
12
|
+
class << self
|
|
13
|
+
|
|
14
|
+
def dispatch(name, *params)
|
|
15
|
+
name = name.to_sym
|
|
16
|
+
options = params.shift || {}
|
|
17
|
+
case name
|
|
18
|
+
when :setup
|
|
19
|
+
setup(options)
|
|
20
|
+
else
|
|
21
|
+
begin
|
|
22
|
+
@jammit = jammit(options)
|
|
23
|
+
@jammit.invoke(:build, [name])
|
|
24
|
+
rescue Jammit::Error => e
|
|
25
|
+
raise ExtJS::MVC::BuilderError.new(e.message)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def setup(options)
|
|
33
|
+
begin
|
|
34
|
+
##
|
|
35
|
+
# Invoke jammit init app-name so that Jammit creates it's config/assets.yml
|
|
36
|
+
# Note that we must pass-in the name of the newly created app @name so that
|
|
37
|
+
# Jammit appends that to its config_path, otherwise it would create its config file
|
|
38
|
+
# in the pwd.
|
|
39
|
+
|
|
40
|
+
@asset_root = options[:asset_root] || File.expand_path('.')
|
|
41
|
+
|
|
42
|
+
app_assets
|
|
43
|
+
|
|
44
|
+
jammit = Jammit::CLI.new([], options)
|
|
45
|
+
jammit.invoke(:init)
|
|
46
|
+
jammit.invoke(:config, ["set", "javascripts", {
|
|
47
|
+
"mvc" => mvc_assets,
|
|
48
|
+
"app" => app_assets
|
|
49
|
+
}])
|
|
50
|
+
jammit.invoke(:build)
|
|
51
|
+
|
|
52
|
+
rescue Jammit::Error => e
|
|
53
|
+
raise ExtJS::MVC::BuilderError.new(e.message)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def jammit(options={})
|
|
58
|
+
Jammit::CLI.new([], options)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def mvc_assets
|
|
62
|
+
YAML.load(File.read(File.join(@asset_root, 'vendor', 'mvc', 'build'))).map {|f|
|
|
63
|
+
File.join('vendor', 'mvc', f)
|
|
64
|
+
}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def app_assets
|
|
68
|
+
[
|
|
69
|
+
'app/App.js',
|
|
70
|
+
'config/application.js',
|
|
71
|
+
'config/routes.js',
|
|
72
|
+
'vendor/plugins/*/**.js',
|
|
73
|
+
'overrides/*.js',
|
|
74
|
+
'app/models/*.js',
|
|
75
|
+
'app/controllers/*.js',
|
|
76
|
+
'app/views/*/**.js'
|
|
77
|
+
]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ExtJS
|
|
2
|
+
module MVC
|
|
3
|
+
class AllBuilder < Builder
|
|
4
|
+
def self.instances(args = [])
|
|
5
|
+
# set defaults
|
|
6
|
+
args = ['app', 'css', 'plugin', 'mvc'] if args.empty?
|
|
7
|
+
instances = []
|
|
8
|
+
|
|
9
|
+
args.each {|builderName| instances.concat(ExtMVC::BuilderManager.instances_for(builderName, []))}
|
|
10
|
+
|
|
11
|
+
return instances
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module ExtJS
|
|
2
|
+
module MVC
|
|
3
|
+
class AppBuilder < Builder
|
|
4
|
+
def self.instances(args = [])
|
|
5
|
+
[ExtMVC::AppBuilder.new]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def file_list
|
|
9
|
+
# build to production environment
|
|
10
|
+
environment = ExtMVC.mvc_production_environment
|
|
11
|
+
|
|
12
|
+
return ExtMVC.application_files_for(environment)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def name
|
|
16
|
+
"Ext MVC Application"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def message
|
|
20
|
+
"Built #{name}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def description
|
|
24
|
+
"Your #{name}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def output_filename
|
|
28
|
+
"public/application-all.js"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def should_minify
|
|
32
|
+
true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
|
|
2
|
+
module ExtJS
|
|
3
|
+
module MVC
|
|
4
|
+
module Builder
|
|
5
|
+
class Base
|
|
6
|
+
|
|
7
|
+
# Subclasses must implement this method to return the name of the file that concatenated output will be saved to
|
|
8
|
+
def output_filename
|
|
9
|
+
raise
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Does the actual building - just concatenates file_list and optionally minifies
|
|
13
|
+
def build
|
|
14
|
+
concatenate(file_list, output_filename)
|
|
15
|
+
system('growlnotify -m "Built ' + name + '"')
|
|
16
|
+
|
|
17
|
+
if should_minify
|
|
18
|
+
minify output_filename
|
|
19
|
+
system('growlnotify -m "Minified ' + name + '"')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
puts message
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Indicates whether the outputted filename should also be minified (defaults to false)
|
|
26
|
+
def should_minify
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def name
|
|
31
|
+
"Unknown Package"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def message
|
|
35
|
+
"Build complete"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def description
|
|
39
|
+
directory_name
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns an array of all files to be concatenated, in the order they should be included
|
|
43
|
+
def file_list
|
|
44
|
+
has_build_file? ? order_from_build_file : guess_build_order
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def has_build_file?
|
|
48
|
+
File.exists?(build_file_name)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def build_file_name
|
|
52
|
+
"#{directory_name}/build"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Subclasses can override this method to return the string name of the directory under while the file_list resides
|
|
56
|
+
def directory_name
|
|
57
|
+
"./"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns an array of all of the files listed in the build file
|
|
61
|
+
def order_from_build_file
|
|
62
|
+
build_files = []
|
|
63
|
+
file = File.open(build_file_name, "r")
|
|
64
|
+
|
|
65
|
+
while (line = file.gets)
|
|
66
|
+
line.gsub!(/\n/, '')
|
|
67
|
+
next if line =~ /^#/ || line.length.zero?
|
|
68
|
+
|
|
69
|
+
filename = "#{directory_name}/#{line}"
|
|
70
|
+
|
|
71
|
+
if File.exists?(filename)
|
|
72
|
+
build_files.push(filename) unless build_files.include?(filename)
|
|
73
|
+
else
|
|
74
|
+
js_files_in_glob(filename).each {|filename| build_files.push(filename) unless build_files.include?(filename)}
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
build_files
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Returns an array of all the .js files found in the plugin dir, in the order in which they are found
|
|
82
|
+
# (ignores the 'PluginName-all.js' file)
|
|
83
|
+
def guess_build_order
|
|
84
|
+
js_files_in_glob("#{directory_name}/**/*.js")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def js_files_in_glob(glob)
|
|
88
|
+
Dir[glob].select {|fileName| Regexp.new(output_filename).match(fileName).nil?}
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
private
|
|
92
|
+
|
|
93
|
+
# Concatenates an array of files together and saves
|
|
94
|
+
def concatenate(files, concatenated_filename, baseDir = './')
|
|
95
|
+
#remove old files, create blank ones again
|
|
96
|
+
if File.exists?(concatenated_filename)
|
|
97
|
+
File.delete(concatenated_filename)
|
|
98
|
+
# puts "Deleted old #{concatenated_filename}"
|
|
99
|
+
end
|
|
100
|
+
FileUtils.touch(concatenated_filename)
|
|
101
|
+
|
|
102
|
+
count = 0
|
|
103
|
+
file = File.open(concatenated_filename, 'w') do |f|
|
|
104
|
+
files.each do |i|
|
|
105
|
+
# remove the directory the app is in if add_dir is supplied
|
|
106
|
+
i = i.gsub(Regexp.new(ENV['app_dir']), '').gsub(/$(\/*)(.*)/, '\2') if ENV['app_dir']
|
|
107
|
+
|
|
108
|
+
f.puts(IO.read(File.join(baseDir, i)))
|
|
109
|
+
f.puts("\n")
|
|
110
|
+
count += 1
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# puts "Concatenated #{count} files into #{concatenated_filename}"
|
|
115
|
+
# puts
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Minifies a file using YUI compressor
|
|
119
|
+
def minify(filename, minified_filename = nil)
|
|
120
|
+
if minified_filename.nil?
|
|
121
|
+
minified_filename = filename.gsub(/\.js$/, '-min.js')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
if File.exists?(minified_filename)
|
|
125
|
+
FileUtils.rm(minified_filename)
|
|
126
|
+
# puts "Deleted old #{minified_filename}"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
system("java -jar vendor/yui-compressor/build/yuicompressor-2.4.jar #{filename} -o #{minified_filename}")
|
|
130
|
+
|
|
131
|
+
# puts "Created minified file #{minified_filename}"
|
|
132
|
+
# puts
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Ext
|
|
2
|
+
module MVC
|
|
3
|
+
class CssBuilder < Builder
|
|
4
|
+
def self.instances(args = [])
|
|
5
|
+
[ExtMVC::CssBuilder.new]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def file_list
|
|
9
|
+
# build to production environment
|
|
10
|
+
environment = ExtMVC.mvc_development_environment
|
|
11
|
+
|
|
12
|
+
return ExtJS::MVC.css_files_for(environment)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def name
|
|
16
|
+
"Ext MVC Application Stylesheets"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def message
|
|
20
|
+
"Built #{name}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def description
|
|
24
|
+
"Your #{name}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def output_filename
|
|
28
|
+
"public/stylesheets/application-all.css"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def directory_name
|
|
32
|
+
"public/stylesheets/"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Ext
|
|
2
|
+
module MVC
|
|
3
|
+
class DocsBuilder < Builder
|
|
4
|
+
def self.instances(args = [])
|
|
5
|
+
[ExtMVC::DocsBuilder.new]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def build
|
|
9
|
+
system("java -jar vendor/ext-doc/ext-doc.jar -p config/build.xml -o docs -t vendor/ext-doc/template/ext/template.xml -verbose")
|
|
10
|
+
app_name = ExtMVC.settings['docs']['title'] rescue ExtMVC.environment["namespace"] || "Ext MVC"
|
|
11
|
+
logo = ExtMVC.settings['docs']['logo'] rescue "resources/extjs.gif"
|
|
12
|
+
|
|
13
|
+
{:app_name => app_name, :logo => logo}.each_pair do |key, value|
|
|
14
|
+
ExtMVC.gsub_file("docs/index.html", "<%= @#{key} %>", value)
|
|
15
|
+
ExtMVC.gsub_file("docs/welcome.html", "<%= @#{key} %>", value)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Ext
|
|
2
|
+
module MVC
|
|
3
|
+
class MVCBuilder < Builder
|
|
4
|
+
def self.instances(args = [])
|
|
5
|
+
[ExtMVC::MVCBuilder.new]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def output_filename
|
|
9
|
+
"#{directory_name}/ext-mvc-all.js"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def directory_name
|
|
13
|
+
"vendor/mvc"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def should_minify
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def name
|
|
21
|
+
"Ext MVC"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def message
|
|
25
|
+
"Built #{name}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def description
|
|
29
|
+
"The #{name} framework (#{directory_name})"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|