compass_ae_console 1.0.0

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 (38) hide show
  1. data/GPL-3-LICENSE +674 -0
  2. data/README.md +5 -0
  3. data/Rakefile +30 -0
  4. data/app/controllers/compass_ae_console/erp_app/desktop/base_controller.rb +142 -0
  5. data/config/routes.rb +3 -0
  6. data/db/data_migrations/20110824020426_create_desktop_app_console.rb +19 -0
  7. data/lib/compass_ae_console.rb +8 -0
  8. data/lib/compass_ae_console/engine.rb +10 -0
  9. data/lib/compass_ae_console/version.rb +3 -0
  10. data/public/images/console_background.png +0 -0
  11. data/public/javascripts/erp_app/desktop/applications/compass_ae_console/module.js +180 -0
  12. data/spec/dummy/Rakefile +7 -0
  13. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  14. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  15. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  16. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  17. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  18. data/spec/dummy/config.ru +4 -0
  19. data/spec/dummy/config/application.rb +42 -0
  20. data/spec/dummy/config/boot.rb +10 -0
  21. data/spec/dummy/config/database.yml +8 -0
  22. data/spec/dummy/config/environment.rb +5 -0
  23. data/spec/dummy/config/environments/spec.rb +27 -0
  24. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  25. data/spec/dummy/config/initializers/inflections.rb +10 -0
  26. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  27. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  28. data/spec/dummy/config/initializers/session_store.rb +8 -0
  29. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  30. data/spec/dummy/config/locales/en.yml +5 -0
  31. data/spec/dummy/config/routes.rb +4 -0
  32. data/spec/dummy/public/404.html +26 -0
  33. data/spec/dummy/public/422.html +26 -0
  34. data/spec/dummy/public/500.html +26 -0
  35. data/spec/dummy/public/favicon.ico +0 -0
  36. data/spec/dummy/script/rails +6 -0
  37. data/spec/spec_helper.rb +60 -0
  38. metadata +165 -0
data/README.md ADDED
@@ -0,0 +1,5 @@
1
+ ![Logo](http://github.com/portablemind/compass_agile_enterprise/raw/master/erp_app/public/images/art/compass-logo-1-medium.png)
2
+
3
+ #Compass Console
4
+
5
+ Compass Console is an application that sits on top of the Compass AE framework that allows the user to interact with their rails application with a simulated rails console.
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'CompassAeConsole'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require "rspec/core/rake_task"
29
+ RSpec::Core::RakeTask.new(:spec)
30
+ task :default => :spec
@@ -0,0 +1,142 @@
1
+ module CompassAeConsole
2
+ module ErpApp
3
+ module Desktop
4
+ class BaseController < ::ErpApp::Desktop::BaseController
5
+ def command
6
+ logger.debug("command received:#{params}")
7
+ begin
8
+ result=""
9
+
10
+ # NOTE- the console uses a shared binding. this is due to the fact
11
+ # that binding instances are not serializable and cant be stored
12
+ # in a user session. Until this is resolved we use a global var.
13
+ # this should not pose a problem as the console should only be used
14
+ # in development or by a sysadmin.
15
+
16
+ # the shared binding is needed to allow for variable scope visibility
17
+ # across multiple requests
18
+ if($session_binding==nil)
19
+ $session_binding=binding
20
+ end
21
+
22
+ command_message=params[:command_message]
23
+ logger.debug("console session context:#{$session_binding}")
24
+ logger.debug("command:#{command_message}")
25
+
26
+ # here we handle any desktop console-specific command
27
+ # these can include non-eval related funtions
28
+ # or provide shortcuts to common eval expressions
29
+ result = case command_message
30
+ when /^-help/
31
+ help_message
32
+ when /^-clear/
33
+ #this is actually handled in the console desktop application
34
+ #evaluate_command("")
35
+ when /^-time/
36
+ evaluate_command("Time.now")
37
+ when /^-whoami/
38
+ evaluate_command("current_user.username")
39
+ else
40
+ evaluate_command(command_message)
41
+ end
42
+
43
+ logger.debug("result#{result}")
44
+
45
+ result_message =result.to_s.gsub("\n", "<br />\n")
46
+ render :json=> {:success=>"#{result_message}<hr><br>"}
47
+ end
48
+ end
49
+ private
50
+ #****************************************************************************
51
+ def help_message()
52
+ message = "<font color='lightgray'><b>Compass Desktop Console Help<b><hr>"
53
+ message<< "<ul>"
54
+ message<< "<li>-clear : <font color='yellow'>Clear screen contents.</font></li>"
55
+ message<< "<li>-help : <font color='yellow'>This help list.</font></li>"
56
+ message<< "<li>-time : <font color='yellow'>Current time.</font></li>"
57
+ message<< "<li>-whoami : <font color='yellow'>Logged in as.</font></li>"
58
+ message<< "</ul> </font>"
59
+ end
60
+ #****************************************************************************
61
+ def highlight_class(klass)
62
+ klass.columns.map do |column|
63
+ "<font color='yellow'>#{column.name}</font><font color='lightgray'>:</font><font color='gold'>#{column.type}</font>"
64
+ end
65
+ end
66
+
67
+ def hightlight_instance(instance)
68
+ buffer=""
69
+ instance.attributes.keys.sort.each do |model_attribute_key|
70
+ ErpTechSvcs::Util::CompassLogger.debug("key:#{model_attribute_key}")
71
+
72
+ buffer<<"<font color='yellow'>#{model_attribute_key}</font> <font color='lightgray'>=</font><font color='gold'>#{instance.attributes[model_attribute_key]}</font> <font color='lightgray'>, </font>"
73
+ end
74
+ return buffer
75
+ end
76
+ #****************************************************************************
77
+
78
+ def evaluate_command(command_message)
79
+ ErpTechSvcs::Util::CompassLogger.debug("evaluate_command(#{command_message}")
80
+ begin
81
+ result_eval = $session_binding.eval(command_message)
82
+ if(result_eval.respond_to?("superclass") && result_eval.superclass == ActiveRecord::Base)
83
+ result = render_active_record_model(result_eval)
84
+ elsif (result_eval.is_a? Array)
85
+ result = render_array(result_eval)
86
+ elsif (result_eval.is_a? Hash)
87
+ result = render_hash(result_eval)
88
+ else
89
+ #result="#{result_eval.class.to_s} #{result_eval.to_s}<br>"
90
+ result = "#{result_eval.to_s}<br>"
91
+ end
92
+
93
+ rescue Exception => e
94
+ result = "<font color='red'>#{e.to_s}</font>"
95
+ end
96
+
97
+ result
98
+ end
99
+ #****************************************************************************
100
+ def render_active_record_model(result_eval)
101
+ ErpTechSvcs::Util::CompassLogger.debug("render_active_record_model:#{result_eval}")
102
+ "<font color='YellowGreen'>#{result_eval.class} </font><br>#{highlight_class(result_eval)} "
103
+ end
104
+ #****************************************************************************
105
+ def render_array(result_eval)
106
+ result="#{result_eval.class.to_s}<br>"
107
+ ErpTechSvcs::Util::CompassLogger.debug("render_array:#{result_eval}")
108
+ count=0
109
+ result_eval.each do |array_element|
110
+ if(array_element.is_a? ActiveRecord::Base)
111
+ result<< "<font color='YellowGreen'>#{array_element.class}<font color='yellow'>[</font><font color='white'>#{count}</font><font color='yellow'>]</font> </font>#{hightlight_instance(array_element)} <br><br>"
112
+ else
113
+ result<<"<font color='YellowGreen'>#{array_element.class}<font color='yellow'>[</font><font color='white'>#{count}</font><font color='yellow'>]</font> </font>#{array_element} <br><br>"
114
+ end
115
+ count=count+1
116
+ end
117
+ result
118
+ end
119
+ #****************************************************************************
120
+ def render_hash(result_eval)
121
+ ErpTechSvcs::Util::CompassLogger.debug("render_hash:#{result_eval}")
122
+ result="#{result_eval.class.to_s}<br>"
123
+ count=0
124
+ result_eval.keys.each do |hash_key|
125
+ symbol_modifier=''
126
+ if(hash_key.is_a? Symbol)
127
+ symbol_modifier=':'
128
+ end
129
+ if(hash_key.is_a? ActiveRecord::Base)
130
+
131
+ result<< "<font color='YellowGreen'>#{result_eval.class}<font color='yellow'>[</font><font color='white'>#{symbol_modifier}#{hash_key}</font><font color='yellow'>] => </font> </font>#{highlight(result_eval[hash_key])} <br>"
132
+ else
133
+ result<<"<font color='YellowGreen'>#{result_eval.class}<font color='yellow'>[</font><font color='white'>#{symbol_modifier}#{hash_key}</font><font color='yellow'>] => </font> </font>#{result_eval[hash_key]} <br>"
134
+ end
135
+ count=count+1
136
+ end
137
+ result
138
+ end
139
+ end
140
+ end#end BaseController
141
+ end#end ErpApp
142
+ end#end Console
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ CompassAeConsole::Engine.routes.draw do
2
+ match '/erp_app/desktop/(/:action(.:format))' => "erp_app/desktop/base"
3
+ end
@@ -0,0 +1,19 @@
1
+ class CreateDesktopAppConsole
2
+ def self.up
3
+ app = DesktopApplication.create(
4
+ :description => 'Compass Console',
5
+ :icon => 'icon-console',
6
+ :javascript_class_name => 'Compass.ErpApp.Desktop.Applications.CompassAeConsole',
7
+ :internal_identifier => 'compass_ae_console',
8
+ :shortcut_id => 'compass_console-win'
9
+ )
10
+
11
+ app.preference_types << PreferenceType.iid('desktop_shortcut')
12
+ app.preference_types << PreferenceType.iid('autoload_application')
13
+ app.save
14
+ end
15
+
16
+ def self.down
17
+ DesktopApplication.destroy_all(['internal_identifier = ?','compass_ae_console'])
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ #compass libraries
2
+ require 'erp_app'
3
+ require 'erp_forms'
4
+
5
+ require "compass_ae_console/engine"
6
+
7
+ module CompassAeConsole
8
+ end
@@ -0,0 +1,10 @@
1
+ module CompassAeConsole
2
+ class Engine < Rails::Engine
3
+ isolate_namespace CompassAeConsole
4
+
5
+ initializer "compass_console.merge_public" do |app|
6
+ app.middleware.insert_before Rack::Lock, ::ActionDispatch::Static, "#{root}/public"
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module CompassAeConsole
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,180 @@
1
+ //**************************************************
2
+ // Compass Desktop Console
3
+ //**************************************************
4
+ var desktop_console_history=new Array();
5
+ var desktop_console_history_index=0;
6
+ //----------------------------------
7
+ // add startsWith method to string
8
+ String.prototype.startsWith = function (str){
9
+ return this.indexOf(str) == 0;
10
+ };
11
+ //---------------------------------
12
+ var startup_heading="<font color='goldenrod'><b>Compass Console Version 0.01</b>&nbsp;(<font color='white'>-help</font> for Help)</font><br>"
13
+ //---------------------------------
14
+ function sendCommand(destination,command){
15
+ update_history_panel("<font color='white'>"+command+"</font>")
16
+
17
+ if(command.startsWith("-clear")){
18
+ clear_history_panel(startup_heading+"<br><hr>");
19
+ }else{
20
+
21
+ Ext.Ajax.request({
22
+ url: '/compass_ae_console/erp_app/desktop/command',
23
+ params: {
24
+
25
+ command_message: command
26
+ },
27
+ success: function(response){
28
+ var text = response.responseText;
29
+ var result =Ext.JSON.decode(text)
30
+ update_history_panel("<font color='yellow'>"+result.success+"</font>")
31
+ }
32
+ });
33
+ }
34
+ }
35
+ //---------------------------------
36
+ function clear_history_panel(text){
37
+ var panel=Ext.getCmp('console_history_panel');
38
+
39
+ panel.update(""+text+"<br>");
40
+
41
+ var d = panel.body.dom;
42
+ d.scrollTop = d.scrollHeight - d.offsetHeight+10;
43
+ panel.doLayout();
44
+ }
45
+ //---------------------------------
46
+ function update_history_panel(text){
47
+ var panel=Ext.getCmp('console_history_panel');
48
+ var old = panel.body.dom.innerHTML;
49
+ panel.update(old+""+text+"<br>");
50
+
51
+ var d = panel.body.dom;
52
+ d.scrollTop = d.scrollHeight - d.offsetHeight+10;
53
+ panel.doLayout();
54
+ }
55
+
56
+ //---------------------------------
57
+ var console_history_panel ={
58
+ xtype: 'panel',
59
+
60
+ id : 'console_history_panel',
61
+ region: 'center',
62
+ bodyStyle: "background-image:url(/images/console_background.png) !important",
63
+ autoScroll:true,
64
+ html : startup_heading
65
+ }
66
+
67
+ //---------------------------------
68
+
69
+ var console_text_area ={
70
+ xtype: 'textarea',
71
+ region : 'south',
72
+ style: "{background-image:url(/images/console_background.png)}",
73
+ autoscroll: true,
74
+ id: "console_text_area",
75
+ enableKeyEvents: true,
76
+ listeners: {
77
+ afterrender: function(field) {
78
+ field.focus();
79
+ },
80
+
81
+
82
+ // use key-up for textarea since ENTER does not affect focus traversal
83
+ keyup: function(field, e){
84
+ //console.log("textarea keyup:"+e);
85
+ if (e.getKey() == e.ENTER){
86
+
87
+ sendCommand('console_text_area',field.getValue());
88
+ // add to history
89
+ desktop_console_history[desktop_console_history.length]=field.getValue().substring(0,field.getValue().length-1);
90
+ //update index
91
+ desktop_console_history_index=desktop_console_history.length
92
+ field.setValue("");
93
+ }else if (e.getKey() == e.UP){
94
+
95
+ if(desktop_console_history.length==0){
96
+ // no history to display
97
+ }else{
98
+ desktop_console_history_index--;
99
+ if(desktop_console_history_index >=0){
100
+
101
+ }
102
+ else{
103
+ desktop_console_history_index=desktop_console_history.length-1
104
+ }
105
+ field.setValue(desktop_console_history[desktop_console_history_index]);
106
+ }
107
+
108
+ }else if (e.getKey() == e.DOWN){
109
+
110
+ if(desktop_console_history.length==0){
111
+ // no history to display
112
+ }else{
113
+ desktop_console_history_index++;
114
+ if(desktop_console_history_index >=(desktop_console_history.length)){
115
+ desktop_console_history_index=0
116
+ }
117
+ else{
118
+ //desktop_console_history_index=desktop_console_history.length-1
119
+ }
120
+ field.setValue(desktop_console_history[desktop_console_history_index]);
121
+ }
122
+ }
123
+ }
124
+
125
+ }
126
+ }
127
+ //---------------------------------
128
+ var console_panel={
129
+ xtype: 'panel',
130
+ layout: 'border',
131
+ items :[ console_history_panel,console_text_area]
132
+
133
+ }
134
+
135
+ //---------------------------------
136
+
137
+ Ext.define("Compass.ErpApp.Desktop.Applications.CompassAeConsole",{
138
+ extend:"Ext.ux.desktop.Module",
139
+ id:'compass_console-win',
140
+ init : function(){
141
+ this.launcher = {
142
+ text: 'Compass Console',
143
+ iconCls:'icon-console',
144
+ handler: this.createWindow,
145
+ scope: this
146
+ }
147
+ },
148
+
149
+ createWindow : function(){
150
+ var desktop = this.app.getDesktop();
151
+ var win = desktop.getWindow('console');
152
+ if(!win){
153
+ win = desktop.createWindow({
154
+ id: 'console',
155
+ title:'Compass Console',
156
+ width:1000,
157
+ height:670,
158
+ iconCls: 'console_icon',
159
+ shim:false,
160
+ animCollapse:false,
161
+ resizable : false,
162
+ constrainHeader:true,
163
+ layout: 'fit',
164
+ items:[console_panel]
165
+ ,
166
+ tools:[
167
+ {
168
+ type:'help',
169
+ tooltip: 'about',
170
+ handler: function(event, toolEl, panel){
171
+ Ext.Msg.alert("About","<center><b>Compass Console</b><br><i>Version 0.01</i>")
172
+ }
173
+ }]
174
+
175
+ });
176
+ }
177
+ win.show();
178
+ sendCommand('console_text_area',"Rails.version ");
179
+ }
180
+ });
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,9 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_tree .
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */