metaruby 1.0.0.rc1 → 1.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 58ab70780a173a248a3f2a14a86d9b210e740f14
4
- data.tar.gz: 178e85ee93eb3727f53afc7d8b0c1505cd01fa0d
3
+ metadata.gz: edefd7e59dcbf75b2cd69877ae482a9cb6838b96
4
+ data.tar.gz: 4d1263ce781eec239a82dbf30c470e95b9e5030d
5
5
  SHA512:
6
- metadata.gz: e320d1c8f9b52c88d7f3d24939210ebce53777711cc3909a48a7d7512e7e1724adf8bfde091e80695137d598aa23bd82c0232bb7c7e2538918bda3a721c23487
7
- data.tar.gz: 28eb0b645abbaa873e93f5fb138e2df333d913e9adb791f8229a4edc0edce87630f54db2f36dc8a4a1454b178b1bab00559a42acbd68dceb374ba205dcb32884
6
+ metadata.gz: 2e687ba3e7144b5f21f6ce767ed38364b9baf863ca8bc0b03ee353fbc159265f79569e1f8c7819365f78443e4a2650b40bdb96ae2e2d6653e2b23c6e5bf0643e
7
+ data.tar.gz: 7da81dcac85b7e7546734d5eafebe64fa280d59fa5eb579d1ee15b71b2282db7c7aeb09d6c53fa0d018dd2b0368b79a061a30d449b77ada89b9f5ed7ff4e0e95
@@ -0,0 +1,3 @@
1
+ .yardoc
2
+ coverage/
3
+ doc/
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.6
5
+ - 2.2.2
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,39 +1,12 @@
1
- task 'default'
2
- require 'metaruby/version'
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
3
 
4
- require 'utilrb/doc/rake'
5
- Utilrb.doc :include => ['lib/**/*.rb']
4
+ task :default
6
5
 
7
- begin
8
- require 'hoe'
9
- Hoe::plugin :yard
10
-
11
- config = Hoe.spec 'metaruby' do
12
- self.version = MetaRuby::VERSION
13
- self.developer "Sylvain Joyeux", "sylvain.joyeux@m4x.org"
14
- self.summary = 'Modelling using the Ruby language as a metamodel'
15
- self.description = paragraphs_of('README.md', 3..6).join("\n\n")
16
- self.changes = paragraphs_of('History.txt', 0..1).join("\n\n")
17
- self.readme_file = 'README.md'
18
- self.history_file = 'History.txt'
19
- self.license 'LGPLv3+'
20
-
21
- extra_deps <<
22
- ['utilrb', '>= 1.3.4']
23
- extra_dev_deps <<
24
- ['rake', '>= 0.8'] <<
25
- ['hoe-yard', '>= 0.1.2']
26
- end
27
-
28
- Rake.clear_tasks(/^default$/)
29
- task :default => []
30
- task :doc => :yard
31
- rescue LoadError
32
- STDERR.puts "cannot load the Hoe gem. Distribution is disabled"
33
- rescue Exception => e
34
- puts e.backtrace
35
- if e.message !~ /\.rubyforge/
36
- STDERR.puts "WARN: cannot load the Hoe gem, or Hoe fails. Publishing tasks are disabled"
37
- STDERR.puts "WARN: error message is: #{e.message}"
38
- end
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "lib"
8
+ t.libs << "."
9
+ t.test_files = FileList['test/suite.rb']
39
10
  end
11
+
12
+ task :gem => :build
File without changes
@@ -115,6 +115,11 @@ module MetaRuby
115
115
  def provides(model_as_module)
116
116
  include model_as_module
117
117
  end
118
+
119
+ # Tests whether the given model-as-module is provided by self
120
+ def provides?(model_as_module)
121
+ self <= model_as_module
122
+ end
118
123
  end
119
124
  end
120
125
 
@@ -1,3 +1,5 @@
1
+ require 'metaruby/gui/html'
2
+
1
3
  module MetaRuby
2
4
  module GUI
3
5
  # Widget that allows to display a list of exceptions
@@ -5,9 +7,12 @@ module MetaRuby
5
7
  RESSOURCES_DIR = File.expand_path('html', File.dirname(__FILE__))
6
8
 
7
9
  attr_reader :displayed_exceptions
10
+ attr_reader :metaruby_page
8
11
 
9
12
  def initialize(parent = nil)
10
13
  super
14
+ @metaruby_page = HTML::Page.new(self.page)
15
+ connect(@metaruby_page, SIGNAL('fileOpenClicked(const QUrl&)'), self, SLOT('fileOpenClicked(const QUrl&)'))
11
16
  @displayed_exceptions = []
12
17
  self.focus_policy = Qt::NoFocus
13
18
  end
@@ -22,11 +27,15 @@ module MetaRuby
22
27
  update_html
23
28
  end
24
29
 
30
+ def each_exception(&block)
31
+ @displayed_exceptions.each(&block)
32
+ end
33
+
25
34
  TEMPLATE = <<-EOD
26
- <html>
35
+ <head>
27
36
  <link rel="stylesheet" href="file://#{File.join(RESSOURCES_DIR, 'exception_view.css')}" type="text/css" />
28
37
  <script type="text/javascript" src="file://#{File.join(RESSOURCES_DIR, 'jquery.min.js')}"></script>
29
- </html>
38
+ </head>
30
39
  <script type="text/javascript">
31
40
  $(document).ready(function () {
32
41
  $("tr.backtrace").hide()
@@ -46,7 +55,7 @@ module MetaRuby
46
55
  </script>
47
56
  <body>
48
57
  <table class="exception_list">
49
- <%= displayed_exceptions.enum_for(:each_with_index).map { |(e, reason), idx| render_exception(e, reason, idx) }.join("\\n") %>
58
+ <%= each_exception.each_with_index.map { |(e, reason), idx| render_exception(e, reason, idx) }.join("\\n") %>
50
59
  </table>
51
60
  </body>
52
61
  EOD
@@ -57,21 +66,31 @@ module MetaRuby
57
66
 
58
67
  class BacktraceParser
59
68
  def initialize(backtrace)
60
- @backtrace = backtrace
69
+ @backtrace = backtrace || []
61
70
  end
62
71
 
63
72
  def parse
64
73
  call_stack(0)
65
74
  end
66
75
 
76
+ def pp_callstack(level)
77
+ @backtrace[level..-1]
78
+ end
79
+
67
80
  def pp_call_stack(level)
68
81
  @backtrace[level..-1]
69
82
  end
70
83
  end
71
84
 
72
- EXCEPTION_TEMPLATE = <<-EOF
85
+ EXCEPTION_TEMPLATE_WITHOUT_BACKTRACE = <<-EOF
86
+ <tr class="message">
87
+ <td id="<%= idx %>"><%= escape_html(reason) if reason %><pre><%= message.join("\n") %></pre></td>
88
+ </tr>
89
+ EOF
90
+
91
+ EXCEPTION_TEMPLATE_WITH_BACKTRACE = <<-EOF
73
92
  <tr class="message">
74
- <td id="<%= idx %>"><%= escape_html(reason) if reason %><pre><%= message.join("\n") %></pre>(<%= e.class %>)
93
+ <td id="<%= idx %>"><%= escape_html(reason) if reason %><pre><%= message.join("\n") %></pre>
75
94
  <span class="backtrace_links">
76
95
  (show: <a class="backtrace_toggle_filtered" id="<%= idx %>">filtered backtrace</a>,
77
96
  <a class=\"backtrace_toggle_full\" id="<%= idx %>">full backtrace</a>)
@@ -79,7 +98,7 @@ module MetaRuby
79
98
  </td>
80
99
  </tr>
81
100
  <tr class="backtrace_summary">
82
- <td>from <%= escape_html(origin_file) %>:<%= origin_line %>:in <%= escape_html(origin_method.to_s) %></td>
101
+ <td>from <%= origin_file %>:<%= origin_line %>:in <%= escape_html(origin_method.to_s) %></td>
83
102
  </tr>
84
103
  <tr class="backtrace" id="backtrace_filtered_<%= idx %>">
85
104
  <td><%= render_backtrace(filtered_backtrace) %></td>
@@ -89,22 +108,40 @@ module MetaRuby
89
108
  </tr>
90
109
  EOF
91
110
 
111
+ def filter_backtrace(backtrace)
112
+ backtrace
113
+ end
114
+
115
+ def user_file?(file)
116
+ true
117
+ end
118
+
92
119
  def render_exception(e, reason, idx)
93
120
  message = PP.pp(e, "").split("\n").map { |line| escape_html(line) }
94
- filtered_backtrace = BacktraceParser.new(Roby.filter_backtrace(e.backtrace, :force => true)).parse
95
- origin_file, origin_line, origin_method = filtered_backtrace.
96
- find { |file, _| Roby.app.app_file?(file) } || filtered_backtrace.first
97
- full_backtrace = BacktraceParser.new(e.backtrace).parse
98
- ERB.new(EXCEPTION_TEMPLATE).result(binding)
121
+
122
+ if e.backtrace && !e.backtrace.empty?
123
+ filtered_backtrace = BacktraceParser.new(filter_backtrace(e.backtrace)).parse
124
+ full_backtrace = BacktraceParser.new(e.backtrace).parse
125
+ origin_file, origin_line, origin_method =
126
+ filtered_backtrace.find { |file, _| user_file?(file) } ||
127
+ filtered_backtrace.first ||
128
+ full_backtrace.first
129
+
130
+ origin_file = metaruby_page.link_to(Pathname.new(origin_file), origin_file, lineno: origin_line)
131
+ ERB.new(EXCEPTION_TEMPLATE_WITH_BACKTRACE).result(binding)
132
+ else
133
+ ERB.new(EXCEPTION_TEMPLATE_WITHOUT_BACKTRACE).result(binding)
134
+ end
99
135
  end
100
136
 
101
137
  def render_backtrace(backtrace)
102
138
  result = []
103
139
  backtrace.each do |file, line, method|
104
- if Roby.app.app_file?(file)
105
- result << " <span class=\"app_file\">#{escape_html(file)}:#{line}:in #{escape_html(method.to_s)}</span><br/>"
140
+ file_link = metaruby_page.link_to(Pathname.new(file), file, lineno: line)
141
+ if user_file?(file)
142
+ result << " <span class=\"app_file\">#{file_link}:#{line}:in #{escape_html(method.to_s)}</span><br/>"
106
143
  else
107
- result << " #{escape_html(file)}:#{line}:in #{escape_html(method.to_s)}<br/>"
144
+ result << " #{file_link}:#{line}:in #{escape_html(method.to_s)}<br/>"
108
145
  end
109
146
  end
110
147
  result.join("\n")
@@ -118,6 +155,12 @@ module MetaRuby
118
155
  @displayed_exceptions = list.dup
119
156
  update_html
120
157
  end
158
+
159
+ def contents_height
160
+ self.page.main_frame.contents_size.height
161
+ end
162
+
163
+ signals 'fileOpenClicked(const QUrl&)'
121
164
  end
122
165
  end
123
166
  end
@@ -15,7 +15,7 @@ module MetaRuby::GUI
15
15
  # @return [<Exception>] exceptions caught during element rendering
16
16
  attr_reader :registered_exceptions
17
17
 
18
- Element = Struct.new :object, :format, :url, :text, :rendering_options
18
+ Element = Struct.new :object, :format, :url, :text, :rendering_options, :attributes
19
19
 
20
20
  def initialize(page)
21
21
  super()
@@ -52,7 +52,7 @@ module MetaRuby::GUI
52
52
 
53
53
  def element_link_target(object, interactive)
54
54
  if interactive
55
- id = "btn://metaruby/#{namespace}#{object.object_id}"
55
+ id = "link://metaruby/#{namespace}#{object.object_id}"
56
56
  else
57
57
  id = "##{object.object_id}"
58
58
  end
@@ -63,7 +63,10 @@ module MetaRuby::GUI
63
63
  object_id_to_object[el.object.object_id] = el.object
64
64
  end
65
65
 
66
- links = links.map { |el| el.format % ["<a href=\"#{el.url}\">#{el.text}</a>"] }
66
+ links = links.map do |el|
67
+ a_node = el.format % ["<a href=\"#{el.url}\">#{el.text}</a>"]
68
+ [a_node, el.attributes || Hash.new]
69
+ end
67
70
  page.render_list(title, links, push_options)
68
71
  end
69
72
 
@@ -80,6 +83,8 @@ module MetaRuby::GUI
80
83
  if url.host == "metaruby" && url.path =~ /^\/#{Regexp.quote(namespace)}(\d+)/
81
84
  object = object_id_to_object[Integer($1)]
82
85
  render_element(object)
86
+ else
87
+ super
83
88
  end
84
89
  end
85
90
  slots 'linkClicked(const QUrl&)'
@@ -87,12 +92,14 @@ module MetaRuby::GUI
87
92
  def render_element(object, options = Hash.new)
88
93
  page.restore
89
94
  registered_exceptions.clear
95
+ options = Hash[id: "#{namespace}/currently_rendered_element"].merge(options)
90
96
  begin
91
97
  manager.render(object, options)
92
98
  rescue ::Exception => e
93
99
  registered_exceptions << e
94
100
  end
95
101
  emit updated
102
+ page.page.current_frame.scrollToAnchor(options[:id])
96
103
  end
97
104
 
98
105
  signals :updated
@@ -0,0 +1,5 @@
1
+ <% if fragment.id %><div id="<%= fragment.id %>"><% end %>
2
+ <% if fragment.title %><h2><%= fragment.title %></h2><% end %>
3
+ <%= HTML.render_button_bar(fragment.buttons) %>
4
+ <%= fragment.html %>
5
+ <% if fragment.id %></div><% end %>
@@ -10,7 +10,7 @@
10
10
  <%
11
11
  items.each_with_index do |(data, attributes), index|
12
12
  if attributes
13
- div_attributes = attributes.map { |k, v| " \#{k}=\"\#{v}\"" }.join("")
13
+ div_attributes = attributes.map { |k, v| " #{k}=\"#{v}\"" }.join("")
14
14
  end
15
15
  %>
16
16
  <div class="short_doc<%= " list_alt" if index % 2 == 0 %>"<%= div_attributes %>>
@@ -41,6 +41,8 @@ display: block;
41
41
  .doc-above { margin-bottom: -.3em; padding-bottom: 0em; font-style: italic; }
42
42
  .doc-above p { margin-top: .1em; margin-bottom: .1em; }
43
43
 
44
+ .preformatted { white-space: pre; }
45
+
44
46
  div.short_doc {
45
47
  margin-top: .2em;
46
48
  background-color: rgb(238,237,249);
@@ -15,6 +15,7 @@ module MetaRuby::GUI
15
15
  attr_reader :fragments
16
16
  attr_reader :view
17
17
  attr_accessor :object_uris
18
+ attr_reader :javascript
18
19
 
19
20
  class Fragment
20
21
  attr_accessor :title
@@ -32,13 +33,23 @@ module MetaRuby::GUI
32
33
  end
33
34
  end
34
35
 
35
- def link_to(object, text = nil)
36
- text = HTML.escape_html(text || object.name)
36
+ def load_javascript(file)
37
+ javascript << File.expand_path(file)
38
+ end
39
+
40
+ def link_to(object, text = nil, args = Hash.new)
41
+ text = HTML.escape_html(text || object.name || "<anonymous>")
37
42
  if uri = uri_for(object)
38
- if uri[0, 1] != '/'
39
- uri = "/#{uri}"
43
+ if uri !~ /^\w+:\/\//
44
+ if uri[0, 1] != '/'
45
+ uri = "/#{uri}"
46
+ end
47
+ uri = Qt::Url.new("link://metaruby#{uri}")
48
+ else
49
+ uri = Qt::Url.new(uri)
40
50
  end
41
- "<a href=\"link://metaruby#{uri}\">#{text}</a>"
51
+ args.each { |k, v| uri.add_query_item(k.to_s, v.to_s) }
52
+ "<a href=\"#{uri.to_string}\">#{text}</a>"
42
53
  else text
43
54
  end
44
55
  end
@@ -58,6 +69,7 @@ module MetaRuby::GUI
58
69
 
59
70
  PAGE_TEMPLATE = File.join(RESSOURCES_DIR, "page.rhtml")
60
71
  PAGE_BODY_TEMPLATE = File.join(RESSOURCES_DIR, "page_body.rhtml")
72
+ FRAGMENT_TEMPLATE = File.join(RESSOURCES_DIR, "fragment.rhtml")
61
73
  LIST_TEMPLATE = File.join(RESSOURCES_DIR, "list.rhtml")
62
74
  ASSETS = %w{page.css jquery.min.js jquery.selectfilter.js}
63
75
 
@@ -86,6 +98,7 @@ module MetaRuby::GUI
86
98
  @fragments = []
87
99
  @templates = Hash.new
88
100
  @auto_id = 0
101
+ @javascript = Array.new
89
102
 
90
103
  if page.kind_of?(Qt::WebPage)
91
104
  page.link_delegation_policy = Qt::WebPage::DelegateAllLinks
@@ -94,8 +107,13 @@ module MetaRuby::GUI
94
107
  @object_uris = Hash.new
95
108
  end
96
109
 
110
+
97
111
  def uri_for(object)
98
- object_uris[object]
112
+ if object.kind_of?(Pathname)
113
+ "file://#{object.expand_path}"
114
+ else
115
+ object_uris[object]
116
+ end
99
117
  end
100
118
 
101
119
  # Removes all existing displays
@@ -114,18 +132,18 @@ module MetaRuby::GUI
114
132
  page.main_frame.html = html
115
133
  end
116
134
 
117
- def html(options = Hash.new)
118
- options = Kernel.validate_options options, :ressource_dir => RESSOURCES_DIR
119
- ressource_dir = options[:ressource_dir]
135
+ def html(ressource_dir: RESSOURCES_DIR)
120
136
  load_template(PAGE_TEMPLATE).result(binding)
121
137
  end
122
138
 
123
- def html_body(options = Hash.new)
124
- options = Kernel.validate_options options, :ressource_dir => RESSOURCES_DIR
125
- ressource_dir = options[:ressource_dir]
139
+ def html_body(ressource_dir: RESSOURCES_DIR)
126
140
  load_template(PAGE_BODY_TEMPLATE).result(binding)
127
141
  end
128
142
 
143
+ def html_fragment(fragment, ressource_dir: RESSOURCES_DIR)
144
+ load_template(FRAGMENT_TEMPLATE).result(binding)
145
+ end
146
+
129
147
  def find_button_by_url(url)
130
148
  id = url.path
131
149
  fragments.each do |fragment|
@@ -141,9 +159,7 @@ module MetaRuby::GUI
141
159
  end
142
160
 
143
161
  def pageLinkClicked(url)
144
- return if url.host != 'metaruby'
145
-
146
- if url.scheme == 'btn'
162
+ if url.scheme == 'btn' && url.host == 'metaruby'
147
163
  if btn = find_button_by_url(url)
148
164
  new_state = if url.fragment == 'on' then true
149
165
  else false
@@ -156,14 +172,18 @@ module MetaRuby::GUI
156
172
 
157
173
  emit buttonClicked(btn.id, new_state)
158
174
  else
159
- MetaRuby.warn "invalid button URI #{url}: could not find corresponding handler"
175
+ MetaRuby.warn "invalid button URI #{url.to_string}: could not find corresponding handler (known buttons are #{fragments.flat_map { |f| f.buttons.map { |btn| btn.id.to_string } }.sort.join(", ")})"
160
176
  end
161
- elsif url.scheme == 'link'
177
+ elsif url.scheme == 'link' && url.host == 'metaruby'
162
178
  emit linkClicked(url)
179
+ elsif url.scheme == "file"
180
+ emit fileOpenClicked(url)
181
+ else
182
+ MetaRuby.warn "MetaRuby::GUI::HTML::Page: ignored link #{url.toString}"
163
183
  end
164
184
  end
165
185
  slots 'pageLinkClicked(const QUrl&)'
166
- signals 'linkClicked(const QUrl&)', 'buttonClicked(const QString&,bool)'
186
+ signals 'linkClicked(const QUrl&)', 'buttonClicked(const QString&,bool)', 'fileOpenClicked(const QUrl&)'
167
187
 
168
188
  # Save the current state of the page, so that it can be restored by
169
189
  # calling {restore}
@@ -215,7 +235,7 @@ module MetaRuby::GUI
215
235
  if fragment
216
236
  fragment.html = html
217
237
  element = find_first_element("div##{fragment.id}")
218
- element.replace("<div id=\"#{id}\">#{html}</div>")
238
+ element.replace(html_fragment(fragment))
219
239
  return
220
240
  end
221
241
  end