sirens 0.0.1 → 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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/components/{component_behaviour.rb → abstract_component.rb} +32 -47
  3. data/lib/components/component.rb +24 -9
  4. data/lib/components/containers/splitter.rb +12 -64
  5. data/lib/components/containers/stack.rb +1 -1
  6. data/lib/components/containers/tabs.rb +3 -3
  7. data/lib/components/containers/window.rb +4 -0
  8. data/lib/components/primitive_component.rb +4 -57
  9. data/lib/components/widgets/checkbox.rb +2 -2
  10. data/lib/components/widgets/input_text.rb +1 -1
  11. data/lib/components/widgets/tree_choice.rb +2 -9
  12. data/lib/{components/widgets → components_builder}/column_props.rb +14 -2
  13. data/lib/{layouts → components_builder}/columns_builder.rb +0 -0
  14. data/lib/components_builder/layout_builder.rb +215 -0
  15. data/lib/{layouts → components_builder}/radio_button_group_builder.rb +0 -0
  16. data/lib/sirens.rb +18 -11
  17. data/lib/sirens/browsers/module_browser.rb +4 -4
  18. data/lib/sirens/browsers/object_browser.rb +4 -1
  19. data/lib/sirens/components/ancestors_list.rb +4 -1
  20. data/lib/sirens/components/class_browser.rb +5 -4
  21. data/lib/sirens/components/constants_list.rb +1 -1
  22. data/lib/sirens/components/method_source_code.rb +1 -1
  23. data/lib/sirens/components/methods_list.rb +5 -2
  24. data/lib/sirens/components/modules_list.rb +4 -1
  25. data/lib/sirens/components/namespaces_list.rb +4 -1
  26. data/lib/sirens/models/constant_model.rb +2 -1
  27. data/lib/sirens/models/icons.rb +28 -0
  28. data/lib/sirens/models/method.rb +94 -0
  29. data/lib/sirens/models/method_model.rb +8 -83
  30. data/lib/sirens/models/module_browser_model.rb +85 -25
  31. data/lib/sirens/models/object_browser_model.rb +4 -0
  32. data/lib/views/{view.rb → abstract_view.rb} +16 -50
  33. data/lib/views/button_view.rb +1 -1
  34. data/lib/views/{check_button_view.rb → checkbox_view.rb} +1 -1
  35. data/lib/views/component_view.rb +12 -0
  36. data/lib/views/{entry_view.rb → input_text_view.rb} +1 -1
  37. data/lib/views/list_view.rb +33 -8
  38. data/lib/views/menu_view.rb +1 -1
  39. data/lib/views/radio_button_view.rb +1 -1
  40. data/lib/views/splitter_view.rb +101 -0
  41. data/lib/views/stack_view.rb +1 -1
  42. data/lib/views/{notebook_view.rb → tabs_view.rb} +1 -1
  43. data/lib/views/text_view.rb +1 -1
  44. data/lib/views/tree_view.rb +42 -20
  45. data/lib/views/widget_view.rb +96 -0
  46. data/lib/views/window_view.rb +1 -1
  47. data/resources/icons/array.png +0 -0
  48. data/resources/icons/class.png +0 -0
  49. data/resources/icons/false.png +0 -0
  50. data/resources/icons/hash.png +0 -0
  51. data/resources/icons/method.png +0 -0
  52. data/resources/icons/module.png +0 -0
  53. data/resources/icons/number.png +0 -0
  54. data/resources/icons/object.png +0 -0
  55. data/resources/icons/private-method.png +0 -0
  56. data/resources/icons/protected-method.png +0 -0
  57. data/resources/icons/public-method.png +0 -0
  58. data/resources/icons/string.png +0 -0
  59. data/resources/icons/true.png +0 -0
  60. metadata +46 -15
  61. data/lib/layouts/layout_builder.rb +0 -203
  62. data/lib/views/paned_view.rb +0 -26
@@ -4,7 +4,7 @@ module Sirens
4
4
 
5
5
  # Building
6
6
 
7
- def renderWith(layout)
7
+ def render_with(layout)
8
8
  layout.render do |component|
9
9
  choices_list do
10
10
  model component.model
@@ -3,7 +3,7 @@ module Sirens
3
3
 
4
4
  # Building
5
5
 
6
- def renderWith(layout)
6
+ def render_with(layout)
7
7
  layout.render do |component|
8
8
  vertical_stack do
9
9
  text do
@@ -4,7 +4,7 @@ module Sirens
4
4
 
5
5
  # Building
6
6
 
7
- def renderWith(layout)
7
+ def render_with(layout)
8
8
  layout.render do |component|
9
9
  vertical_stack do
10
10
 
@@ -36,8 +36,11 @@ module Sirens
36
36
  styles id: :methods_list,
37
37
  show_headers: false
38
38
 
39
+ column label: '',
40
+ get_image_block: component.props[:get_method_image_block]
41
+
39
42
  column label: 'Methods',
40
- get_text_block: proc{ |method| method }
43
+ get_text_block: proc{ |method| method.name }
41
44
  end
42
45
 
43
46
  horizontal_stack do
@@ -3,7 +3,7 @@ module Sirens
3
3
 
4
4
  # Building
5
5
 
6
- def renderWith(layout)
6
+ def render_with(layout)
7
7
  layout.render do |component|
8
8
 
9
9
  choices_list do
@@ -13,6 +13,9 @@ module Sirens
13
13
  show_headers: true
14
14
  )
15
15
 
16
+ column label: '',
17
+ get_image_block: proc{ |a_module| Icons.icon_for(a_module) }
18
+
16
19
  column label: 'Namespace modules',
17
20
  get_text_block: proc{ |a_module| a_module.name }
18
21
  end
@@ -3,7 +3,7 @@ module Sirens
3
3
 
4
4
  # Building
5
5
 
6
- def renderWith(layout)
6
+ def render_with(layout)
7
7
  layout.render do |component|
8
8
 
9
9
  choices_tree do
@@ -11,6 +11,9 @@ module Sirens
11
11
 
12
12
  styles show_headers: true
13
13
 
14
+ column label: '',
15
+ get_image_block: proc{ |a_module| Icons.icon_for(a_module) }
16
+
14
17
  column label: 'Namespaces',
15
18
  get_text_block: proc{ |a_module| a_module.name }
16
19
  end
@@ -10,7 +10,8 @@ module Sirens
10
10
  @value = value
11
11
  end
12
12
 
13
- attr_reader :name, :value
13
+ attr_reader :name,
14
+ :value
14
15
 
15
16
  def display_string()
16
17
  value_print_string = value.inspect
@@ -0,0 +1,28 @@
1
+ require 'pathname'
2
+
3
+ module Sirens
4
+ class Icons
5
+
6
+ def self.icons()
7
+ @icons ||= Hash[
8
+ ::Module => 'module.png',
9
+ ::Class => 'class.png',
10
+ ::Array => 'array.png',
11
+ ::Hash => 'hash.png',
12
+ ::TrueClass => 'true.png',
13
+ ::FalseClass => 'false.png',
14
+ ::String => 'string.png',
15
+ ::Integer => 'number.png',
16
+ ::Float => 'number.png',
17
+ ]
18
+ end
19
+
20
+ # Initializing
21
+
22
+ def self.icon_for(object)
23
+ filename = icons.fetch(object.class, 'object.png')
24
+
25
+ Pathname.new(__FILE__).dirname + '../../../resources/icons/' + filename
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,94 @@
1
+ module Sirens
2
+ class Method
3
+ # Initializing
4
+
5
+ def initialize(mod:, name:, visibility:, instance_method:)
6
+ @mod = mod
7
+ @name = name
8
+ @visibility = visibility
9
+ @is_instance_method = instance_method
10
+
11
+ @ruby_method = @is_instance_method === true ?
12
+ @mod.instance_method(@name) : @mod.method(@name)
13
+
14
+ @method_filename, @method_line_number = @ruby_method.source_location
15
+
16
+ @source_code = nil
17
+ end
18
+
19
+ # Accessing
20
+
21
+ attr_reader :mod,
22
+ :name,
23
+ :visibility,
24
+ :is_instance_method,
25
+ :method_filename,
26
+ :method_line_number
27
+
28
+ # Asking
29
+
30
+ def is_public?()
31
+ visibility == :public
32
+ end
33
+
34
+ def is_protected?()
35
+ visibility == :protected
36
+ end
37
+
38
+ def is_private?()
39
+ visibility == :private
40
+ end
41
+
42
+ def is_instance_method?()
43
+ is_instance_method
44
+ end
45
+
46
+ # Querying
47
+
48
+ def icon()
49
+ if is_public?
50
+ filename = 'public-method.png'
51
+ elsif is_protected?
52
+ filename = 'protected-method.png'
53
+ elsif is_private?
54
+ filename = 'private-method.png'
55
+ else
56
+ raise RuntimeError.new('Uknown visibility type.')
57
+ end
58
+
59
+ Pathname.new(__FILE__).dirname + '../../../resources/icons/' + filename
60
+ end
61
+
62
+ def source_location()
63
+ "#{method_filename}:#{method_line_number}"
64
+ end
65
+
66
+ def source_code()
67
+ begin
68
+ @source_code ||= remove_indentation(@ruby_method.comment) +
69
+ "\n" +
70
+ remove_indentation(@ruby_method.source)
71
+ rescue ::MethodSource::SourceNotFoundError => e
72
+ @source_code = "Could not locate source for #{@mod}::#{@name}"
73
+ end
74
+ end
75
+
76
+ # Utility methods
77
+
78
+ def remove_indentation(source_code)
79
+ lines = source_code.lines
80
+
81
+ indentation = 0
82
+
83
+ /^(\s*).*$/.match(lines.first) do |matches|
84
+ indentation = matches[1].size
85
+ end
86
+
87
+ lines = lines.collect { |line|
88
+ line.gsub!(/^\s{#{indentation}}/, '')
89
+ }
90
+
91
+ lines.join
92
+ end
93
+ end
94
+ end
@@ -8,104 +8,29 @@ module Sirens
8
8
  def initialize()
9
9
  super()
10
10
 
11
- @method_name = ValueModel.new
11
+ @method = ValueModel.new
12
12
  @location = ValueModel.new
13
13
  @source_code = ValueModel.new
14
14
  end
15
15
 
16
- attr_reader :method_name,
16
+ attr_reader :method,
17
17
  :location,
18
18
  :source_code
19
19
 
20
20
  def set_method(method)
21
21
  if method.nil?
22
- method_name.set_value(nil)
23
- location.set_value(nil)
24
- source_code.set_value(nil)
22
+ @method.set_value(nil)
23
+ @location.set_value(nil)
24
+ @source_code.set_value(nil)
25
25
 
26
26
  return
27
27
  end
28
28
 
29
- method_name.set_value(method.name)
29
+ @method.set_value(method)
30
30
 
31
- method_filename, method_line_number = method.source_location
31
+ @location.set_value(method.source_location)
32
32
 
33
- location.set_value("#{method_filename}:#{method_line_number}")
34
-
35
- source_code.set_value(
36
- get_source_code_of(method: method, filename: method_filename, line_number: method_line_number)
37
- )
38
- end
39
-
40
- def get_source_code_of(method:, filename:, line_number:)
41
- return 'Native method' if filename.nil? || ! File.exists?(filename)
42
-
43
- source_code = StringIO.new
44
-
45
- lines = File.read(filename).lines
46
-
47
- method_comment = ''
48
- comment_line = line_number - 1
49
- while line_number >= 0
50
- line = lines[comment_line - 1]
51
-
52
- break if ! /^\s*#/.match(line)
53
-
54
- method_comment = line + method_comment
55
-
56
- comment_line -= 1
57
- end
58
-
59
- source_code.write(method_comment)
60
-
61
- tail = lines[line_number -1 .. -1].join
62
-
63
- stream = StringIO.new(tail)
64
-
65
- counter = 0
66
-
67
- keywords = ['module', 'class', 'def', 'if', 'while', 'do', 'begin']
68
-
69
- while !stream.eof?
70
-
71
- while !stream.eof? && (c = stream.getc) == ' '
72
- source_code.write(' ')
73
- end
74
-
75
- stream.ungetc(c)
76
-
77
- token = stream.gets(' ')
78
-
79
- source_code.write(token)
80
-
81
- token = token.strip
82
-
83
- if token == 'end'
84
- counter -= 1
85
- elsif keywords.include?(token)
86
- counter += 1
87
- end
88
-
89
- break if counter == 0
90
- end
91
-
92
- fix_indentation(source_code.string)
93
- end
94
-
95
- def fix_indentation(source_code)
96
- lines = source_code.lines
97
-
98
- indentation = 0
99
-
100
- /^(\s*).*$/.match(lines.first) do |matches|
101
- indentation = matches[1].size
102
- end
103
-
104
- lines = lines.collect { |line|
105
- line.gsub!(/^\s{#{indentation}}/, '')
106
- }
107
-
108
- lines.join
33
+ @source_code.set_value(method.source_code)
109
34
  end
110
35
  end
111
36
  end
@@ -115,22 +115,14 @@ module Sirens
115
115
  end
116
116
 
117
117
  def on_method_changed(announcement)
118
- method_name = announcement.new_value
118
+ selected_method = announcement.new_value
119
119
 
120
- if method_name.nil?
120
+ if selected_method.nil?
121
121
  method_source_code.set_method(nil)
122
122
  return
123
123
  end
124
124
 
125
- a_module = module_ancestors.selection.value
126
-
127
- if showing_instance_methods?
128
- method = a_module.instance_method(method_name)
129
- else
130
- method = a_module.method(method_name)
131
- end
132
-
133
- method_source_code.set_method(method)
125
+ method_source_code.set_method(selected_method)
134
126
  end
135
127
 
136
128
  # Calculated
@@ -169,23 +161,91 @@ module Sirens
169
161
  # Answers all the methods in the given class
170
162
  #
171
163
  def get_all_methods_in(a_module)
172
- return [] if a_module.nil?
173
-
174
- methods = []
175
-
176
- inherit = show_inherit_methods.value
164
+ all_methods_defined_in(a_module)
165
+ .reject { |method| method.is_private? if !showing_private_methods? }
166
+ .reject { |method| method.is_protected? if !showing_protected_methods? }
167
+ .reject { |method| method.is_public? if !showing_public_methods? }
168
+ end
177
169
 
178
- if showing_instance_methods?
179
- methods.concat(a_module.private_instance_methods(inherit)) if showing_private_methods?
180
- methods.concat(a_module.protected_instance_methods(inherit)) if showing_protected_methods?
181
- methods.concat(a_module.public_instance_methods(inherit)) if showing_public_methods?
182
- else
183
- methods.concat(a_module.private_methods(inherit)) if showing_private_methods?
184
- methods.concat(a_module.protected_methods(inherit)) if showing_protected_methods?
185
- methods.concat(a_module.public_methods(inherit)) if showing_public_methods?
170
+ def all_methods_defined_in(mod)
171
+ return [] if mod.nil?
172
+
173
+ modules = show_inherit_methods.value === true ?
174
+ mod.ancestors : [mod]
175
+
176
+ all_methods = []
177
+
178
+ modules.each do |a_module|
179
+ if showing_instance_methods?
180
+ all_methods.concat(
181
+ a_module.private_instance_methods(false).collect { |method_name|
182
+ Sirens::Method.new(
183
+ mod: a_module,
184
+ name: method_name,
185
+ visibility: :private,
186
+ instance_method: true
187
+ )
188
+ }
189
+ )
190
+
191
+ all_methods.concat(
192
+ a_module.protected_instance_methods(false).collect { |method_name|
193
+ Sirens::Method.new(
194
+ mod: a_module,
195
+ name: method_name,
196
+ visibility: :protected,
197
+ instance_method: true
198
+ )
199
+ }
200
+ )
201
+
202
+ all_methods.concat(
203
+ a_module.public_instance_methods(false).collect { |method_name|
204
+ Sirens::Method.new(
205
+ mod: a_module,
206
+ name: method_name,
207
+ visibility: :public,
208
+ instance_method: true
209
+ )
210
+ }
211
+ )
212
+ else
213
+ all_methods.concat(
214
+ a_module.private_methods(false).collect { |method_name|
215
+ Sirens::Method.new(
216
+ mod: a_module,
217
+ name: method_name,
218
+ visibility: :private,
219
+ instance_method: false
220
+ )
221
+ }
222
+ )
223
+
224
+ all_methods.concat(
225
+ a_module.protected_methods(false).collect { |method_name|
226
+ Sirens::Method.new(
227
+ mod: a_module,
228
+ name: method_name,
229
+ visibility: :protected,
230
+ instance_method: false
231
+ )
232
+ }
233
+ )
234
+
235
+ all_methods.concat(
236
+ a_module.public_methods(false).collect { |method_name|
237
+ Sirens::Method.new(
238
+ mod: a_module,
239
+ name: method_name,
240
+ visibility: :public,
241
+ instance_method: false
242
+ )
243
+ }
244
+ )
245
+ end
186
246
  end
187
247
 
188
- methods.sort
248
+ all_methods.sort_by { |method| method.name }
189
249
  end
190
250
 
191
251
  ##