lhc 9.4.0 → 9.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/env bash
2
+
3
+ #
4
+ # Steps:
5
+ #
6
+ # 1. Download corresponding html file for some README.md:
7
+ # curl -s $1
8
+ #
9
+ # 2. Discard rows where no substring 'user-content-' (github's markup):
10
+ # awk '/user-content-/ { ...
11
+ #
12
+ # 3.1 Get last number in each row like ' ... </span></a>sitemap.js</h1'.
13
+ # It's a level of the current header:
14
+ # substr($0, length($0), 1)
15
+ #
16
+ # 3.2 Get level from 3.1 and insert corresponding number of spaces before '*':
17
+ # sprintf("%*s", substr($0, length($0), 1)*3, " ")
18
+ #
19
+ # 4. Find head's text and insert it inside "* [ ... ]":
20
+ # substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5)
21
+ #
22
+ # 5. Find anchor and insert it inside "(...)":
23
+ # substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8)
24
+ #
25
+
26
+ gh_toc_version="0.5.0"
27
+
28
+ gh_user_agent="gh-md-toc v$gh_toc_version"
29
+
30
+ #
31
+ # Download rendered into html README.md by its url.
32
+ #
33
+ #
34
+ gh_toc_load() {
35
+ local gh_url=$1
36
+
37
+ if type curl &>/dev/null; then
38
+ curl --user-agent "$gh_user_agent" -s "$gh_url"
39
+ elif type wget &>/dev/null; then
40
+ wget --user-agent="$gh_user_agent" -qO- "$gh_url"
41
+ else
42
+ echo "Please, install 'curl' or 'wget' and try again."
43
+ exit 1
44
+ fi
45
+ }
46
+
47
+ #
48
+ # Converts local md file into html by GitHub
49
+ #
50
+ # ➥ curl -X POST --data '{"text": "Hello world github/linguist#1 **cool**, and #1!"}' https://api.github.com/markdown
51
+ # <p>Hello world github/linguist#1 <strong>cool</strong>, and #1!</p>'"
52
+ gh_toc_md2html() {
53
+ local gh_file_md=$1
54
+ URL=https://api.github.com/markdown/raw
55
+ TOKEN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt"
56
+ if [ -f "$TOKEN" ]; then
57
+ URL="$URL?access_token=$(cat $TOKEN)"
58
+ fi
59
+ curl -s --user-agent "$gh_user_agent" \
60
+ --data-binary @"$gh_file_md" -H "Content-Type:text/plain" \
61
+ $URL
62
+ }
63
+
64
+ #
65
+ # Is passed string url
66
+ #
67
+ gh_is_url() {
68
+ case $1 in
69
+ https* | http*)
70
+ echo "yes";;
71
+ *)
72
+ echo "no";;
73
+ esac
74
+ }
75
+
76
+ #
77
+ # TOC generator
78
+ #
79
+ gh_toc(){
80
+ local gh_src=$1
81
+ local gh_src_copy=$1
82
+ local gh_ttl_docs=$2
83
+ local need_replace=$3
84
+
85
+ if [ "$gh_src" = "" ]; then
86
+ echo "Please, enter URL or local path for a README.md"
87
+ exit 1
88
+ fi
89
+
90
+
91
+ # Show "TOC" string only if working with one document
92
+ if [ "$gh_ttl_docs" = "1" ]; then
93
+
94
+ echo "Table of Contents"
95
+ echo "================="
96
+ echo ""
97
+ gh_src_copy=""
98
+
99
+ fi
100
+
101
+ if [ "$(gh_is_url "$gh_src")" == "yes" ]; then
102
+ gh_toc_load "$gh_src" | gh_toc_grab "$gh_src_copy"
103
+ if [ "$need_replace" = "yes" ]; then
104
+ echo
105
+ echo "!! '$gh_src' is not a local file"
106
+ echo "!! Can't insert the TOC into it."
107
+ echo
108
+ fi
109
+ else
110
+ local toc=`gh_toc_md2html "$gh_src" | gh_toc_grab "$gh_src_copy"`
111
+ echo "$toc"
112
+ if [ "$need_replace" = "yes" ]; then
113
+ local ts="<\!--ts-->"
114
+ local te="<\!--te-->"
115
+ local dt=`date +'%F_%H%M%S'`
116
+ local ext=".orig.${dt}"
117
+ local toc_path="${gh_src}.toc.${dt}"
118
+ local toc_footer="<!-- Added by: `whoami`, at: `date --iso-8601='minutes'` -->"
119
+ # http://fahdshariff.blogspot.ru/2012/12/sed-mutli-line-replacement-between-two.html
120
+ # clear old TOC
121
+ sed -i${ext} "/${ts}/,/${te}/{//!d;}" "$gh_src"
122
+ # create toc file
123
+ echo "${toc}" > "${toc_path}"
124
+ echo -e "\n${toc_footer}\n" >> "$toc_path"
125
+ # insert toc file
126
+ if [[ "`uname`" == "Darwin" ]]; then
127
+ sed -i "" "/${ts}/r ${toc_path}" "$gh_src"
128
+ else
129
+ sed -i "/${ts}/r ${toc_path}" "$gh_src"
130
+ fi
131
+ echo
132
+ echo "!! TOC was added into: '$gh_src'"
133
+ echo "!! Origin version of the file: '${gh_src}${ext}'"
134
+ echo "!! TOC added into a separate file: '${toc_path}'"
135
+ echo
136
+ fi
137
+ fi
138
+ }
139
+
140
+ #
141
+ # Grabber of the TOC from rendered html
142
+ #
143
+ # $1 — a source url of document.
144
+ # It's need if TOC is generated for multiple documents.
145
+ #
146
+ gh_toc_grab() {
147
+ # if closed <h[1-6]> is on the new line, then move it on the prev line
148
+ # for example:
149
+ # was: The command <code>foo1</code>
150
+ # </h1>
151
+ # became: The command <code>foo1</code></h1>
152
+ sed -e ':a' -e 'N' -e '$!ba' -e 's/\n<\/h/<\/h/g' |
153
+ # find strings that corresponds to template
154
+ grep -E -o '<a.*id="user-content-[^"]*".*</h[1-6]' |
155
+ # remove code tags
156
+ sed 's/<code>//' | sed 's/<\/code>//' |
157
+ # now all rows are like:
158
+ # <a id="user-content-..." href="..."><span ...></span></a> ... </h1
159
+ # format result line
160
+ # * $0 — whole string
161
+ echo -e "$(awk -v "gh_url=$1" '{
162
+ print sprintf("%*s", substr($0, length($0), 1)*3, " ") "* [" substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5)"](" gh_url substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8) ")"}' | sed 'y/+/ /; s/%/\\x/g')"
163
+ }
164
+
165
+ #
166
+ # Returns filename only from full path or url
167
+ #
168
+ gh_toc_get_filename() {
169
+ echo "${1##*/}"
170
+ }
171
+
172
+ #
173
+ # Options hendlers
174
+ #
175
+ gh_toc_app() {
176
+ local app_name="gh-md-toc"
177
+ local need_replace="no"
178
+
179
+ if [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
180
+ echo "GitHub TOC generator ($app_name): $gh_toc_version"
181
+ echo ""
182
+ echo "Usage:"
183
+ echo " $app_name [--insert] src [src] Create TOC for a README file (url or local path)"
184
+ echo " $app_name - Create TOC for markdown from STDIN"
185
+ echo " $app_name --help Show help"
186
+ echo " $app_name --version Show version"
187
+ return
188
+ fi
189
+
190
+ if [ "$1" = '--version' ]; then
191
+ echo "$gh_toc_version"
192
+ return
193
+ fi
194
+
195
+ if [ "$1" = "-" ]; then
196
+ if [ -z "$TMPDIR" ]; then
197
+ TMPDIR="/tmp"
198
+ elif [ -n "$TMPDIR" -a ! -d "$TMPDIR" ]; then
199
+ mkdir -p "$TMPDIR"
200
+ fi
201
+ local gh_tmp_md
202
+ gh_tmp_md=$(mktemp $TMPDIR/tmp.XXXXXX)
203
+ while read input; do
204
+ echo "$input" >> "$gh_tmp_md"
205
+ done
206
+ gh_toc_md2html "$gh_tmp_md" | gh_toc_grab ""
207
+ return
208
+ fi
209
+
210
+ if [ "$1" = '--insert' ]; then
211
+ need_replace="yes"
212
+ shift
213
+ fi
214
+
215
+ for md in "$@"
216
+ do
217
+ echo ""
218
+ gh_toc "$md" "$#" "$need_replace"
219
+ done
220
+
221
+ echo ""
222
+ echo "Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)"
223
+ }
224
+
225
+ #
226
+ # Entry point
227
+ #
228
+ gh_toc_app "$@"
@@ -8,10 +8,10 @@ Gem::Specification.new do |s|
8
8
  s.name = "lhc"
9
9
  s.version = LHC::VERSION
10
10
  s.authors = ['https://github.com/local-ch/lhc/contributors']
11
- s.email = ['ws-operations@local.ch']
11
+ s.email = ['web@localsearch.ch']
12
12
  s.homepage = 'https://github.com/local-ch/lhc'
13
- s.summary = 'LocalHttpClient'
14
- s.description = 'Rails gem for HTTP: Wraps typhoeus and provides additional features (like interceptors)'
13
+ s.summary = 'Advanced HTTP Client for Ruby, fueled with interceptors'
14
+ s.description = 'Advanced HTTP Client for Ruby, fueled with interceptors'
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- spec/*`.split("\n")
@@ -1,3 +1,3 @@
1
1
  module LHC
2
- VERSION ||= '9.4.0'
2
+ VERSION ||= '9.4.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhc
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.4.0
4
+ version: 9.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhc/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-20 00:00:00.000000000 Z
11
+ date: 2018-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -164,10 +164,9 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
- description: 'Rails gem for HTTP: Wraps typhoeus and provides additional features
168
- (like interceptors)'
167
+ description: Advanced HTTP Client for Ruby, fueled with interceptors
169
168
  email:
170
- - ws-operations@local.ch
169
+ - web@localsearch.ch
171
170
  executables: []
172
171
  extensions: []
173
172
  extra_rdoc_files: []
@@ -189,20 +188,7 @@ files:
189
188
  - cider-ci/task_components/rspec.yml
190
189
  - cider-ci/task_components/rubocop.yml
191
190
  - cider-ci/task_components/ruby.yml
192
- - docs/configuration.md
193
- - docs/exceptions.md
194
- - docs/interceptors.md
195
- - docs/interceptors/authentication.md
196
- - docs/interceptors/caching.md
197
- - docs/interceptors/default_timeout.md
198
- - docs/interceptors/logging.md
199
- - docs/interceptors/monitoring.md
200
- - docs/interceptors/prometheus.md
201
- - docs/interceptors/retry.md
202
- - docs/interceptors/rollbar.md
203
- - docs/interceptors/zipkin.md
204
- - docs/request.md
205
- - docs/response.md
191
+ - gh-md-toc
206
192
  - lhc.gemspec
207
193
  - lib/lhc.rb
208
194
  - lib/lhc/concerns/lhc/basic_methods_concern.rb
@@ -377,7 +363,7 @@ rubyforge_project:
377
363
  rubygems_version: 2.7.6
378
364
  signing_key:
379
365
  specification_version: 4
380
- summary: LocalHttpClient
366
+ summary: Advanced HTTP Client for Ruby, fueled with interceptors
381
367
  test_files:
382
368
  - spec/basic_methods/delete_spec.rb
383
369
  - spec/basic_methods/get_spec.rb
@@ -1,57 +0,0 @@
1
- Configuration
2
- ===
3
-
4
- ## Configure LHC on initialization
5
-
6
- If you want to configure LHC on initialization (like in a Rails initializer, `environment.rb` or `application.rb`), you could run into the problem that certain configurations can only be set once.
7
- You can use `LHC.configure` to prevent the initialization problem.
8
- Take care that you only use `LHC.configure` once, because it is actually reseting previously made configurations and applies the new once.
9
-
10
- ```ruby
11
-
12
- LHC.configure do |c|
13
- c.placeholder :datastore, 'http://datastore/v2'
14
- c.endpoint :feedbacks, '{+datastore}/feedbacks'
15
- c.interceptors = [CachingInterceptor, MonitorInterceptor, TrackingIdInterceptor]
16
- end
17
-
18
- ```
19
-
20
- ## Endpoints
21
-
22
- You can configure endpoints, for later use, by giving them a name, an url and some parameters (optional).
23
-
24
- ```ruby
25
- url = 'http://datastore/v2/feedbacks'
26
- options = { params: { has_reviews: true } }
27
- LHC.config.endpoint(:feedbacks, url, options)
28
- LHC.get(:feedbacks)
29
- ```
30
-
31
- Explicit request options override configured options.
32
-
33
- ```ruby
34
- LHC.get(:feedbacks, params: { has_reviews: false }) # Overrides configured params
35
- ```
36
-
37
- ## Placeholders
38
-
39
- You can configure global placeholders, that are used when generating urls from url-templates.
40
-
41
- ```ruby
42
- LHC.config.placeholder(:datastore, 'http://datastore/v2')
43
- options = { params: { has_reviews: true } }
44
- LHC.config.endpoint(:feedbacks, '{+datastore}/feedbacks', options)
45
- LHC.get(:feedbacks)
46
- ```
47
-
48
- ## Interceptors
49
-
50
- To enable interceptors you have to configure LHC's interceptors for http communication.
51
- The global default interceptors are processed in the order you provide them.
52
-
53
- ```ruby
54
- LHC.config.interceptors = [CachingInterceptor, MonitorInterceptor, TrackingIdInterceptor]
55
- ```
56
-
57
- You can only set the list of global interceptors once and you can not alter it after you set it.
@@ -1,68 +0,0 @@
1
- Exceptions
2
- ===
3
-
4
- Anything but a response code indicating success (2**) raises an exception.
5
-
6
- ```ruby
7
-
8
- LHC.get('localhost') # UnknownError: 0
9
- LHC.get('http://localhost:3000') # LHC::Timeout: 0
10
-
11
- ```
12
-
13
- You can access the response object that was causing the error.
14
-
15
- ```ruby
16
- LHC.get('local.ch')
17
- rescue => e
18
- e.response #<LHC:Response>
19
- e.response.code # 403
20
- e.response.timeout? # false
21
- Rails.logger.error e
22
- # LHC::UnknownError: get http://local.cac
23
- # Params: {:url=>"http://local.cac", :method=>:get}
24
- # Response Code: 0
25
- # <Response Body>
26
- ```
27
-
28
- All errors that are raise by LHC inherit from `LHC::Error`.
29
- They are divided into `LHC::ClientError`, `LHC::ServerError`, `LHC::Timeout` and `LHC::UnkownError` and mapped according to the following status code.
30
-
31
- ```ruby
32
- 400 => LHC::BadRequest
33
- 401 => LHC::Unauthorized
34
- 402 => LHC::PaymentRequired
35
- 403 => LHC::Forbidden
36
- 403 => LHC::Forbidden
37
- 404 => LHC::NotFound
38
- 405 => LHC::MethodNotAllowed
39
- 406 => LHC::NotAcceptable
40
- 407 => LHC::ProxyAuthenticationRequired
41
- 408 => LHC::RequestTimeout
42
- 409 => LHC::Conflict
43
- 410 => LHC::Gone
44
- 411 => LHC::LengthRequired
45
- 412 => LHC::PreconditionFailed
46
- 413 => LHC::RequestEntityTooLarge
47
- 414 => LHC::RequestUriToLong
48
- 415 => LHC::UnsupportedMediaType
49
- 416 => LHC::RequestedRangeNotSatisfiable
50
- 417 => LHC::ExpectationFailed
51
- 422 => LHC::UnprocessableEntity
52
- 423 => LHC::Locked
53
- 424 => LHC::FailedDependency
54
- 426 => LHC::UpgradeRequired
55
-
56
- 500 => LHC::InternalServerError
57
- 501 => LHC::NotImplemented
58
- 502 => LHC::BadGateway
59
- 503 => LHC::ServiceUnavailable
60
- 504 => LHC::GatewayTimeout
61
- 505 => LHC::HttpVersionNotSupported
62
- 507 => LHC::InsufficientStorage
63
- 510 => LHC::NotExtended
64
-
65
- timeout? => LHC::Timeout
66
-
67
- anything_else => LHC::UnknownError
68
- ```
@@ -1,98 +0,0 @@
1
- Interceptors
2
- ===
3
-
4
- ## Quick Start Guide
5
-
6
- ```ruby
7
- class TrackingIdInterceptor < LHC::Interceptor
8
-
9
- def before_request
10
- request.params[:tid] = 123
11
- end
12
- end
13
- ```
14
-
15
- ```ruby
16
- LHC.config.interceptors = [TrackingIdInterceptor] # global list of default interceptors
17
- ```
18
-
19
- ```ruby
20
- LHC.request({url: 'http://local.ch', interceptors: []}) # no interceptor for this request
21
- ```
22
-
23
- ## Core Interceptors
24
-
25
- There are some interceptors that are part of LHC already, that cover some basic usecases:
26
-
27
- [Available Core Interceptors](/docs/interceptors)
28
-
29
- ## Callbacks
30
-
31
- `before_raw_request` is called before the raw typhoeus request is prepared/created.
32
-
33
- `before_request` is called when the request is prepared and about to be executed.
34
-
35
- `after_request` is called after request was started.
36
-
37
- `before_response` is called when response started to arrive.
38
-
39
- `after_response` is called after the response arrived completely.
40
-
41
-
42
- ## Attributes: Request/Response
43
-
44
- Every interceptor can directly access their instance `request` or `response`.
45
-
46
- → [Read more about the request object](request.md)
47
-
48
- → [Read more about the response object](response.md)
49
-
50
- ## Global default interceptors
51
-
52
- Set the list of global default interceptors.
53
- The global default interceptors are processed in the order you provide them.
54
-
55
- ```ruby
56
- LHC.config.interceptors = [CachingInterceptor, MonitorInterceptor, TrackingIdInterceptor]
57
- ```
58
-
59
- You can only set the list of global interceptors once and you cannot alter them later.
60
-
61
- ## Interceptors on request level
62
-
63
- You can override the global default interceptors on request level:
64
-
65
- ```ruby
66
- interceptors = LHC.config.interceptors
67
- interceptors -= [CachingInterceptor] # remove caching
68
- interceptors += [RetryInterceptor] # add retry
69
- LHC.request({url: 'http://local.ch', retry: 2, interceptors: interceptors})
70
- ```
71
-
72
- ## Provide Response
73
-
74
- Inside an interceptor, you are able to provide a response, rather then doing a real request.
75
- This is useful for implementing an interceptor for caching.
76
-
77
- ```ruby
78
- class LHC::Cache < LHC::Interceptor
79
-
80
- def before_request(request)
81
- cached_response = Rails.cache.fetch(request.url)
82
- return LHC::Response.new(cached_response) if cached_response
83
- end
84
- end
85
- ```
86
-
87
- Take care that having more than one interceptor trying to return a response will cause an exception.
88
- You can access the request.response to identify if a response was already provided by another interceptor.
89
-
90
- ```ruby
91
- class RemoteCacheInterceptor < LHC::Interceptor
92
-
93
- def before_request(request)
94
- return unless request.response.nil?
95
- return LHC::Response.new(remote_cache)
96
- end
97
- end
98
- ```