rack-r 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -11,13 +11,13 @@ simple as rendering R code into your output. E.g.
11
11
  </script>
12
12
 
13
13
  RackR will pick this up on its way out and replace it with an empty
14
- container and some JavaScript code to perform an immediate async
15
- request for processing the R code.
14
+ container and some JavaScript code to perform an immediate
15
+ asynchronous request for processing the R code.
16
16
 
17
- RackR will answer to this reqyest with processing the R code in a temp
18
- directory, then searching this directory for displayable content and
19
- finally return the html code for display. So the example above will
20
- eventually turn into something like this.
17
+ RackR will answer to this request with processing the R code in a
18
+ temporary directory, then searching this directory for displayable
19
+ content, and finally return the html code for display. So the example
20
+ above will eventually turn into something like this:
21
21
 
22
22
  <div>
23
23
  <img src='/path/to/sinus.png' />
@@ -26,9 +26,9 @@ eventually turn into something like this.
26
26
  </pre>
27
27
  </div>
28
28
 
29
- Almost everything can conveniently be configured in a YAML file. RackR
30
- will create a sample config file in `config/rack-r.yml` or any other
31
- path given.
29
+ **Almost everything can conveniently be configured in a YAML file.**
30
+ RackR will create a sample config file in `config/rack-r.yml` or any
31
+ other path given.
32
32
 
33
33
 
34
34
  Install in Rails
@@ -51,6 +51,30 @@ Using RackR outside of Rails
51
51
  use RackR::Middleware, :config => 'path/to/config/rack-r.yml'
52
52
 
53
53
 
54
+ The RackR-Header
55
+ ----------------
56
+
57
+ The RackR-Header is a piece of R code that gets prepended to every R
58
+ script, which is processed by RackR. Ideally it will read your
59
+ database config and provide a seperate connection to your database via
60
+ a DBI compatible object. This is currently provided by a R function
61
+ called `connect`.
62
+
63
+ If you want RackR to automatically connect R scripts to your Rails
64
+ database it is a good idea to install Jeremy Stephens' YAML for R, as
65
+ mentioned in Dependencies.
66
+
67
+ Additionally there is a function `getPapertrail` which takes a
68
+ classname and an id, and retrieves previous versions of database entries
69
+ (stored by the popular versioning library
70
+ [Papertrail](https://github.com/airblade/paper_trail/)) in form of a
71
+ proper R dataframe.
72
+
73
+ The whole RackR-Header is a work in progress, if you have to adjust it
74
+ to your database config and/or end up writing helper functions like
75
+ `getPapertrail`, please consider to contribute your additions.
76
+
77
+
54
78
  Dependencies
55
79
  ------------
56
80
 
@@ -58,17 +82,11 @@ These instructions are for Debian Squeeze. Install R.
58
82
 
59
83
  apt-get install r-base r-cran-dbi
60
84
 
61
- Alternatively you can use the `rodbc` package.
85
+ Alternatively to `dbi` you can use the `rodbc` package.
62
86
 
63
87
  apt-get install r-cran-rodbc
64
88
 
65
- The RackR-Header is a pice of R code that gets prepended to every R
66
- script which is processed by RackR. Idealy it will read you database
67
- config and provide a seperate connection to your database via a DBI
68
- compatible `con` object.
69
-
70
- If you want RackR to automatically connect R script to yoyr Rails
71
- database it is a good idea to install Jeremy Stephens' YAML for R.
89
+ ### YAML
72
90
 
73
91
  wget http://cran.r-project.org/src/contrib/yaml_2.1.4.tar.gz
74
92
  R CMD INSTALL yaml_2.1.4.tar.gz
@@ -82,9 +100,6 @@ database it is a good idea to install Jeremy Stephens' YAML for R.
82
100
 
83
101
  apt-get install r-cran-rmysql
84
102
 
85
- The whole RackR-Header is a work in progress, if you have to adjust it
86
- to your database config, please consider to contribute your addition.
87
-
88
103
 
89
104
  Trouble shooting
90
105
  ----------------
@@ -103,4 +118,4 @@ a line.
103
118
  License
104
119
  -------
105
120
 
106
- RackR is released under MIT License, see LICENSE.
121
+ RackR is released under MIT License, see LICENSE.
data/RECEIPES.md ADDED
@@ -0,0 +1,30 @@
1
+ Receipes
2
+ ========
3
+
4
+ Boxplot the ages of users
5
+ -------------------------
6
+
7
+ svg('0_user_age.svg')
8
+ users <- dbReadTable(con, 'users')
9
+ users$age <- round(as.numeric(as.Date(users$birth_date) - Sys.Date()) / -365.25)
10
+ boxplot(users$age)
11
+
12
+
13
+ Output a html table of data
14
+ ---------------------------
15
+
16
+ some_data <- dbReadTable(con, 'some_table')
17
+ write.csv(some_data, file='some_data.csv')
18
+
19
+
20
+ Control the order of content
21
+ ----------------------------
22
+
23
+ The resulting files are processed/included aplhabetically. So if you
24
+ name you output devices accordingly, you can control the order. E.g.
25
+
26
+ svg('1st_graphic_is_a_sinus.svg')
27
+ plot(sin)
28
+ svg('2nd_graphic_is_a_cosinus.svg')
29
+ plot(cos)
30
+
@@ -10,6 +10,8 @@ module RackR
10
10
  def call(env)
11
11
  @env = env
12
12
  return call_app unless config.enabled
13
+ return call_app if config.skip_pattern &&
14
+ path_info.match(config.skip_pattern)
13
15
  if get? and md = match_path
14
16
  key = md.to_a.last
15
17
  return [200, {}, ['RackR OK.']] if key.empty?
@@ -160,21 +162,34 @@ r_header: |
160
162
  # modify this header in rack-r config file
161
163
  library(yaml)
162
164
  library(DBI)
163
- library(RSQLite)
164
- root <- '<%= Rails.root %>'
165
- dbconf <- yaml.load_file(paste(root, '/config/database.yml', sep=''))
166
- dbfile <- paste(root, '/', dbconf$development$database, sep='')
167
- drv <- dbDriver("SQLite")
168
- con <- dbConnect(drv, dbname=dbfile)
165
+ root <- '/home/phil/src/controlling'
166
+ dbconf <- yaml.load_file(paste(root, '/config/database.yml', sep=''))$development
167
+ connect <- function() {
168
+ if(dbconf$adapter=='sqlite3') {
169
+ library(RSQLite)
170
+ dbfile <- paste(root, '/', dbconf$database, sep='')
171
+ drv <- dbDriver("SQLite")
172
+ return(dbConnect(drv, dbname=dbfile))
173
+ } else if (dbconf$adapter=='mysql') {
174
+ library(RMySQL)
175
+ return(dbConnect(MySQL(), user=dbconf$username, dbname=dbconf$database))
176
+ }
177
+ }
178
+ getPapertrail <- function(model, id) {
179
+ sql <- paste("SELECT object FROM versions WHERE ",
180
+ "item_type='", model, "' AND item_id='",
181
+ id, "' AND event='update'", sep='')
182
+ connection <- connect()
183
+ result <- dbSendQuery(connection, sql)
184
+ rows <- fetch(result)
185
+ lapply(rows$object, yaml.load)
186
+ }
169
187
  ajaxer: |
170
188
  <div class='rack_r' id='<%= key %>'>Processing R...</div>
171
189
  <script type='text/javascript'>
172
190
  var url = '<%= config.url_scope %>/<%= key %>';
173
191
  $.ajax(url, { success: function(data) { $('#<%= key %>').html(data); } });
174
192
  </script>
175
- html:
176
- prefix: <div class='rack_r_out'>
177
- suffix: </div>
178
193
  templates:
179
194
  - pattern: .svg$
180
195
  process: |
@@ -189,15 +204,18 @@ templates:
189
204
  url = "#{config.public_url}/#{file}"
190
205
  template: |
191
206
  <img src='<%= url %>' />
192
- - pattern: .csv$
207
+ - pattern: .download.csv$
193
208
  process: |
194
- table = CSV.read(src)
195
209
  # TODO build dst with key, otherwise may lead to undesired results
196
210
  dst = File.join(public_path, file)
197
211
  FileUtils.cp(src, dst)
198
212
  url = "#{config.public_url}/#{file}"
199
213
  template: |
200
214
  <a href='<%= url %>'><%= file %></a>
215
+ - pattern: .table.csv$
216
+ process: |
217
+ table = CSV.read(src)
218
+ template: |
201
219
  <table>
202
220
  <% table.each do |row| %>
203
221
  <tr>
@@ -207,12 +225,23 @@ templates:
207
225
  </tr>
208
226
  <% end %>
209
227
  </table>
228
+ - pattern: .lazy.csv$
229
+ process: |
230
+ table = CSV.read(src)
231
+ template: |
232
+ <pre class="lazycsv"><%= table %></pre>
210
233
  - pattern: .Rout$
211
234
  process: |
212
235
  rout = File.read(src)
213
236
  template: |
214
237
  <pre><%= rout %></pre>
215
- node_regex: <script\s+type=['"]text/r['"]\s*>(.*?)</script>
238
+ node_regex: <script\s+type=['"]text/r['"]\s*>(.*?)</script>
239
+ node_stanza:
240
+ prefix: <script type='text/r'>
241
+ suffix: </script>
242
+ html:
243
+ prefix: <div class='rack_r_out'>
244
+ suffix: </div>
216
245
  #
217
246
  # uncomment the following two lines, if your project
218
247
  # doesn't use jquery already
@@ -0,0 +1,19 @@
1
+ module RackR
2
+ class TemplateHandler
3
+ def call(template)
4
+ [ "'<script type=\\'text/r\\'>",
5
+ escape_text(template.source),
6
+ "</script>'.html_safe" ].join
7
+ end
8
+
9
+ private
10
+
11
+ # stolen from erubis
12
+ def escape_text(text)
13
+ text.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\'
14
+ end
15
+
16
+ end
17
+ end
18
+
19
+ ActionView::Template.register_template_handler :rackr, RackR::TemplateHandler.new
@@ -1,3 +1,3 @@
1
1
  module RackR
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/rack_r.rb CHANGED
@@ -1,2 +1,4 @@
1
- require "rack_r/railtie" if defined? Rails
2
-
1
+ if defined? Rails
2
+ require "rack_r/railtie"
3
+ require 'rack_r/template_handler'
4
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-r
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 1
9
- - 0
10
- version: 0.1.0
8
+ - 1
9
+ version: 0.1.1
11
10
  platform: ruby
12
11
  authors:
13
12
  - Phil Hofmann
@@ -15,7 +14,8 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2012-04-23 00:00:00 Z
17
+ date: 2013-05-20 00:00:00 +02:00
18
+ default_executable:
19
19
  dependencies: []
20
20
 
21
21
  description: Use R in your Rack stack
@@ -33,16 +33,19 @@ files:
33
33
  - Gemfile
34
34
  - LICENSE
35
35
  - README.md
36
+ - RECEIPES.md
36
37
  - Rakefile
37
38
  - TODO
38
39
  - lib/rack_r.rb
39
40
  - lib/rack_r/middleware.rb
40
41
  - lib/rack_r/railtie.rb
42
+ - lib/rack_r/template_handler.rb
41
43
  - lib/rack_r/version.rb
42
44
  - rack-r.gemspec
43
45
  - test/example.r
44
46
  - test/helper.rb
45
47
  - test/test_rack_r.rb
48
+ has_rdoc: true
46
49
  homepage: http://branch14.org/rack-r
47
50
  licenses: []
48
51
 
@@ -53,27 +56,23 @@ require_paths:
53
56
  - lib
54
57
  - rails
55
58
  required_ruby_version: !ruby/object:Gem::Requirement
56
- none: false
57
59
  requirements:
58
60
  - - ">="
59
61
  - !ruby/object:Gem::Version
60
- hash: 3
61
62
  segments:
62
63
  - 0
63
64
  version: "0"
64
65
  required_rubygems_version: !ruby/object:Gem::Requirement
65
- none: false
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- hash: 3
70
69
  segments:
71
70
  - 0
72
71
  version: "0"
73
72
  requirements: []
74
73
 
75
74
  rubyforge_project:
76
- rubygems_version: 1.8.23
75
+ rubygems_version: 1.3.6
77
76
  signing_key:
78
77
  specification_version: 3
79
78
  summary: Use R in your Rack stack