omf_web 0.9.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +31 -0
  3. data/bin/omf_web_server.rb +157 -0
  4. data/doc/screenshot2.png +0 -0
  5. data/doc/widget_detail.png +0 -0
  6. data/example/demo/data_sources/downloads.rb +2 -1
  7. data/example/simple/README.md +12 -13
  8. data/example/simple/create_waveform.rb +29 -0
  9. data/example/simple/introduction.md +17 -0
  10. data/example/simple/sample.sq3 +0 -0
  11. data/example/simple/sample.sql +1008 -0
  12. data/example/simple/simple.yaml +62 -0
  13. data/example/simple/simple_dynamic.yaml +66 -0
  14. data/lib/irods4r/file.rb +15 -14
  15. data/lib/irods4r/icommands.rb +18 -18
  16. data/lib/irods4r.rb +9 -9
  17. data/lib/omf-web/config.ru +41 -16
  18. data/lib/omf-web/content/git_repository.rb +32 -31
  19. data/lib/omf-web/content/irods_repository.rb +34 -33
  20. data/lib/omf-web/content/repository.rb +48 -44
  21. data/lib/omf-web/data_source_proxy.rb +33 -22
  22. data/lib/omf-web/rack/session_authenticator.rb +48 -12
  23. data/lib/omf-web/rack/tab_mapper.rb +30 -36
  24. data/lib/omf-web/rack/websocket_handler.rb +26 -25
  25. data/lib/omf-web/session_store.rb +16 -13
  26. data/lib/omf-web/theme/abstract_page.rb +26 -22
  27. data/lib/omf-web/theme/bright/page.rb +84 -34
  28. data/lib/omf-web/theme/bright/stacked_renderer.rb +20 -19
  29. data/lib/omf-web/theme.rb +14 -9
  30. data/lib/omf-web/thin/runner.rb +38 -36
  31. data/lib/omf-web/thin/server.rb +255 -0
  32. data/lib/omf-web/version.rb +1 -1
  33. data/lib/omf-web/widget/data_widget.rb +6 -6
  34. data/lib/omf-web/widget/text/maruku/helpers.rb +33 -30
  35. data/lib/omf-web/widget/text/maruku/input/parse_block.rb +117 -117
  36. data/lib/omf-web/widget/text/maruku/output/to_html.rb +155 -154
  37. data/lib/omf-web/widget/text/maruku.rb +17 -16
  38. data/omf_web.gemspec +6 -2
  39. data/sample.sq3 +0 -0
  40. data/share/htdocs/graph/js/gauge.js +524 -0
  41. data/share/htdocs/vendor/VERSION_MAP.yaml +3 -3
  42. data/share/htdocs/vendor/backbone-1.0.0/backbone.js +1571 -0
  43. data/share/htdocs/vendor/d3-3.0/LICENSE.brewer.txt +38 -0
  44. data/share/htdocs/vendor/d3-3.0/colorbrewer.js +1 -0
  45. data/share/htdocs/vendor/d3-3.0/d3.js +8810 -0
  46. data/share/htdocs/vendor/d3-3.0/d3.min.js +5 -0
  47. data/share/htdocs/vendor/geo_json/Readme.txt +71 -0
  48. data/share/htdocs/vendor/geo_json/regions.json +41 -0
  49. data/share/htdocs/vendor/geo_json/switzerland.json +24 -0
  50. data/share/htdocs/vendor/geo_json/world.json +497 -0
  51. data/share/htdocs/vendor/nv_d3/js/nv.d3.js +8801 -4447
  52. data/share/htdocs/vendor/spin/jquery.spin.js +46 -0
  53. data/share/htdocs/vendor/spin/spin.js +349 -0
  54. data/share/htdocs/vendor/spin/spin.min.js +1 -0
  55. data/share/htdocs/vendor/underscore-1.4.4/underscore.js +1227 -0
  56. metadata +63 -48
  57. data/example/simple/data_sources/gimi31.sq3 +0 -0
  58. data/example/simple/data_sources/ping_source.rb +0 -56
  59. data/example/simple/simple_viz_server.rb +0 -39
  60. data/example/simple/widgets/charts_tab.yaml +0 -38
  61. data/share/.DS_Store +0 -0
  62. data/share/htdocs/.DS_Store +0 -0
  63. data/share/htdocs/vendor/backbone-0.5.3/backbone.js +0 -1158
  64. data/share/htdocs/vendor/underscore-1.2.1/underscore.js +0 -958
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a076091a3915e52b1dddc6ed1f2f65b4a28c6905
4
+ data.tar.gz: b861770697dad3299f6f9a8e1c0b800b9c32058a
5
+ SHA512:
6
+ metadata.gz: d5d66a617e076f8960fe39656f1fe6ce77b82d5df76bcf6f12fc6f61822d57b5d8aef43b3a6df72a46a09b60a44f29c18301ab3a2a383c7e579bd1aae44d6497
7
+ data.tar.gz: ab162397635d906b9d0ded7117723d75dd81ce53bacb8f64e5f6b5547ccbf4bac985964785e946663140e0a7b093919fae6e1ed1b3a253ff8c60901b07607129
data/README.md CHANGED
@@ -4,6 +4,37 @@ This Ruby 1.9 gem provides the components for building a web-based data visualiz
4
4
  The typical use case is to allow a user to investigate a data set stored in one or more databases
5
5
  as well as life data streams.
6
6
 
7
+ Installation
8
+ ------------
9
+
10
+ At this stage the best course of action is to clone the repository
11
+
12
+ % git clone https://github.com/mytestbed/omf_web.git
13
+ % cd omf_web
14
+ % export OMF_WEB=`pwd`
15
+ % bundle install
16
+
17
+
18
+ Getting Started
19
+ ---------------
20
+
21
+ There are a few example sites in the 'example' directory. They have been developed in the context of various demos and
22
+ may not always be kept up to date. The one which should always work is 'example/simple'. Try it out.
23
+
24
+ % $OMF_WEB/bin/omf_web_server.rb --config $OMF_WEB/example/simple/simple.yaml start
25
+
26
+ This starts a webserver which can be accessed locally via 'http:localhost:4050'. Connecting to it through your favorite
27
+ web browser should display a web page approx. looking like:
28
+
29
+ ![Screenshot of starting page](https://raw.github.com/mytestbed/omf_web/master/doc/screenshot2.png "Screenshot")
30
+
31
+ Don't forget to press the icon buttons
32
+ ![icon buttons](https://raw.github.com/mytestbed/omf_web/master/doc/widget_detail.png "icon buttons")
33
+ on the left widget header.
34
+
35
+ Overview
36
+ --------
37
+
7
38
  The core components are:
8
39
 
9
40
  * A **DataSource** which holds a specific data set organised as a table. It is defined
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env ruby
2
+ BIN_DIR = File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__)
3
+ TOP_DIR = File.join(BIN_DIR, '..')
4
+ $: << File.join(TOP_DIR, 'lib')
5
+
6
+ DESCR = %{
7
+ Start an OMF WEB site ...
8
+ }
9
+
10
+ require 'omf_common/lobject'
11
+ require 'omf_oml/table'
12
+ require 'omf_oml/sql_source'
13
+
14
+
15
+ OMF::Common::Loggable.init_log 'omf_web'
16
+
17
+ $config_file_dir = nil
18
+
19
+ require 'omf_oml/table'
20
+
21
+ def load_environment(opts)
22
+ unless cf = opts[:omf_config_file]
23
+ puts "Missing config file"
24
+ abort
25
+ end
26
+
27
+ unless File.readable? cf
28
+ puts "Can't read config file '#{cf}'"
29
+ abort
30
+ end
31
+
32
+ $config_file_dir = File.dirname(cf)
33
+ cfg = YAML.load_file(cf)
34
+ (cfg['server'] || {}).each do |k, v|
35
+ k = k.to_sym
36
+ case k
37
+ when :port
38
+ opts[:port] = v.to_i
39
+ else
40
+ opts[k] = v
41
+ end
42
+ end
43
+ databases = {}
44
+ (cfg['data_sources'] || []).each do |ds|
45
+ load_datasource(ds, databases)
46
+ end
47
+ (cfg['repositories'] || []).each do |repo|
48
+ load_repository(repo)
49
+ end
50
+
51
+ unless wa = cfg['widgets']
52
+ puts "Can't find 'widgets' section in config file '#{cf}' - #{cfg.keys}"
53
+ abort
54
+ end
55
+ wa.each do |w|
56
+ OMF::Web.register_widget w
57
+ end
58
+ end
59
+
60
+ def load_datasource(config, databases)
61
+ unless id = config['id']
62
+ puts "Missing id in datasource configuration"
63
+ abort
64
+ end
65
+ unless table_name = config['table']
66
+ puts "Missing 'table' in datasource configuration '#{id}'"
67
+ abort
68
+ end
69
+ unless db_cfg = config['database']
70
+ puts "Missing database configuration in datasource '#{id}'"
71
+ abort
72
+ end
73
+ db = get_database(db_cfg, databases)
74
+ unless table = db.create_table(table_name, :limit => config['limit'], :check_interval => config['dynamic'])
75
+ puts "Can't find table '#{table_name}' in database '#{db}'"
76
+ abort
77
+ end
78
+
79
+ OMF::Web.register_datasource table, name: id
80
+ end
81
+
82
+ def get_database(config, databases)
83
+ if config.is_a? String
84
+ if db = databases[config]
85
+ return db
86
+ end
87
+ puts "Database '#{config}' not defined - (#{databases.keys})"
88
+ abort
89
+ end
90
+ unless id = config['id']
91
+ puts "Missing id in database configuration"
92
+ abort
93
+ end
94
+ unless id = config['id']
95
+ puts "Database '#{config}' not defined - (#{databases.keys})"
96
+ abort
97
+ end
98
+ unless url = config['url']
99
+ puts "Missing URL for database '#{id}'"
100
+ abort
101
+ end
102
+ if url.start_with?('sqlite://') && ! url.start_with?('sqlite:///')
103
+ # inject top dir
104
+ url.insert('sqlite://'.length, $config_file_dir + '/')
105
+ end
106
+ puts "URL: #{url}"
107
+ begin
108
+ return databases[id] = OMF::OML::OmlSqlSource.new(url, :check_interval => 3.0)
109
+ rescue Exception => ex
110
+ puts "Can't connect to database '#{id}' - #{ex}"
111
+ abort
112
+ end
113
+ end
114
+
115
+ def load_repository(config)
116
+ unless id = config['id']
117
+ puts "Missing id in respository configuration"
118
+ abort
119
+ end
120
+ unless type = config['type']
121
+ puts "Missing 'type' in respository configuration '#{id}'"
122
+ abort
123
+ end
124
+
125
+ require 'omf-web/content/repository'
126
+ case type
127
+ when 'file'
128
+ unless top_dir = config['top_dir']
129
+ puts "Missing 'top_dir' in respository configuration '#{id}'"
130
+ abort
131
+ end
132
+ unless top_dir.start_with? '/'
133
+ top_dir = File.join($config_file_dir, top_dir)
134
+ end
135
+ OMF::Web::ContentRepository.register_repo(id, type: :file, top_dir: top_dir)
136
+ else
137
+ puts "Unknown repository type '#{type}'. Only supporting 'file'."
138
+ abort
139
+ end
140
+ end
141
+
142
+ # Configure the web server
143
+ #
144
+ opts = {
145
+ app_name: 'simple',
146
+ page_title: 'Simple Demo',
147
+ port: 4000,
148
+ handlers: {
149
+ pre_parse: lambda do |p, runner|
150
+ p.on("--config CONF_FILE", "File holding description of web site") {|f| runner.options[:omf_config_file] = f}
151
+ end,
152
+ # delay connecting to databases to AFTER we may run as daemon
153
+ post_parse: lambda { |r| load_environment(r.options) },
154
+ }
155
+ }
156
+ require 'omf_web'
157
+ OMF::Web.start(opts)
Binary file
Binary file
@@ -7,7 +7,8 @@ require 'omf_web'
7
7
  OMF::Web.register_datasource table
8
8
 
9
9
  skip_first_line = true
10
- File.open("#{File.dirname(__FILE__)}/downloads.csv", "r").read.gsub!(/\r\n?/, "\n").each_line do |line|
10
+ #puts File.open("#{File.dirname(__FILE__)}/downloads.csv", "r").read.gsub(/\r\n?/, "\n")
11
+ File.open("#{File.dirname(__FILE__)}/downloads.csv", "r").read.gsub(/\r\n?/, "\n").each_line do |line|
11
12
  if skip_first_line
12
13
  skip_first_line = false
13
14
  else
@@ -6,25 +6,24 @@ Essentially the 'Hello World' example of a viz server. Taking data out of a data
6
6
  Start the server through:
7
7
 
8
8
  ruby -I$OMF_WEB_HOME/lib $OMF_WEB_HOME/example/simple/simple_viz_server.rb start
9
-
9
+ ruby --I$OMF_WEB_HOME/lib $OMF_WEB_HOME/bin/omf_web_server.rb --config simple.yaml start
10
+
10
11
  where $OMF_WEB_HOME points to the directory containing the __omf_web__ code. You will also need to __omf_oml__ package.
11
12
  You may either install the Gem, or download the source code from https://github.com/mytestbed/omf_oml. In the later case you
12
- will need to add a '-I$OMF_OML_HOME/lib' falg to the above command.
13
+ will need to add a '-I$OMF_OML_HOME/lib' flag to the above command.
13
14
 
14
15
  After all that, the console putput should look like:
15
16
 
16
- DEBUG OmlSqlSource: Opening DB (sqlite:///Users/max/src/omf_web/example/simple/data_sources/gimi31.sq3)
17
- DEBUG OmlSqlSource: DB: #<Sequel::SQLite::Database: "sqlite:///Users/max/src/omf_web/example/simple/data_sources/gimi31.sq3">
18
- DEBUG OmlSqlSource: Finding tables [:_senders, :_experiment_metadata, :pingmonitor_myping]
19
- DEBUG OmlSqlSource: Found table: pingmonitor_myping
20
- DEBUG OmlSchema: schema: '[{:name=>:oml_sender, :type=>:string, :title=>"Oml Sender"}, {:name=>:oml_sender_id, :type=>:integer, :title=>"Oml Sender Id"}, {:name=>:oml_seq, :type=>:integer, :title=>"Oml Seq"}, {:name=>:oml_ts_client, :type=>:float, :title=>"Oml Ts Client"}, {:name=>:oml_ts_server, :type=>:float, :title=>"Oml Ts Server"}, {:name=>:dest_addr, :type=>:string, :title=>"Dest Addr"}, {:name=>:ttl, :type=>:integer, :title=>"Ttl"}, {:name=>:rtt, :type=>:float, :title=>"Rtt"}, {:name=>:rtt_unit, :type=>:string, :title=>"Rtt Unit"}]'
21
- INFO PingDB: Stream: pingmonitor_myping
22
- DEBUG OmlSqlRow-pingmonitor_myping: Read 145/145 rows from 'pingmonitor_myping'
23
- INFO Server: >> Thin web server (v1.3.1 codename Triple Espresso)
17
+ DEBUG OmlSqlSource: Opening DB (sqlite://sample.sq3)
18
+ DEBUG OmlSqlSource: DB: #<Sequel::SQLite::Database: "sqlite://sample.sq3">
19
+ DEBUG OmlSchema: schema: '[{:name=>:oml_sender_id, :type=>:integer, :title=>"Oml Sender Id"} ...
20
+ DEBUG OmlSqlRow-wave: Read 1000 (total 1000) rows from 'wave'
21
+ INFO Server: >> Thin web server (v1.5.1 codename Straight Razor)
24
22
  DEBUG Server: >> Debugging ON
25
23
  DEBUG Server: >> Tracing ON
26
24
  INFO Server: >> Maximum connections set to 1024
27
- INFO Server: >> Listening on 0.0.0.0:3000, CTRL+C to stop
25
+ INFO Server: >> Listening on 0.0.0.0:4050, CTRL+C to stop
26
+
28
27
 
29
- This starts a web server on the local machine listening on port 3000. Now point your browser there and you should see the
30
- result of a 'ping' experiment.
28
+ This starts a web server on the local machine listening on port 4050. Now point your browser there and you should see the
29
+ result of a some experiment.
@@ -0,0 +1,29 @@
1
+ #
2
+ # File to create a very simple waveform.
3
+ #
4
+
5
+ time_step = 0.001
6
+
7
+ amplitude = [0.2, 0.8, 0.6]
8
+ frequency = [10, 14, 18]
9
+
10
+ f = File.open('sample.sql', 'w')
11
+ f.write %{
12
+ BEGIN TRANSACTION;
13
+ CREATE TABLE _senders (name TEXT PRIMARY KEY, id INTEGER UNIQUE);
14
+ INSERT INTO "_senders" VALUES('ch1',1);
15
+ CREATE TABLE _experiment_metadata (key TEXT PRIMARY KEY, value TEXT);
16
+ INSERT INTO "_experiment_metadata" VALUES('start_time','#{Time.now.to_i}');
17
+ CREATE TABLE "wave" (oml_sender_id INTEGER, oml_seq INTEGER, oml_ts_client REAL, oml_ts_server REAL, "t" REAL, "y" REAL);
18
+ }
19
+
20
+ 1000.times do |i|
21
+ time = i * time_step
22
+ y = 0
23
+ 3.times do |j|
24
+ y += amplitude[j] * Math.sin(2 * Math::PI * frequency[j] * time)
25
+ end
26
+ f.write "INSERT INTO \"wave\" VALUES(1,#{i},#{time},#{time},#{time},#{y});\n"
27
+ end
28
+ f.write "END TRANSACTION;\n"
29
+ f.close
@@ -0,0 +1,17 @@
1
+ title: Introduction
2
+
3
+
4
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin
5
+ sollicitudin nibh eu ligula lobortis ornare. Sed nibh nibh,
6
+ ullamcorper at vehicula ac, molestie ac nunc. Duis sodales, nisi vel
7
+ pellentesque imperdiet, nisi massa accumsan lorem, gravida scelerisque
8
+ velit est vitae eros. Suspendisse eu lacinia elit.
9
+
10
+
11
+ Suspendisse laoreet, lacus quis dignissim volutpat, dolor augue convallis lectus,
12
+ ac consectetur yyyy sem iaculis diam. Donec iaculis mattis iaculis.
13
+ Curabitur ut nisl in sapien semper ullamcorper in id turpis. Vivamus
14
+ sed sapien justo, ac scelerisque nibh. Sed eget quam velit. Lorem
15
+ ipsum dolor sit amet, consectetur adipiscing elit.
16
+
17
+
Binary file