ld-eventsource 2.0.0 → 2.2.0

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
- SHA1:
3
- metadata.gz: 385c043867b40ba6ddb46cb1c9b62837018b06cb
4
- data.tar.gz: a64958fc36954f72b93c59d076ebdfb06787e13e
2
+ SHA256:
3
+ metadata.gz: 76ed80d3fefe60b6a147769dc1b44b0dfd7fe5b6841ff84655ae86764def70b9
4
+ data.tar.gz: cf24cff61716e4487d74023e09be18a516232a198aabcda2742fb8ec8de9de72
5
5
  SHA512:
6
- metadata.gz: 96cc3666962b0009ea86ec049ac1f0cac778c630c33037730007b7fa5eb338fbe779726004f0b63fa9a3bd4f6ad137879d731a3415ec1e2012de193fef609743
7
- data.tar.gz: 485e8d424a5a9afb394d780fb06790af17f8bc81f03e7c9a5a2eef391c66cfe7fd006e30317b472150cadc3c73ddae712f75e6444d2e7419020e34e065db99c0
6
+ metadata.gz: 329c044114376d9d618e37a138b7c99dc5c4f00baa3d22ea72ce88309deec8bd22a62c0513a362223542f9ddfa5aaae0413e14bbf336ef943a90e0374d2d9c89
7
+ data.tar.gz: 9110b5daa08a3c7fb04bb432527feaf4bee5e67d02b215621c89546ffd0a4da98c14a9618cdf4040474afe1649db777996547bfb502512930a3b364f05dd57c1
@@ -1,4 +1,5 @@
1
1
  require "ld-eventsource/impl/backoff"
2
+ require "ld-eventsource/impl/buffered_line_reader"
2
3
  require "ld-eventsource/impl/event_parser"
3
4
  require "ld-eventsource/events"
4
5
  require "ld-eventsource/errors"
@@ -128,11 +129,12 @@ module SSE
128
129
  read: read_timeout,
129
130
  connect: connect_timeout
130
131
  })
131
- @buffer = ""
132
+ @cxn = nil
132
133
  @lock = Mutex.new
133
134
 
134
135
  @backoff = Impl::Backoff.new(reconnect_time || DEFAULT_RECONNECT_TIME, MAX_RECONNECT_TIME,
135
136
  reconnect_reset_interval: reconnect_reset_interval)
137
+ @first_attempt = true
136
138
 
137
139
  @on = { event: ->(_) {}, error: ->(_) {} }
138
140
  @last_id = last_event_id
@@ -190,51 +192,27 @@ module SSE
190
192
  end
191
193
  end
192
194
 
195
+ #
196
+ # Tests whether the client has been shut down by a call to {Client#close}.
197
+ #
198
+ # @return [Boolean] true if the client has been shut down
199
+ #
200
+ def closed?
201
+ @stopped.value
202
+ end
203
+
193
204
  private
194
205
 
195
206
  def reset_http
196
207
  @http_client.close if !@http_client.nil?
197
- @cxn = nil
198
- @buffer = ""
199
- end
200
-
201
- def read_lines
202
- Enumerator.new do |gen|
203
- loop do
204
- line = read_line
205
- break if line.nil?
206
- gen.yield line
207
- end
208
- end
209
- end
210
-
211
- def read_line
212
- loop do
213
- @lock.synchronize do
214
- i = @buffer.index(/[\r\n]/)
215
- if !i.nil? && !(i == @buffer.length - 1 && @buffer[i] == "\r")
216
- i += 1 if (@buffer[i] == "\r" && @buffer[i + 1] == "\n")
217
- return @buffer.slice!(0, i + 1).force_encoding(Encoding::UTF_8)
218
- end
219
- end
220
- return nil if !read_chunk_into_buffer
221
- end
208
+ close_connection
222
209
  end
223
210
 
224
- def read_chunk_into_buffer
225
- # If @done is set, it means the Parser has signaled end of response body
226
- @lock.synchronize { return false if @done }
227
- begin
228
- data = @cxn.readpartial
229
- rescue HTTP::TimeoutError
230
- # We rethrow this as our own type so the caller doesn't have to know the httprb API
231
- raise Errors::ReadTimeoutError.new(@read_timeout)
211
+ def close_connection
212
+ @lock.synchronize do
213
+ @cxn.connection.close if !@cxn.nil?
214
+ @cxn = nil
232
215
  end
233
- return false if data == nil
234
- @buffer << data
235
- # We are piping the content through the parser so that it can handle things like chunked
236
- # encoding for us. The content ends up being appended to @buffer via our callback.
237
- true
238
216
  end
239
217
 
240
218
  def default_logger
@@ -246,13 +224,16 @@ module SSE
246
224
 
247
225
  def run_stream
248
226
  while !@stopped.value
249
- @cxn = nil
227
+ close_connection
250
228
  begin
251
- @cxn = connect
229
+ resp = connect
230
+ @lock.synchronize do
231
+ @cxn = resp
232
+ end
252
233
  # There's a potential race if close was called in the middle of the previous line, i.e. after we
253
234
  # connected but before @cxn was set. Checking the variable again is a bit clunky but avoids that.
254
235
  return if @stopped.value
255
- read_stream(@cxn) if !@cxn.nil?
236
+ read_stream(resp) if !resp.nil?
256
237
  rescue => e
257
238
  # When we deliberately close the connection, it will usually trigger an exception. The exact type
258
239
  # of exception depends on the specific Ruby runtime. But @stopped will always be set in this case.
@@ -274,7 +255,8 @@ module SSE
274
255
  def connect
275
256
  loop do
276
257
  return if @stopped.value
277
- interval = @backoff.next_interval
258
+ interval = @first_attempt ? 0 : @backoff.next_interval
259
+ @first_attempt = false
278
260
  if interval > 0
279
261
  @logger.info { "Will retry connection after #{'%.3f' % interval} seconds" }
280
262
  sleep(interval)
@@ -317,7 +299,27 @@ module SSE
317
299
  # it can automatically reset itself if enough time passes between failures.
318
300
  @backoff.mark_success
319
301
 
320
- event_parser = Impl::EventParser.new(read_lines)
302
+ chunks = Enumerator.new do |gen|
303
+ loop do
304
+ if @stopped.value
305
+ break
306
+ else
307
+ begin
308
+ data = cxn.readpartial
309
+ # readpartial gives us a string, which may not be a valid UTF-8 string because a
310
+ # multi-byte character might not yet have been fully read, but BufferedLineReader
311
+ # will handle that.
312
+ rescue HTTP::TimeoutError
313
+ # For historical reasons, we rethrow this as our own type
314
+ raise Errors::ReadTimeoutError.new(@read_timeout)
315
+ end
316
+ break if data.nil?
317
+ gen.yield data
318
+ end
319
+ end
320
+ end
321
+ event_parser = Impl::EventParser.new(Impl::BufferedLineReader.lines_from(chunks), @last_id)
322
+
321
323
  event_parser.items.each do |item|
322
324
  return if @stopped.value
323
325
  case item
@@ -332,7 +334,7 @@ module SSE
332
334
 
333
335
  def dispatch_event(event)
334
336
  @logger.debug { "Received event: #{event}" }
335
- @last_id = event.id
337
+ @last_id = event.id if !event.id.nil?
336
338
 
337
339
  # Pass the event to the caller
338
340
  @on[:event].call(event)
@@ -355,7 +357,7 @@ module SSE
355
357
  'Cache-Control' => 'no-cache',
356
358
  'User-Agent' => 'ruby-eventsource'
357
359
  }
358
- h['Last-Event-Id'] = @last_id if !@last_id.nil?
360
+ h['Last-Event-Id'] = @last_id if !@last_id.nil? && @last_id != ""
359
361
  h.merge(@headers)
360
362
  end
361
363
  end
@@ -11,6 +11,10 @@ module SSE
11
11
  # if there were multiple `data:` lines, they are concatenated with newlines
12
12
  # @!attribute id
13
13
  # @return [String] the string that appeared after `id:` in the stream if any, or nil
14
+ # @!attribute last_event_id
15
+ # @return [String] the `id:` value that was most recently seen in an event from
16
+ # this stream; this differs from the `id` property in that it retains the same value
17
+ # in subsequent events if they do not provide their own `id:`
14
18
  #
15
- StreamEvent = Struct.new(:type, :data, :id)
19
+ StreamEvent = Struct.new(:type, :data, :id, :last_event_id)
16
20
  end
@@ -41,7 +41,11 @@ module SSE
41
41
  @last_good_time = nil
42
42
  target = ([@base_interval * (2 ** @attempts), @max_interval].min).to_f
43
43
  @attempts += 1
44
- (target / 2) + @jitter_rand.rand(target / 2)
44
+ if target == 0
45
+ 0 # in some Ruby versions it's illegal to call rand(0)
46
+ else
47
+ (target / 2) + @jitter_rand.rand(target / 2)
48
+ end
45
49
  end
46
50
 
47
51
  #
@@ -0,0 +1,82 @@
1
+
2
+ module SSE
3
+ module Impl
4
+ class BufferedLineReader
5
+ #
6
+ # Reads a series of data chunks from an enumerator, and returns an enumerator that
7
+ # parses/aggregates these into text lines. The line terminator may be CR, LF, or
8
+ # CRLF for each line; terminators are not included in the returned lines. When the
9
+ # input data runs out, the output enumerator ends and does not include any partially
10
+ # completed line.
11
+ #
12
+ # @param [Enumerator] chunks an enumerator that will yield strings from a stream -
13
+ # these are treated as raw UTF-8 bytes, regardless of the string's declared encoding
14
+ # (so it is OK if a multi-byte character is split across chunks); if the declared
15
+ # encoding of the chunk is not ASCII-8BIT, it will be changed to ASCII-8BIT in place
16
+ # @return [Enumerator] an enumerator that will yield one line at a time in UTF-8
17
+ #
18
+ def self.lines_from(chunks)
19
+ buffer = "".b
20
+ position = 0
21
+ line_start = 0
22
+ last_char_was_cr = false
23
+
24
+ Enumerator.new do |gen|
25
+ chunks.each do |chunk|
26
+ chunk.force_encoding("ASCII-8BIT")
27
+ buffer << chunk
28
+
29
+ loop do
30
+ # Search for a line break in any part of the buffer that we haven't yet seen.
31
+ i = buffer.index(/[\r\n]/, position)
32
+ if i.nil?
33
+ # There isn't a line break yet, so we'll keep accumulating data in the buffer, using
34
+ # position to keep track of where we left off scanning. We can also discard any previously
35
+ # parsed lines from the buffer at this point.
36
+ if line_start > 0
37
+ buffer.slice!(0, line_start)
38
+ line_start = 0
39
+ end
40
+ position = buffer.length
41
+ break
42
+ end
43
+
44
+ ch = buffer[i]
45
+ if i == 0 && ch == "\n" && last_char_was_cr
46
+ # This is just the dangling LF of a CRLF pair
47
+ last_char_was_cr = false
48
+ i += 1
49
+ position = i
50
+ line_start = i
51
+ next
52
+ end
53
+
54
+ line = buffer[line_start, i - line_start].force_encoding("UTF-8")
55
+ # Calling force_encoding just declares that we believe the encoding of this string to be
56
+ # UTF-8 (which is the only encoding allowed in the SSE protocol); it doesn't cause any
57
+ # re-decoding of the string. The previous line-parsing steps were done on raw 8-bit
58
+ # strings so that it won't try to do any UTF-8 decoding on intermediate slices.
59
+
60
+ last_char_was_cr = false
61
+ i += 1
62
+ if ch == "\r"
63
+ if i == buffer.length
64
+ last_char_was_cr = true # We'll break the line here, but be on watch for a dangling LF
65
+ elsif buffer[i] == "\n"
66
+ i += 1
67
+ end
68
+ end
69
+ if i == buffer.length
70
+ buffer = ""
71
+ i = 0
72
+ end
73
+ position = i
74
+ line_start = i
75
+ gen.yield line
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -20,10 +20,12 @@ module SSE
20
20
  #
21
21
  # Constructs an instance of EventParser.
22
22
  #
23
- # @param [Enumerator] lines an enumerator that will yield one line of text at a time
23
+ # @param [Enumerator] lines an enumerator that will yield one line of text at a time;
24
+ # the lines should not include line terminators
24
25
  #
25
- def initialize(lines)
26
+ def initialize(lines, last_event_id = nil)
26
27
  @lines = lines
28
+ @last_event_id = last_event_id
27
29
  reset_buffers
28
30
  end
29
31
 
@@ -31,7 +33,6 @@ module SSE
31
33
  def items
32
34
  Enumerator.new do |gen|
33
35
  @lines.each do |line|
34
- line.chomp!
35
36
  if line.empty?
36
37
  event = maybe_create_event
37
38
  reset_buffers
@@ -53,6 +54,7 @@ module SSE
53
54
  @id = nil
54
55
  @type = nil
55
56
  @data = ""
57
+ @have_data = false
56
58
  end
57
59
 
58
60
  def process_field(name, value)
@@ -60,10 +62,14 @@ module SSE
60
62
  when "event"
61
63
  @type = value.to_sym
62
64
  when "data"
63
- @data << "\n" if !@data.empty?
65
+ @data << "\n" if @have_data
64
66
  @data << value
67
+ @have_data = true
65
68
  when "id"
66
- @id = value
69
+ if !value.include?("\x00")
70
+ @id = value
71
+ @last_event_id = value
72
+ end
67
73
  when "retry"
68
74
  if /^(?<num>\d+)$/ =~ value
69
75
  return SetRetryInterval.new(num.to_i)
@@ -73,8 +79,8 @@ module SSE
73
79
  end
74
80
 
75
81
  def maybe_create_event
76
- return nil if @data.empty?
77
- StreamEvent.new(@type || :message, @data, @id)
82
+ return nil if !@have_data
83
+ StreamEvent.new(@type || :message, @data, @id, @last_event_id)
78
84
  end
79
85
  end
80
86
  end
@@ -1,3 +1,3 @@
1
1
  module SSE
2
- VERSION = "2.0.0"
2
+ VERSION = "2.2.0"
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ld-eventsource
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - LaunchDarkly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-26 00:00:00.000000000 Z
11
+ date: 2021-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: 2.2.10
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: 2.2.10
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +84,22 @@ dependencies:
84
84
  name: http
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: 4.4.1
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 6.0.0
90
93
  type: :runtime
91
94
  prerelease: false
92
95
  version_requirements: !ruby/object:Gem::Requirement
93
96
  requirements:
94
- - - "~>"
97
+ - - ">="
95
98
  - !ruby/object:Gem::Version
96
99
  version: 4.4.1
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: 6.0.0
97
103
  description: LaunchDarkly SSE client for Ruby
98
104
  email:
99
105
  - team@launchdarkly.com
@@ -101,28 +107,16 @@ executables: []
101
107
  extensions: []
102
108
  extra_rdoc_files: []
103
109
  files:
104
- - ".circleci/config.yml"
105
- - ".gitignore"
106
- - ".ldrelease/config.yml"
107
- - CHANGELOG.md
108
- - Gemfile
109
- - Gemfile.lock
110
110
  - LICENSE
111
111
  - README.md
112
- - ld-eventsource.gemspec
113
112
  - lib/ld-eventsource.rb
114
113
  - lib/ld-eventsource/client.rb
115
114
  - lib/ld-eventsource/errors.rb
116
115
  - lib/ld-eventsource/events.rb
117
116
  - lib/ld-eventsource/impl/backoff.rb
117
+ - lib/ld-eventsource/impl/buffered_line_reader.rb
118
118
  - lib/ld-eventsource/impl/event_parser.rb
119
119
  - lib/ld-eventsource/version.rb
120
- - scripts/gendocs.sh
121
- - scripts/release.sh
122
- - spec/backoff_spec.rb
123
- - spec/client_spec.rb
124
- - spec/event_parser_spec.rb
125
- - spec/http_stub.rb
126
120
  homepage: https://github.com/launchdarkly/ruby-eventsource
127
121
  licenses:
128
122
  - Apache-2.0
@@ -142,13 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
136
  - !ruby/object:Gem::Version
143
137
  version: '0'
144
138
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.5.2.3
139
+ rubygems_version: 3.3.4
147
140
  signing_key:
148
141
  specification_version: 4
149
142
  summary: LaunchDarkly SSE client
150
- test_files:
151
- - spec/backoff_spec.rb
152
- - spec/client_spec.rb
153
- - spec/event_parser_spec.rb
154
- - spec/http_stub.rb
143
+ test_files: []
data/.circleci/config.yml DELETED
@@ -1,51 +0,0 @@
1
- version: 2
2
-
3
- workflows:
4
- version: 2
5
- test:
6
- jobs:
7
- - test-2.5
8
- - test-2.6
9
- - test-2.7
10
- - test-3.0
11
- - test-jruby-9.2
12
-
13
- ruby-docker-template: &ruby-docker-template
14
- steps:
15
- - checkout
16
- - run: |
17
- if [[ $CIRCLE_JOB == test-jruby* ]]; then
18
- gem install jruby-openssl; # required by bundler, no effect on Ruby MRI
19
- fi
20
- - run: sudo apt-get update -y && sudo apt-get install -y build-essential
21
- - run: ruby -v
22
- - run: gem install bundler -v "~> 1.17"
23
- - run: bundle install
24
- - run: mkdir ./rspec
25
- - run: bundle exec rspec --format progress --format RspecJunitFormatter -o ./rspec/rspec.xml spec
26
- - store_test_results:
27
- path: ./rspec
28
- - store_artifacts:
29
- path: ./rspec
30
-
31
- jobs:
32
- test-2.5:
33
- <<: *ruby-docker-template
34
- docker:
35
- - image: circleci/ruby:2.5
36
- test-2.6:
37
- <<: *ruby-docker-template
38
- docker:
39
- - image: circleci/ruby:2.6
40
- test-2.7:
41
- <<: *ruby-docker-template
42
- docker:
43
- - image: circleci/ruby:2.7
44
- test-3.0:
45
- <<: *ruby-docker-template
46
- docker:
47
- - image: circleci/ruby:3.0
48
- test-jruby-9.2:
49
- <<: *ruby-docker-template
50
- docker:
51
- - image: circleci/jruby:9.2-jdk
data/.gitignore DELETED
@@ -1,16 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
- *.bundle
10
- *.so
11
- *.o
12
- *.a
13
- mkmf.log
14
- *.gem
15
- .DS_Store
16
- rspec
@@ -1,17 +0,0 @@
1
- repo:
2
- public: ruby-eventsource
3
-
4
- publications:
5
- - url: https://rubygems.org/gems/ld-eventsource
6
- description: RubyGems
7
- - url: https://www.rubydoc.info/gems/ld-eventsource
8
- description: documentation
9
-
10
- releasableBranches:
11
- - name: master
12
- description: 2.x - based on the http gem
13
- - name: 1.x
14
- description: 1.x - based on the socketry gem
15
-
16
- template:
17
- name: ruby
data/CHANGELOG.md DELETED
@@ -1,20 +0,0 @@
1
- # Change log
2
-
3
- All notable changes to the LaunchDarkly SSE Client for Ruby will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org).
4
-
5
- ## [1.0.3] - 2020-03-17
6
- ### Fixed:
7
- - The backoff delay logic for reconnecting after a stream failure was broken so that if a failure occurred after a stream had been active for at least `reconnect_reset_interval` (default 60 seconds), retries would use _no_ delay, potentially causing a flood of requests and a spike in CPU usage.
8
-
9
- ## [1.0.2] - 2020-03-10
10
- ### Removed:
11
- - Removed an unused dependency on `rake`. There are no other changes in this release.
12
-
13
-
14
- ## [1.0.1] - 2019-07-10
15
- ### Fixed:
16
- - Calling `close` on the client could cause a misleading warning message in the log, such as `Unexpected error from event source: #<IOError: stream closed in another thread>`.
17
-
18
- ## [1.0.0] - 2019-01-03
19
-
20
- Initial release.
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
data/Gemfile.lock DELETED
@@ -1,67 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- ld-eventsource (2.0.0)
5
- concurrent-ruby (~> 1.0)
6
- http (~> 4.4.1)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- addressable (2.7.0)
12
- public_suffix (>= 2.0.2, < 5.0)
13
- concurrent-ruby (1.1.8)
14
- diff-lcs (1.3)
15
- domain_name (0.5.20190701)
16
- unf (>= 0.0.5, < 1.0.0)
17
- ffi (1.14.2)
18
- ffi (1.14.2-java)
19
- ffi-compiler (1.0.1)
20
- ffi (>= 1.0.0)
21
- rake
22
- http (4.4.1)
23
- addressable (~> 2.3)
24
- http-cookie (~> 1.0)
25
- http-form_data (~> 2.2)
26
- http-parser (~> 1.2.0)
27
- http-cookie (1.0.3)
28
- domain_name (~> 0.5)
29
- http-form_data (2.3.0)
30
- http-parser (1.2.3)
31
- ffi-compiler (>= 1.0, < 2.0)
32
- public_suffix (4.0.6)
33
- rake (13.0.3)
34
- rspec (3.7.0)
35
- rspec-core (~> 3.7.0)
36
- rspec-expectations (~> 3.7.0)
37
- rspec-mocks (~> 3.7.0)
38
- rspec-core (3.7.1)
39
- rspec-support (~> 3.7.0)
40
- rspec-expectations (3.7.0)
41
- diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.7.0)
43
- rspec-mocks (3.7.0)
44
- diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.7.0)
46
- rspec-support (3.7.0)
47
- rspec_junit_formatter (0.3.0)
48
- rspec-core (>= 2, < 4, != 2.12.0)
49
- unf (0.1.4)
50
- unf_ext
51
- unf (0.1.4-java)
52
- unf_ext (0.0.7.7)
53
- webrick (1.7.0)
54
-
55
- PLATFORMS
56
- java
57
- ruby
58
-
59
- DEPENDENCIES
60
- bundler (~> 1.7)
61
- ld-eventsource!
62
- rspec (~> 3.2)
63
- rspec_junit_formatter (~> 0.3.0)
64
- webrick (~> 1.7)
65
-
66
- BUNDLED WITH
67
- 1.17.3
@@ -1,30 +0,0 @@
1
- # coding: utf-8
2
-
3
- lib = File.expand_path("../lib", __FILE__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require "ld-eventsource/version"
6
-
7
- # rubocop:disable Metrics/BlockLength
8
- Gem::Specification.new do |spec|
9
- spec.name = "ld-eventsource"
10
- spec.version = SSE::VERSION
11
- spec.authors = ["LaunchDarkly"]
12
- spec.email = ["team@launchdarkly.com"]
13
- spec.summary = "LaunchDarkly SSE client"
14
- spec.description = "LaunchDarkly SSE client for Ruby"
15
- spec.homepage = "https://github.com/launchdarkly/ruby-eventsource"
16
- spec.license = "Apache-2.0"
17
-
18
- spec.files = `git ls-files -z`.split("\x0")
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
- spec.require_paths = ["lib"]
22
-
23
- spec.add_development_dependency "bundler", "~> 1.7"
24
- spec.add_development_dependency "rspec", "~> 3.2"
25
- spec.add_development_dependency "rspec_junit_formatter", "~> 0.3.0"
26
- spec.add_development_dependency "webrick", "~> 1.7"
27
-
28
- spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
29
- spec.add_runtime_dependency "http", "~> 4.4.1"
30
- end
data/scripts/gendocs.sh DELETED
@@ -1,12 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Use this script to generate documentation locally in ./doc so it can be proofed before release.
4
- # After release, documentation will be visible at https://www.rubydoc.info/gems/ld-eventsource
5
-
6
- gem install --conservative yard
7
- gem install --conservative redcarpet # provides Markdown formatting
8
-
9
- # yard doesn't seem to do recursive directories, even though Ruby's Dir.glob supposedly recurses for "**"
10
- PATHS="lib/*.rb lib/**/*.rb lib/**/**/*.rb"
11
-
12
- yard doc --no-private --markup markdown --markup-provider redcarpet --embed-mixins $PATHS - README.md