Skip to content

Commit 4304bc9

Browse files
committed
Make sure collections use lists and atmos don't plus some bug fixes/formatting improvements
1 parent f8a8677 commit 4304bc9

File tree

2 files changed

+61
-34
lines changed

2 files changed

+61
-34
lines changed

spec/foobara/command_connectors_http/http_spec.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,13 @@ def context_type_declaration
2626
possible_error error_klass
2727
possible_input_error :base, input_error_class
2828

29-
inputs exponent: :integer,
30-
base: :integer
29+
inputs do
30+
exponent :integer
31+
base :integer
32+
# Just testing long arrays
33+
some_value :integer, one_of: (0..100).to_a
34+
end
35+
3136
result :integer
3237

3338
attr_accessor :exponential

src/http/commands/help/presenter.rb

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,27 @@ def initialize(manifest)
7171
end
7272

7373
def render_html_list(data)
74-
html = ""
74+
html = +""
75+
76+
is_rendered_as_a_collection = rendered_as_collection?(data)
77+
78+
html << "<ul>" if is_rendered_as_a_collection
79+
7580
case data
7681
when ::Hash
77-
html << "<ul>"
7882
data.each do |key, value|
79-
html << "<li>#{key}"
80-
html << render_html_list(value)
81-
html << "</li>"
83+
html << render_list_child(value, key)
8284
end
83-
html << "</ul>"
8485
when ::Array
85-
data.each do |item|
86-
html << render_html_list(item)
86+
if is_rendered_as_a_collection
87+
data.each do |item|
88+
html << render_list_child(item)
89+
end
90+
else
91+
data = data.map { |item| render_html_list(item) }
92+
html << "[#{data.join(", ")}]"
8793
end
8894
when Manifest::Attributes
89-
html << "<ul>"
9095
data.relevant_manifest.each_pair do |key, value|
9196
if key.to_s == "type"
9297
next
@@ -96,60 +101,77 @@ def render_html_list(data)
96101
key = :attributes
97102
value = data.attribute_declarations
98103
end
99-
html << "<li>#{key}"
100-
html << render_html_list(value)
101-
html << "</li>"
104+
105+
html << render_list_child(value, key)
102106
end
103-
html << "</ul>"
104107
when Manifest::Array
105-
html << "<ul>"
106108
data.relevant_manifest.each_pair do |key, value|
107109
next if key == :element_type_declaration
108110

109111
if key.to_s == "type"
110112
value = root_manifest.lookup_path(key, value)
111113
end
112-
html << "<li>#{key}"
113-
html << render_html_list(value)
114-
html << "</li>"
114+
html << render_list_child(value, key)
115115
end
116+
116117
html << render_html_list({ element_type: data.element_type })
117-
html << "</ul>"
118118
when Manifest::TypeDeclaration
119119
manifest = data.relevant_manifest
120-
html << "<ul>"
120+
121121
if manifest.is_a?(::Symbol)
122-
html << "<li>"
123122
html << foobara_reference_link(data.to_type)
124-
html << "</li>"
125123
else
126124
data.relevant_manifest.each_pair do |key, value|
127125
if key.to_s == "type"
128126
value = root_manifest.lookup_path(key, value)
129127
end
130-
html << "<li>#{key}"
131-
html << render_html_list(value)
132-
html << "</li>"
128+
129+
html << render_list_child(value, key)
133130
end
134131
end
135-
html << "</ul>"
136132
when Manifest::Type, Manifest::Command, Manifest::Error
137-
html << "<ul>"
138-
html << "<li>"
139133
html << foobara_reference_link(data)
140-
html << "</li>"
141-
html << "</ul>"
142134
when Manifest::PossibleError
143135
html << render_html_list(data.error)
144136
else
145-
html << "<ul>"
146-
html << "<li>#{data}</li>"
147-
html << "</ul>"
137+
html << case data
138+
when Numeric, TrueClass, FalseClass, NilClass
139+
data.inspect
140+
when ::String
141+
data
142+
when ::Symbol, ::Time
143+
data.to_s
144+
else
145+
# :nocov:
146+
raise "Not sure how to render #{data.class}"
147+
# :nocov:
148+
end
148149
end
149150

151+
html << "</ul>" if is_rendered_as_a_collection
152+
150153
html
151154
end
152155

156+
def rendered_as_collection?(data)
157+
if data.is_a?(::Array)
158+
data.size > 5 || data.any? { |element| rendered_as_collection?(element) }
159+
elsif data.is_a?(Manifest::TypeDeclaration)
160+
!data.relevant_manifest.is_a?(::Symbol)
161+
else
162+
[
163+
::Hash,
164+
Manifest::Attributes,
165+
Manifest::Array
166+
].any? { |klass| data.is_a?(klass) }
167+
end
168+
end
169+
170+
def render_list_child(child, label = nil)
171+
label = "#{label}:" if label
172+
"<li>#{label}\n#{render_html_list(child)}\n</li>"
173+
end
174+
153175
def foobara_reference_link(manifest)
154176
path = "/help/#{manifest.reference}"
155177

0 commit comments

Comments
 (0)