17
17
18
18
require 'json'
19
19
require 'fileutils'
20
+ require 'logger'
20
21
21
22
namespace :docs do
22
23
SRC_FILE = "#{ __dir__ } /docs/parsed_alternative_report.json" . freeze
@@ -29,26 +30,33 @@ namespace :docs do
29
30
FileUtils . remove_dir ( TARGET_DIR )
30
31
Dir . mkdir ( TARGET_DIR )
31
32
32
- # Only select the files in the EXAMPLES_TO_PARSE array and that are not
33
- # console result examples
34
- entries = json_data . select do |d |
35
- EXAMPLES_TO_PARSE . include? d [ 'source_location' ] [ 'file' ]
36
- end . select { |d | d [ 'lang' ] == 'console' }
37
-
38
- entries . each do |entry |
33
+ entries = json_data . select { |d | d [ 'lang' ] == 'console' }
34
+ start_time = Time . now . to_i
35
+ entries . each_with_index do |entry , index |
36
+ percentage = index * 100 / entries . length
37
+ hourglass = index . even? ? '⌛ ' : '⏳ '
38
+ print "\r " + ( "\e [A\e [K" * 2 ) if index > 0
39
+ puts "📝 Generating file #{ index + 1 } of #{ entries . length } - #{ percentage } % complete"
40
+ puts hourglass + '▩' * ( percentage / 2 ) + '⬚' * ( 50 - percentage / 2 ) + ' ' + hourglass
39
41
generate_docs ( entry )
40
42
end
43
+ puts "Finished generating #{ entries . length } files in #{ Time . now . to_i - start_time } seconds"
41
44
end
42
45
43
46
def json_data
44
47
JSON . parse ( File . read ( SRC_FILE ) )
45
48
end
46
49
47
50
def generate_docs ( entry )
48
- file_name = "#{ entry [ 'digest' ] } .asciidoc"
49
- api = entry [ 'parsed_source' ] . first [ 'api' ]
50
- code = build_client_query ( api , entry )
51
- write_file ( code , file_name )
51
+ require 'elasticsearch'
52
+
53
+ filename = "#{ entry [ 'digest' ] } .asciidoc"
54
+ unless entry [ 'parsed_source' ] . empty?
55
+ api = entry [ 'parsed_source' ] . first [ 'api' ]
56
+ code = build_client_query ( api , entry )
57
+ TestDocs ::perform ( code , filename )
58
+ write_file ( code , filename )
59
+ end
52
60
end
53
61
54
62
def self . build_client_query ( api , entry )
@@ -61,8 +69,12 @@ namespace :docs do
61
69
request_body << show_parameters ( params ) if params
62
70
body = entry &.[]( 'body' )
63
71
request_body << show_body ( body ) if body
64
- request_body = request_body . compact . join ( ",\n " )
65
- code = "response = client.#{ api } (\n #{ request_body } \n )\n puts response"
72
+ request_body = request_body . compact . join ( ",\n " ) . gsub ( 'null' , 'nil' )
73
+ code = if api . include? '_internal'
74
+ "response = client.perform_request('#{ entry [ 'method' ] } ', '#{ api } ', #{ request_body } )"
75
+ else
76
+ "response = client.#{ api } (\n #{ request_body } \n )\n puts response"
77
+ end
66
78
client_query << format_code ( code )
67
79
end
68
80
client_query . join ( "\n \n " )
@@ -73,8 +85,12 @@ namespace :docs do
73
85
File . open ( 'temp.rb' , 'w' ) do |f |
74
86
f . puts code
75
87
end
76
- # Format code:
77
- system ( "rubocop --config #{ __dir__ } /docs_rubocop_config.yml --format autogenconf -a ./temp.rb" )
88
+ # Format code with Rubocop
89
+ require 'rubocop'
90
+ options = "--config #{ __dir__ } /docs_rubocop_config.yml -o /dev/null -a ./temp.rb" . split
91
+ cli = RuboCop ::CLI . new
92
+ cli . run ( options )
93
+
78
94
# Read it back
79
95
template = File . read ( './temp.rb' )
80
96
File . delete ( './temp.rb' )
@@ -120,3 +136,32 @@ namespace :docs do
120
136
end
121
137
end
122
138
end
139
+
140
+ #
141
+ # Test module to run the generated code
142
+ #
143
+ module TestDocs
144
+ @formatter = -> ( _ , d , _ , msg ) { "[#{ d } ] : #{ msg } " }
145
+
146
+ def self . perform ( code , filename )
147
+ # Eval the example code, but remove printing out the response
148
+ response = eval ( code . gsub ( 'puts response' , '' ) )
149
+ if response . status == 200
150
+ logger = Logger . new ( 'log/200-ok.log' )
151
+ logger . formatter = -> ( _ , _ , _ , msg ) { "#{ msg } " }
152
+ logger . info ( filename )
153
+ end
154
+ rescue Elastic ::Transport ::Transport ::Error => e
155
+ logger = Logger . new ( 'log/docs-generation-elasticsearch.log' )
156
+ logger . formatter = @formatter
157
+ logger . info ( "Located in #{ filename } : #{ e . message } \n " )
158
+ rescue ArgumentError , NoMethodError , TypeError => e
159
+ logger = Logger . new ( 'log/docs-generation-client.log' )
160
+ logger . formatter = @formatter
161
+ logger . info ( "Located in #{ filename } : #{ e . message } \n " )
162
+ end
163
+
164
+ def self . client
165
+ @client ||= Elasticsearch ::Client . new ( trace : false , log : false )
166
+ end
167
+ end
0 commit comments