rsence-pre 2.1.0.1.pre

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 (313) hide show
  1. data/.yardopts +10 -0
  2. data/INSTALL.rdoc +330 -0
  3. data/LICENSE.txt +622 -0
  4. data/README.rdoc +98 -0
  5. data/VERSION +1 -0
  6. data/bin/rsence +25 -0
  7. data/bin/rsence-pre +25 -0
  8. data/conf/default_conf.yaml +346 -0
  9. data/conf/default_strings.yaml +76 -0
  10. data/conf/rsence_command_strings.yaml +444 -0
  11. data/docs/ExampleGuiPlugin.rdoc +193 -0
  12. data/docs/JavascriptBundles.rdoc +0 -0
  13. data/docs/PluginBundleInfo.rdoc +173 -0
  14. data/docs/PluginBundles.rdoc +96 -0
  15. data/docs/Values.rdoc +163 -0
  16. data/js/comm/autosync/autosync.js +17 -0
  17. data/js/comm/autosync/js.inc +0 -0
  18. data/js/comm/comm.js +203 -0
  19. data/js/comm/js.inc +0 -0
  20. data/js/comm/jsloader/js.inc +0 -0
  21. data/js/comm/jsloader/jsloader.js +112 -0
  22. data/js/comm/queue/js.inc +0 -0
  23. data/js/comm/queue/queue.js +184 -0
  24. data/js/comm/session/js.inc +0 -0
  25. data/js/comm/session/session.js +52 -0
  26. data/js/comm/sessionwatcher/js.inc +0 -0
  27. data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
  28. data/js/comm/transporter/js.inc +0 -0
  29. data/js/comm/transporter/transporter.js +261 -0
  30. data/js/comm/urlresponder/js.inc +0 -0
  31. data/js/comm/urlresponder/urlresponder.js +149 -0
  32. data/js/comm/values/js.inc +0 -0
  33. data/js/comm/values/values.js +433 -0
  34. data/js/controls/button/button.js +72 -0
  35. data/js/controls/button/js.inc +0 -0
  36. data/js/controls/button/themes/bright/button.css +89 -0
  37. data/js/controls/button/themes/bright/button.html +7 -0
  38. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  39. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  40. data/js/controls/button/themes/default/button.css +89 -0
  41. data/js/controls/button/themes/default/button.html +7 -0
  42. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  43. data/js/controls/button/themes/default/button_parts1.png +0 -0
  44. data/js/controls/checkbox/checkbox.js +49 -0
  45. data/js/controls/checkbox/js.inc +0 -0
  46. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  47. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  48. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  49. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  50. data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
  51. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  52. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
  53. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  54. data/js/controls/dialogs/sheet/js.inc +0 -0
  55. data/js/controls/dialogs/sheet/sheet.js +84 -0
  56. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  57. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  58. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  59. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  60. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  61. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  62. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  63. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  64. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  65. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  66. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  67. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  68. data/js/controls/imageview/imageview.js +109 -0
  69. data/js/controls/imageview/js.inc +0 -0
  70. data/js/controls/imageview/themes/default/blank.gif +0 -0
  71. data/js/controls/passwordcontrol/js.inc +0 -0
  72. data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
  73. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  74. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  75. data/js/controls/progress/progressbar/js.inc +0 -0
  76. data/js/controls/progress/progressbar/progressbar.js +40 -0
  77. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  78. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  79. data/js/controls/progress/progressindicator/js.inc +0 -0
  80. data/js/controls/progress/progressindicator/progressindicator.js +44 -0
  81. data/js/controls/radiobutton/js.inc +0 -0
  82. data/js/controls/radiobutton/radiobutton.js +43 -0
  83. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  84. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  85. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  86. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  87. data/js/controls/sliders/slider/js.inc +0 -0
  88. data/js/controls/sliders/slider/slider.js +357 -0
  89. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  90. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  91. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  92. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  93. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  94. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  95. data/js/controls/sliders/vslider/js.inc +0 -0
  96. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  97. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  98. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  99. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  100. data/js/controls/sliders/vslider/vslider.js +41 -0
  101. data/js/controls/stepper/js.inc +0 -0
  102. data/js/controls/stepper/stepper.js +213 -0
  103. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  104. data/js/controls/stepper/themes/default/stepper.css +14 -0
  105. data/js/controls/stepper/themes/default/stepper.html +2 -0
  106. data/js/controls/stepper/themes/default/stepper.png +0 -0
  107. data/js/controls/stringview/js.inc +0 -0
  108. data/js/controls/stringview/stringview.js +49 -0
  109. data/js/controls/stringview/themes/default/stringview.css +8 -0
  110. data/js/controls/stringview/themes/default/stringview.html +1 -0
  111. data/js/controls/tab/js.inc +0 -0
  112. data/js/controls/tab/tab.js +280 -0
  113. data/js/controls/tab/themes/bright/tab.css +76 -0
  114. data/js/controls/tab/themes/bright/tab.html +6 -0
  115. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  116. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  117. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  118. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  119. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  120. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  121. data/js/controls/tab/themes/default/tab.css +77 -0
  122. data/js/controls/tab/themes/default/tab.html +6 -0
  123. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  124. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  125. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  126. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  127. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  128. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  129. data/js/controls/textarea/js.inc +0 -0
  130. data/js/controls/textarea/textarea.js +24 -0
  131. data/js/controls/textarea/themes/default/textarea.css +21 -0
  132. data/js/controls/textarea/themes/default/textarea.html +18 -0
  133. data/js/controls/textcontrol/js.inc +0 -0
  134. data/js/controls/textcontrol/textcontrol.js +374 -0
  135. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  136. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  137. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  138. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  139. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  140. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  141. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  142. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  143. data/js/controls/uploader/js.inc +0 -0
  144. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  145. data/js/controls/uploader/themes/default/uploader.css +108 -0
  146. data/js/controls/uploader/themes/default/uploader.html +27 -0
  147. data/js/controls/uploader/uploader.js +154 -0
  148. data/js/controls/validatorview/js.inc +0 -0
  149. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  150. data/js/controls/validatorview/themes/default/validator.png +0 -0
  151. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  152. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  153. data/js/controls/validatorview/validatorview.js +62 -0
  154. data/js/controls/window/js.inc +0 -0
  155. data/js/controls/window/themes/default/window.css +219 -0
  156. data/js/controls/window/themes/default/window.html +17 -0
  157. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  158. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  159. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  160. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  161. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  162. data/js/controls/window/themes/default/window_buttons.png +0 -0
  163. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  164. data/js/controls/window/themes/default/window_parts1.png +0 -0
  165. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  166. data/js/controls/window/themes/default/window_parts2.png +0 -0
  167. data/js/controls/window/window.js +286 -0
  168. data/js/core/class/class.js +318 -0
  169. data/js/core/class/js.inc +0 -0
  170. data/js/core/elem/elem.js +1383 -0
  171. data/js/core/elem/js.inc +0 -0
  172. data/js/core/event/event.js +153 -0
  173. data/js/core/event/js.inc +0 -0
  174. data/js/core/iefix/ie_css_element.htc +5 -0
  175. data/js/core/iefix/ie_css_style.htc +5 -0
  176. data/js/core/iefix/iefix.js +359 -0
  177. data/js/core/iefix/js.inc +0 -0
  178. data/js/core/rsence_ns/js.inc +0 -0
  179. data/js/core/rsence_ns/rsence_ns.js +21 -0
  180. data/js/datetime/calendar/calendar.js +198 -0
  181. data/js/datetime/calendar/js.inc +0 -0
  182. data/js/datetime/calendar/themes/default/calendar.css +108 -0
  183. data/js/datetime/calendar/themes/default/calendar.html +9 -0
  184. data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  185. data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  186. data/js/datetime/datetimevalue/datetimevalue.js +247 -0
  187. data/js/datetime/datetimevalue/js.inc +0 -0
  188. data/js/datetime/timesheet/js.inc +0 -0
  189. data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
  190. data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
  191. data/js/datetime/timesheet/timesheet.js +183 -0
  192. data/js/datetime/timesheet_item/js.inc +0 -0
  193. data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  194. data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  195. data/js/datetime/timesheet_item/timesheet_item.js +248 -0
  196. data/js/datetime/timesheet_item_edit/js.inc +0 -0
  197. data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  198. data/js/foundation/application/application.js +208 -0
  199. data/js/foundation/application/js.inc +0 -0
  200. data/js/foundation/control/control.js +339 -0
  201. data/js/foundation/control/controldefaults/controldefaults.js +56 -0
  202. data/js/foundation/control/controldefaults/js.inc +0 -0
  203. data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
  204. data/js/foundation/control/dummyvalue/js.inc +0 -0
  205. data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
  206. data/js/foundation/control/dyncontrol/js.inc +0 -0
  207. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  208. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  209. data/js/foundation/control/eventresponder/eventresponder.js +750 -0
  210. data/js/foundation/control/eventresponder/js.inc +0 -0
  211. data/js/foundation/control/js.inc +0 -0
  212. data/js/foundation/control/valuematrix/js.inc +0 -0
  213. data/js/foundation/control/valuematrix/valuematrix.js +135 -0
  214. data/js/foundation/control/valueresponder/js.inc +0 -0
  215. data/js/foundation/control/valueresponder/valueresponder.js +79 -0
  216. data/js/foundation/eventmanager/eventmanager.js +991 -0
  217. data/js/foundation/eventmanager/js.inc +0 -0
  218. data/js/foundation/geom/point/js.inc +0 -0
  219. data/js/foundation/geom/point/point.js +202 -0
  220. data/js/foundation/geom/rect/js.inc +0 -0
  221. data/js/foundation/geom/rect/rect.js +651 -0
  222. data/js/foundation/json_renderer/js.inc +0 -0
  223. data/js/foundation/json_renderer/json_renderer.js +246 -0
  224. data/js/foundation/system/js.inc +0 -0
  225. data/js/foundation/system/system.js +381 -0
  226. data/js/foundation/thememanager/js.inc +0 -0
  227. data/js/foundation/thememanager/thememanager.js +393 -0
  228. data/js/foundation/value/js.inc +0 -0
  229. data/js/foundation/value/value.js +183 -0
  230. data/js/foundation/view/js.inc +0 -0
  231. data/js/foundation/view/markupview/js.inc +0 -0
  232. data/js/foundation/view/markupview/markupview.js +114 -0
  233. data/js/foundation/view/morphanimation/js.inc +0 -0
  234. data/js/foundation/view/morphanimation/morphanimation.js +237 -0
  235. data/js/foundation/view/view.js +1812 -0
  236. data/js/foundation/view/viewdefaults/js.inc +0 -0
  237. data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
  238. data/js/lists/checkboxlist/checkboxlist.js +171 -0
  239. data/js/lists/checkboxlist/js.inc +0 -0
  240. data/js/lists/listitems/js.inc +0 -0
  241. data/js/lists/listitems/listitems.js +88 -0
  242. data/js/lists/propertylist/js.inc +0 -0
  243. data/js/lists/propertylist/propertylist.js +326 -0
  244. data/js/lists/radiobuttonlist/js.inc +0 -0
  245. data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
  246. data/js/util/reloadapp/js.inc +0 -0
  247. data/js/util/reloadapp/reloadapp.js +152 -0
  248. data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  249. data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
  250. data/js/util/sha/js.inc +0 -0
  251. data/js/util/sha/sha.js +426 -0
  252. data/js/views/centerview/centerview.js +75 -0
  253. data/js/views/centerview/js.inc +0 -0
  254. data/js/views/inlineview/inlineview.js +15 -0
  255. data/js/views/inlineview/js.inc +0 -0
  256. data/js/views/scrollview/js.inc +0 -0
  257. data/js/views/scrollview/scrollview.js +40 -0
  258. data/lib/conf/argv.rb +850 -0
  259. data/lib/conf/default.rb +219 -0
  260. data/lib/daemon/daemon.rb +387 -0
  261. data/lib/daemon/sigcomm.rb +64 -0
  262. data/lib/http/broker.rb +150 -0
  263. data/lib/http/rackup.rb +91 -0
  264. data/lib/http/request.rb +66 -0
  265. data/lib/http/response.rb +65 -0
  266. data/lib/plugins/dependencies.rb +285 -0
  267. data/lib/plugins/gui_plugin.rb +160 -0
  268. data/lib/plugins/guiparser.rb +123 -0
  269. data/lib/plugins/plugin.rb +438 -0
  270. data/lib/plugins/plugin_base.rb +162 -0
  271. data/lib/plugins/plugin_plugins.rb +81 -0
  272. data/lib/plugins/plugin_sqlite_db.rb +98 -0
  273. data/lib/plugins/pluginmanager.rb +635 -0
  274. data/lib/plugins/plugins.rb +169 -0
  275. data/lib/plugins/servlet.rb +108 -0
  276. data/lib/rsence.rb +32 -0
  277. data/lib/session/msg.rb +327 -0
  278. data/lib/session/sessionmanager.rb +522 -0
  279. data/lib/session/sessionstorage.rb +340 -0
  280. data/lib/transporter/transporter.rb +263 -0
  281. data/lib/util/gzstring.rb +9 -0
  282. data/lib/util/ruby19_fixes.rb +18 -0
  283. data/lib/values/hvalue.rb +378 -0
  284. data/lib/values/valuemanager.rb +172 -0
  285. data/plugins/client_pkg/client_pkg.rb +157 -0
  286. data/plugins/client_pkg/info.yaml +25 -0
  287. data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
  288. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  289. data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
  290. data/plugins/index_html/img/loading.gif +0 -0
  291. data/plugins/index_html/img/riassence.gif +0 -0
  292. data/plugins/index_html/index_html.rb +120 -0
  293. data/plugins/index_html/info.yaml +18 -0
  294. data/plugins/index_html/tmpl/index.html +15 -0
  295. data/plugins/main/info.yaml +18 -0
  296. data/plugins/main/js/main.js +84 -0
  297. data/plugins/main/main.rb +255 -0
  298. data/plugins/main/values.yaml +8 -0
  299. data/plugins/ticket/info.yaml +21 -0
  300. data/plugins/ticket/lib/common.rb +392 -0
  301. data/plugins/ticket/lib/favicon.rb +39 -0
  302. data/plugins/ticket/lib/file.rb +58 -0
  303. data/plugins/ticket/lib/img.rb +50 -0
  304. data/plugins/ticket/lib/objblob.rb +66 -0
  305. data/plugins/ticket/lib/rsrc.rb +34 -0
  306. data/plugins/ticket/lib/upload.rb +236 -0
  307. data/plugins/ticket/ticket.rb +333 -0
  308. data/setup/welcome/gui/welcome.yaml +92 -0
  309. data/setup/welcome/info.yaml +13 -0
  310. data/setup/welcome/text/welcome.html +9 -0
  311. data/setup/welcome/values.yaml +9 -0
  312. data/setup/welcome/welcome.rb +54 -0
  313. metadata +407 -0
@@ -0,0 +1,25 @@
1
+
2
+ # The human-readable product name of the package
3
+ title: Client Resource Package
4
+
5
+ # The human-readable version of the package
6
+ version: 2.0.0
7
+
8
+ # A brief description of the package (rdoc formatting supported)
9
+ description: |
10
+ This Bundle contains:
11
+ - The ClientPkg Servlet for managing client builds and serving the results.
12
+ - The ClientPkgBuild class for doing the builds.
13
+ - The ClientPkgCache class for storing the build results.
14
+ - The ClientPkgServe module that handles the request handling.
15
+
16
+ # A flag (when false) prevents the plugin from automatically reload when changed.
17
+ reloadable: false
18
+
19
+ # System version requirement.
20
+ sys_version: '>= 2.0.0'
21
+
22
+ category: :system
23
+
24
+ depends_on: :core
25
+
@@ -0,0 +1,561 @@
1
+ ## RSence
2
+ # Copyright 2009 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+ require 'jsmin_c'
11
+ require 'jscompress'
12
+ require 'html_min'
13
+
14
+
15
+ class ClientPkgBuild
16
+
17
+ def read_file( path )
18
+ filehandle = open( path, 'rb' )
19
+ filedata = filehandle.read
20
+ filehandle.close
21
+ return filedata
22
+ end
23
+
24
+ def gzip_string( string )
25
+ gz_string = GZString.new('')
26
+ gz_writer = Zlib::GzipWriter.new( gz_string, @gz_strategy )
27
+ gz_writer.write( string )
28
+ gz_writer.close
29
+ return gz_string
30
+ end
31
+
32
+ def read_css( src_path )
33
+ css_data = read_file( src_path )
34
+ unless @debug
35
+ unless @no_whitespace_removal
36
+ css_data = @html_min.minimize( css_data )
37
+ if @css_min
38
+ css_data = CSSMin.minify( css_data )
39
+ end
40
+ end
41
+ end
42
+ if @no_gzip
43
+ gz_css = false
44
+ else
45
+ gz_css = gzip_string( css_data )
46
+ end
47
+ return [css_data, gz_css]
48
+ end
49
+
50
+ def read_html( src_path )
51
+ html_data = read_file( src_path )
52
+ unless @debug
53
+ unless @no_whitespace_removal
54
+ html_data = @html_min.minimize( html_data )
55
+ end
56
+ end
57
+ if @no_gzip
58
+ gz_html = false
59
+ else
60
+ gz_html = gzip_string( html_data )
61
+ end
62
+ return [html_data, gz_html]
63
+ end
64
+
65
+ def read_gfx( src_path_theme, tgt_hash_gfx )
66
+ gfx_size = 0
67
+ src_files_gfx_path = File.join( src_path_theme, 'gfx' )
68
+ [ src_path_theme, src_files_gfx_path ].each do |src_files_gfx|
69
+ if File.exist?( src_files_gfx )
70
+ Dir.entries( src_files_gfx ).each do |src_gfx_filename|
71
+ src_file_gfx = File.join( src_files_gfx, src_gfx_filename )
72
+ if @gfx_formats.include?( src_file_gfx[-4..-1] )
73
+ tgt_hash_gfx[src_gfx_filename] = read_file( src_file_gfx )
74
+ gfx_size += File.stat( src_file_gfx ).size
75
+ end
76
+ end
77
+ end
78
+ end
79
+ return gfx_size
80
+ end
81
+
82
+ # processes theme-related files
83
+ def read_theme( bundle_dir, bundle_name )
84
+ @theme_names.each do |theme_name|
85
+ @theme_sizes[ theme_name ] = {
86
+ :css => [0,0],
87
+ :html => [0,0],
88
+ :gfx => 0
89
+ } unless @theme_sizes.has_key?( theme_name )
90
+ tgt_hash_theme = @themes[theme_name]
91
+ src_path_theme = File.join( bundle_dir, 'themes', theme_name )
92
+ [ File.join( src_path_theme, bundle_name+'.css' ),
93
+ File.join( src_path_theme, 'css', bundle_name+'.css' )
94
+ ].each do |src_file_css|
95
+ if File.exist?( src_file_css )
96
+ ( css_data, gz_css ) = read_css( src_file_css )
97
+ tgt_hash_css = tgt_hash_theme[:css][bundle_name] = {
98
+ :data => css_data,
99
+ :gzip => gz_css
100
+ }
101
+ @theme_sizes[ theme_name ][:css][0] += File.stat( src_file_css ).size
102
+ @theme_sizes[ theme_name ][:css][1] += css_data.size
103
+ @css_by_theme[ theme_name ][ bundle_name ] = css_data
104
+ end
105
+ end
106
+ [ File.join( src_path_theme, bundle_name+'.html' ),
107
+ File.join( src_path_theme, 'html', bundle_name+'.html' )
108
+ ].each do |src_file_html|
109
+ if File.exist?( src_file_html )
110
+ ( html_data, gz_html ) = read_html( src_file_html )
111
+ tgt_hash_html = tgt_hash_theme[:html][bundle_name] = {
112
+ :data => html_data,
113
+ :gzip => gz_html
114
+ }
115
+ @theme_sizes[ theme_name ][:html][0] += File.stat( src_file_html ).size
116
+ @theme_sizes[ theme_name ][:html][1] += html_data.size
117
+ @html_by_theme[ theme_name ][ bundle_name ] = html_data
118
+ end
119
+ end
120
+ tgt_hash_gfx = tgt_hash_theme[:gfx]
121
+ gfx_size = read_gfx( src_path_theme, tgt_hash_gfx )
122
+ @theme_sizes[ theme_name ][:gfx] += gfx_size
123
+ end
124
+ end
125
+
126
+ def add_bundle( bundle_name, bundle_path, entries )
127
+ has_themes = entries.include?( 'themes' ) and File.directory?( File.join( bundle_path, 'themes' ) )
128
+ if @bundles_found.has_key?( bundle_name )
129
+ @logger.log( "JSBuilder ERROR: duplicate bundles with the name #{bundle_name.inspect} found." )
130
+ @logger.log( " The first encountered is #{@bundles_found[ bundle_name ].inspect}" )
131
+ @logger.log( " The second encountered is #{bundle_path.inspect}" )
132
+ @logger.log( "abort." )
133
+ return false
134
+ end
135
+ unless @destinations.include?( bundle_name )
136
+ warn "JSBuilder WARNING: bundle name #{bundle_name.inspect} does not belong to any package, skipping.." if ARGV.include?('-d')
137
+ return true
138
+ end
139
+ js_data = read_file( File.join( bundle_path, bundle_name+'.js' ) )
140
+ @bundles_found[ bundle_name ] = {
141
+ :path => bundle_path,
142
+ :js_data => js_data,
143
+ :js_size => js_data.size,
144
+ :has_themes => has_themes
145
+ }
146
+ if has_themes
147
+ read_theme( bundle_path, bundle_name )
148
+ end
149
+ return true
150
+ end
151
+
152
+ def find_bundles( src_dir )
153
+ # makes sure the src_dir exists and is a directory
154
+ if File.exist?( src_dir ) and File.directory?( src_dir )
155
+ # array of item names in dir
156
+ dir_entries = Dir.entries( src_dir )
157
+ # the name of src_dir (src_dir itself is a full path)
158
+ dir_name = File.split( src_dir )[1]
159
+ # bundles are defined as directories with a js file of the same name plus the 'js.inc' tagfile
160
+ is_bundle = dir_entries.include?( @js_inc ) and dir_entries.include?( dir_name+'.js' )
161
+ # if src_dir is detected as a bundle, handle it in add_bundle
162
+ if is_bundle
163
+ add_bundle( dir_name, src_dir, dir_entries )
164
+ end
165
+ # descend into the sub-directory:
166
+ dir_entries.each do | dir_entry |
167
+ # don't descend into themes or hidden dirs:
168
+ next if dir_entry[0].chr == '.' or dir_entry == 'themes'
169
+ sub_dir = File.join( src_dir, dir_entry )
170
+ find_bundles( sub_dir ) if File.directory?( sub_dir )
171
+ end
172
+ end
173
+ end
174
+
175
+ def build_indexes
176
+ indexes = []
177
+ @destination_files.each_key do | package_name |
178
+ indexes.push( @destination_files[ package_name ] )
179
+ end
180
+ @jscompress.build_indexes( indexes.join("\n") ) unless @no_obfuscation
181
+ end
182
+
183
+ def pre_convert(jsc_data)
184
+ return @jscompress.compress( jsc_data )
185
+ end
186
+
187
+ def minimize_data
188
+ unless @quiet
189
+ @logger.log( '' )
190
+ @logger.log( "Client package build report.......................#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" )
191
+ @logger.log( '' )
192
+ @logger.log( "JS Package....................: Original | Minimized | Compressed" )
193
+ @logger.log( " : | |" )
194
+ end
195
+ @destination_files.each_key do | package_name |
196
+ jsc_data = @destination_files[package_name]
197
+ unless @debug
198
+ unless @no_whitespace_removal
199
+ jsc_data = @jsmin.minimize( jsc_data ) #.strip
200
+ end
201
+ unless @no_obfuscation
202
+ jsc_data = pre_convert( jsc_data )
203
+ end
204
+ end
205
+ @js[package_name] = jsc_data.strip
206
+ unless @no_gzip
207
+ gz_data = gzip_string( @js[package_name] )
208
+ @gz[package_name] = gz_data
209
+ end
210
+ unless @quiet
211
+ js_size = @destination_files[ package_name ].size
212
+ jsc_size = jsc_data.size
213
+ if @no_gzip
214
+ gz_size = -1
215
+ else
216
+ gz_size = gz_data.size
217
+ end
218
+ print_stat( package_name, js_size, jsc_size, gz_size )
219
+ end
220
+ end
221
+ end
222
+
223
+ def squeeze( js )
224
+ unless @no_whitespace_removal
225
+ begin
226
+ js = @jsmin.minimize( js )#.strip
227
+ rescue IndexError => e
228
+ warn "js can't get smaller using js; just ignoring jsmin"
229
+ end
230
+ end
231
+ unless @no_obfuscation
232
+ @jscompress.build_indexes( js )
233
+ js = @jscompress.compress( js )
234
+ end
235
+ return js.strip
236
+ end
237
+
238
+ def build_themes
239
+ unless @quiet
240
+ @logger.log( '' )
241
+ @logger.log( "Theme name and part...........: Original | Minimized | Compressed" )
242
+ @logger.log( " : | |" )
243
+ end
244
+ # compile "all-in-one" css and html resources
245
+ @theme_names.each do |theme_name|
246
+ html_templates = @html_by_theme[ theme_name ]
247
+ css_templates = @css_by_theme[ theme_name ]
248
+ theme_css_template_data = css_templates.values.join("\n")
249
+ theme_html_js_arr = []
250
+ theme_html_js_arr.push "HThemeManager._tmplCache[#{theme_name.to_json}]=#{html_templates.to_json}; "
251
+ theme_html_js_arr.push "HNoComponentCSS.push(#{theme_name.to_json});"
252
+ theme_html_js_arr.push "HNoCommonCSS.push(#{theme_name.to_json});"
253
+ theme_html_js_arr.push "HThemeManager._cssUrl( #{theme_name.to_json}, #{(theme_name+'_theme').to_json}, HThemeManager.themePath, null );"
254
+ theme_html_js_arr.push "HThemeManager.useCSS(#{theme_css_template_data.to_json}); "
255
+ theme_html_js = theme_html_js_arr.join('')
256
+ unless @debug
257
+ unless @no_whitespace_removal
258
+ theme_html_js = @jsmin.minimize( theme_html_js ) #.strip
259
+ end
260
+ unless @no_obfuscation
261
+ theme_html_js = pre_convert( theme_html_js )
262
+ end
263
+ end
264
+ @js[theme_name+'_theme'] = theme_html_js.strip
265
+ unless @no_gzip
266
+ theme_html_gz = gzip_string( @js[theme_name+'_theme'] )
267
+ @gz[theme_name+'_theme'] = theme_html_gz
268
+ end
269
+ unless @quiet
270
+ print_stat( "#{theme_name}/html", @theme_sizes[theme_name][:html][0], @theme_sizes[theme_name][:html][1], theme_html_gz.size )
271
+ end
272
+ @themes[theme_name][:css][theme_name+'_theme'] = {
273
+ :data => theme_css_template_data,
274
+ :gzip => false
275
+ }
276
+ unless @no_gzip
277
+ theme_css_template_data_gz = gzip_string( theme_css_template_data )
278
+ @themes[theme_name][:css][theme_name+'_theme'][:gzip] = theme_css_template_data_gz
279
+ end
280
+ unless @quiet
281
+ print_stat( "#{theme_name}/css", @theme_sizes[theme_name][:css][0], @theme_sizes[theme_name][:css][1], theme_css_template_data_gz.size )
282
+ print_stat( "#{theme_name}/gfx", @theme_sizes[theme_name][:gfx], -1, -1 )
283
+ @logger.log( '' )
284
+ end
285
+ end
286
+ end
287
+
288
+ def run
289
+
290
+ time_start = Time.now.to_f*10000
291
+
292
+ # hash of bundles per bundle name per theme; @html_by_theme[theme_name][bundle_name] = bundle_data
293
+ @html_by_theme = {}
294
+ @css_by_theme = {}
295
+ @theme_names.each do | theme_name |
296
+ @html_by_theme[ theme_name ] = {}
297
+ @css_by_theme[ theme_name ] = {}
298
+ end
299
+ @theme_sizes = {}
300
+ # hash of bundle -> package mappings (reverse @packages)
301
+ @destinations = {}
302
+ @package_names.each do | package_name |
303
+ @packages[ package_name ].each do |bundle_name|
304
+ @destinations[ bundle_name ] = [] unless @destinations.include?( bundle_name )
305
+ @destinations[ bundle_name ].push( package_name )
306
+ end
307
+ end
308
+ @bundles_found = {} # populated by add_bundle
309
+ @conversion_stats = {} # populated by add_hints
310
+ @src_dirs.each do | src_dir |
311
+ find_bundles( src_dir )
312
+ end
313
+ @destination_files = {} # rename to package_products
314
+ @package_names.each do |package_name|
315
+ @packages[package_name].each do |bundle_name|
316
+ if @bundles_found.has_key?( bundle_name )
317
+ @destination_files[ package_name ] = [] unless @destination_files.has_key?( package_name )
318
+ @destination_files[ package_name ].push( @bundles_found[bundle_name][:js_data] )
319
+ end
320
+ end
321
+ end
322
+ @destination_files.each do | package_name, package_array |
323
+ package_data = package_array.join('')
324
+ @destination_files[ package_name ] = package_data
325
+ end
326
+
327
+ build_indexes
328
+ minimize_data
329
+ build_themes
330
+
331
+ ms_taken = ((Time.now.to_f*10000)-time_start).to_i/10.0
332
+ @logger.log( "Time taken: #{ms_taken}ms\n\n" )
333
+
334
+ end
335
+
336
+ def setup_dirs
337
+ # make sure the src_dirs contain only absolute paths.
338
+ # if not, use current working dir as a logical prefix
339
+ @src_dirs.map! do |src_dir|
340
+ File.expand_path( src_dir )
341
+ end
342
+
343
+ @src_dirs.each do |src_dir|
344
+ # exit with error if the src dir does not exist
345
+ unless File.exist?( src_dir )
346
+ @logger.log( "JSBuilder ERROR: the source directory #{src_dir.inspect} does not exist." )
347
+ @logger.log( "abort." )
348
+ return false
349
+ end
350
+
351
+ end
352
+
353
+ @package_names.each do |package_name|
354
+ @js[package_name] = ''
355
+ @gz[package_name] = ''
356
+ end
357
+
358
+ # ensures the destination directories of various theme parts exist
359
+ @theme_names.each do |theme_name|
360
+ @themes[theme_name] = {
361
+ :css => {},
362
+ :html => {},
363
+ :gfx => {}
364
+ }
365
+ end
366
+
367
+ return true
368
+
369
+ end
370
+
371
+ def add_src_dir( src_dir )
372
+ @src_dirs.push( src_dir ) unless @src_dirs.include? src_dir
373
+ end
374
+ def add_src_dirs( src_dirs )
375
+ src_dirs.each { |src_dir| add_src_dir( src_dir ) }
376
+ end
377
+ def del_src_dir( src_dir )
378
+ @src_dirs.delete( src_dir ) if @src_dirs.include? src_dir
379
+ end
380
+ def del_src_dirs( src_dirs )
381
+ src_dirs.each { |src_dir| del_src_dir( src_dir ) }
382
+ end
383
+
384
+ def add_theme( theme_name )
385
+ @theme_names.push( theme_name ) unless @theme_names.include? theme_name
386
+ end
387
+ def add_themes( theme_names )
388
+ theme_names.each { |theme_name| add_theme( theme_name ) }
389
+ end
390
+ def del_theme( theme_name )
391
+ @theme_names.delete( theme_name ) if @theme_names.include? theme_name
392
+ end
393
+ def del_themes( theme_names )
394
+ theme_names.each { |theme_name| del_theme( theme_name ) }
395
+ end
396
+
397
+ def add_package( pkg_name, pkg_items )
398
+ if @packages.has_key?( pkg_name )
399
+ warn "Package #{pkg_name} already exists, ignoring."
400
+ else
401
+ @packages[ pkg_name ] = pkg_items
402
+ @package_names = @packages.keys
403
+ end
404
+ end
405
+ def add_packages( packages )
406
+ packages.each do | pkg_name, pkg_items |
407
+ add_package( pkg_name, pkg_items )
408
+ end
409
+ end
410
+ def del_package( pkg_name )
411
+ if @packages.has_key?( pkg_name )
412
+ @packages.delete( pkg_name )
413
+ @package_names = @packages.keys
414
+ end
415
+ end
416
+ def del_packages( packages )
417
+ packages.each { |pkg_name| del_package( pkg_name ) }
418
+ end
419
+
420
+ def add_reserved_name( reserved_name )
421
+ @reserved_names.push( reserved_name ) unless @reserved_names.include? reserved_name
422
+ end
423
+ def add_reserved_names( reserved_names )
424
+ reserved_names.each { |n| add_reserved_name( n ) }
425
+ end
426
+ def del_reserved_name( reserved_name )
427
+ @reserved_names.delete( reserved_name ) if @resered_names.include? reserved_name
428
+ end
429
+ def del_reserved_names( reserved_names )
430
+ reserved_names.each { |n| del_reserved_name( n ) }
431
+ end
432
+
433
+ def add_gfx_format( gfx_format )
434
+ @gfx_formats.push( gfx_format ) unless @gfx_formats.include? gfx_format
435
+ end
436
+ def add_gfx_formats( gfx_formats )
437
+ gfx_formats.each { |gfx_format| add_gfx_format( gfx_format ) }
438
+ end
439
+ def del_gfx_format( gfx_format )
440
+ @gfx_formats.delete( gfx_format ) if @gfx_formats.include? gfx_format
441
+ end
442
+ def del_gfx_formats( gfx_formats )
443
+ gfx_formats.each { |gfx_format| del_gfx_format( gfx_format ) }
444
+ end
445
+
446
+ #delete: @js_dst_dir, @themes_dst_dir,
447
+
448
+ attr_reader :js, :gz, :themes, :jsmin, :jscompress
449
+
450
+ def initialize( config, logger )
451
+
452
+ @logger = logger
453
+
454
+ # src_dirs is supposed to be an array of js source directories
455
+ @src_dirs = config[:src_dirs]
456
+
457
+ @js = {}
458
+ @gz = {}
459
+ @themes = {}
460
+
461
+ # theme_names is supposed to be an array of theme names to include in the build
462
+ @theme_names = config[:theme_names]
463
+
464
+ # pkg_info is supposed to be a hash of js package name definitions by pkg_name
465
+ @packages = config[:packages]
466
+
467
+ # packages is supposed to be a list of js package name definitions to include
468
+ @package_names = @packages.keys
469
+
470
+ # reserved_names is supposed to be a list of reserved words (words that shouldn't be compressed)
471
+ @reserved_names = config[:reserved_names]
472
+
473
+ # JSCompress compresses js by "obfuscating"
474
+ # all variables beginning with an underscore "_",
475
+ # eg. "_this" -> "_0", except
476
+ # those specified in the @reserved_names array
477
+ @jscompress = JSCompress.new( config[:reserved_names] )
478
+
479
+ # HTMLMin compresses css and html by removing whitespace
480
+ @html_min = HTMLMin.new
481
+
482
+ # JSMin removes js white-space (makes the source shorter)
483
+ @jsmin = JSMin.new
484
+
485
+ # makes sure the specified dirs are ok
486
+ return if not setup_dirs
487
+
488
+ begin
489
+ require 'rubygems'
490
+ require 'cssmin'
491
+ @css_min = true
492
+ rescue LoadError => e
493
+ warn "cssmin not installed. install cssmin (gem install cssmin) to improve the css minifiying."
494
+ @css_min = false
495
+ end
496
+
497
+ # contains a list of theme gfx extensions allowed
498
+ @gfx_formats = config[:gfx_formats]
499
+
500
+ # compression strategy ( fastest vs smallest )
501
+ @gz_strategy = config[:gz_strategy]
502
+ @no_gzip = config[:no_gzip]
503
+ @no_obfuscation = config[:no_obfuscation]
504
+ @no_whitespace_removal = config[:no_whitespace_removal]
505
+ @js_inc = config[:js_inc]
506
+ @debug = RSence.args[:debug]
507
+ @quiet = (not RSence.args[:verbose])
508
+ end
509
+
510
+ def find_newer( src_dir, newer_than )
511
+ if File.exist?( src_dir ) and File.directory?( src_dir )
512
+ Dir.entries( src_dir ).each do | dir_entry |
513
+ next if dir_entry[0].chr == '.'
514
+ sub_dir = File.join( src_dir, dir_entry )
515
+ if File.directory?( sub_dir )
516
+ return true if find_newer( sub_dir, newer_than )
517
+ else
518
+ if newer_than < File.stat( sub_dir ).mtime.to_i
519
+ @logger.log( "File changed: #{sub_dir}" )
520
+ return true
521
+ end
522
+ end
523
+ end
524
+ end
525
+ return false
526
+ end
527
+
528
+ def bundle_changes( newer_than )
529
+ @bundles_found.each do | bundle_name, bundle_info |
530
+ bundle_path = bundle_info[:path]
531
+ is_newer = find_newer( bundle_path, newer_than )
532
+ return true if is_newer
533
+ end
534
+ return false
535
+ end
536
+
537
+ def print_stat( package_name, dst_size, jsc_size, gz_size )
538
+ percent = 'n/a'
539
+ if dst_size > 0
540
+ percent1 = (100*(jsc_size/dst_size.to_f)).to_i.to_s + '%'
541
+ percent2 = (100*(gz_size/dst_size.to_f)).to_i.to_s + '%'
542
+ else
543
+ percent1 = '-'
544
+ percent2 = '-'
545
+ end
546
+ if jsc_size == -1
547
+ jsc_size = ''
548
+ percent1 = ''
549
+ end
550
+ if gz_size == -1
551
+ gz_size = ''
552
+ percent2 = ''
553
+ end
554
+ @logger.log( "#{package_name.ljust(30).gsub(' ','.')}: #{dst_size.to_s.rjust(9)} | #{jsc_size.to_s.rjust(6)} #{percent1.rjust(4)} | #{gz_size.to_s.rjust(6)} #{percent2.rjust(4)}" )
555
+ end
556
+
557
+ def flush
558
+ @jscompress.free_indexes
559
+ end
560
+ end
561
+
@@ -0,0 +1,50 @@
1
+ ## RSence
2
+ # Copyright 2007 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+ =begin
11
+ FileCache scans and stores the ui path for javascript files and
12
+ (css/html/image) theme files compiled as the result of the client
13
+ SDK's build_client.rb
14
+ =end
15
+ class ClientPkgCache
16
+
17
+ attr_reader :scan_time, :js_cache, :theme_cache, :gz_cache, :client_rev, :last_modified
18
+
19
+ # A lock flag for preventing different threads from
20
+ # scanning simultaneously in debug mode
21
+ @busy_scanning = false
22
+
23
+ # Initially, scan.
24
+ def initialize
25
+ @client_rev = 0
26
+ # scan_dirs
27
+ end
28
+
29
+ # Helper method to return the suffix of a file
30
+ def suffix(file_path)
31
+ return '.'+file_path.split('.')[-1]
32
+ end
33
+
34
+ # Helper method to return the time formatted according to the HTTP RFC
35
+ def httime(time)
36
+ return time.gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
37
+ end
38
+
39
+ def set_cache( js, gz, themes )
40
+ @js_cache = js
41
+ @gz_cache = gz
42
+ @theme_cache = themes
43
+ time_now = Time.now
44
+ @client_rev = time_now.to_i.to_s
45
+ @last_modified = httime( time_now )
46
+ end
47
+
48
+ end
49
+
50
+