ons 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +7 -0
  5. data/.yardopts +3 -0
  6. data/Gemfile +4 -0
  7. data/README-zh_CN.md +80 -0
  8. data/README.md +36 -0
  9. data/Rakefile +10 -0
  10. data/bin/console +14 -0
  11. data/bin/rake +9 -0
  12. data/bin/setup +8 -0
  13. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/Action.h +12 -0
  14. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/ConsumeContext.h +15 -0
  15. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/LocalTransactionChecker.h +16 -0
  16. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/LocalTransactionExecuter.h +16 -0
  17. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/Message.h +96 -0
  18. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/MessageListener.h +20 -0
  19. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSChannel.h +17 -0
  20. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSClient.h +28 -0
  21. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSClientException.h +27 -0
  22. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSFactory.h +73 -0
  23. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/Producer.h +29 -0
  24. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/PushConsumer.h +22 -0
  25. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/SendResultONS.h +22 -0
  26. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/TransactionProducer.h +22 -0
  27. data/ext/ons/aliyun-mq-cpp-sdk/include/ons/TransactionStatus.h +15 -0
  28. data/ext/ons/aliyun-mq-cpp-sdk/lib/libonsclient4cpp.so +0 -0
  29. data/ext/ons/consumer.cpp +68 -0
  30. data/ext/ons/consumer.hpp +33 -0
  31. data/ext/ons/extconf.rb +44 -0
  32. data/ext/ons/listener.cpp +19 -0
  33. data/ext/ons/listener.hpp +25 -0
  34. data/ext/ons/lmfao.cpp +251 -0
  35. data/ext/ons/lmfao.hpp +101 -0
  36. data/ext/ons/ons.cpp +19 -0
  37. data/ext/ons/ons.hpp +7 -0
  38. data/ext/ons/producer.cpp +74 -0
  39. data/ext/ons/producer.hpp +30 -0
  40. data/lib/ons/consumer.rb +71 -0
  41. data/lib/ons/lmfao.rb +18 -0
  42. data/lib/ons/producer.rb +80 -0
  43. data/lib/ons/version.rb +3 -0
  44. data/lib/ons.rb +36 -0
  45. data/ons.gemspec +42 -0
  46. data/samples/consumer.rb +32 -0
  47. data/samples/producer.rb +35 -0
  48. metadata +218 -0
@@ -0,0 +1,71 @@
1
+ module Ons
2
+ # the ONS Consumer
3
+ class Consumer
4
+ # Get all the Consumer instances.
5
+ #
6
+ # @return [<Consumer>] all the Consumer instances
7
+ def self.instances
8
+ @instances ||= []
9
+ end
10
+
11
+ # Create a new aliyun ONS Consumer instance.
12
+ #
13
+ # @param access_key [String] the access key to aliyun ONS
14
+ # @param secret_key [String] the secret key to aliyun ONS
15
+ # @param consumer_id [String] the consumer ID
16
+ # @param options [Hash{String, Symbol => String}]
17
+ # @option options [String] :namesrv_addr the nameserver used to fetching ons_addr
18
+ # @option options [String] :ons_addr the ONS server address
19
+ # @option options [String, Fixnum, Bignum] :thread_num the consumer thread numbers
20
+ def initialize(access_key, secret_key, consumer_id, options = {})
21
+ @consumer = Internal::Consumer.new(access_key, secret_key, consumer_id, options)
22
+
23
+ # register instance
24
+ self.class.instances << self
25
+
26
+ # start the global LMFAO event thread, so it could consume messages properly
27
+ LMFAO.start_event_thread
28
+ end
29
+
30
+ # Subsribe a topic.
31
+ #
32
+ # @example subscribe tag :tagA under topic :TopicTestMQ
33
+ # consumer.subscribe('TopicTestMQ', 'tagA') {}
34
+ #
35
+ # @example subscribe tag :tagA and :tagB under topic :TopicTestMQ
36
+ # consumer.subscribe('TopicTestMQ', 'tagA || tagB') {}
37
+ #
38
+ # @example subscribe all tags under topic :TopicTestMQ
39
+ # consumer.subscribe('TopicTestMQ', '*') {}
40
+ #
41
+ # @param topic [String] the message topic
42
+ # @param expression [String] the subsribe expression used to filter messages
43
+ # @param handler [#call] the handler which will handle the message
44
+ # @return [self] returns itself
45
+ def subscribe(topic, expression, handler = nil)
46
+ @consumer.subscribe(topic, expression, handler || Proc.new)
47
+ self
48
+ end
49
+
50
+ # Start the Consumer instance.
51
+ #
52
+ # @return [self] returns itself
53
+ #
54
+ # @note this method should be called after subscribe.
55
+ # @note thie method will not block the thread, please see also {.loop_forever}.
56
+ def start
57
+ @consumer.start
58
+ self
59
+ end
60
+
61
+ # Shutdown the Consumer instance.
62
+ #
63
+ # @return [void]
64
+ #
65
+ # @note this method should be called before program exit, otherwise it would case a memory leak.
66
+ # Please see also {.register_cleanup_hooks} if you want call it automatically.
67
+ def shutdown
68
+ @consumer.shutdown
69
+ end
70
+ end
71
+ end
data/lib/ons/lmfao.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Ons
2
+ # the LMFAO library
3
+ module LMFAO
4
+ # Get the global LMFAO event thread.
5
+ #
6
+ # @return [Thread, nil] returns the event thread
7
+ def self.event_thread
8
+ @event_thread
9
+ end
10
+
11
+ # Start the global LMFAO event thread manually.
12
+ #
13
+ # @return [Thread] returns a created/existed event thread
14
+ def self.start_event_thread
15
+ @event_thread ||= Internal::LMFAO.start_event_thread
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,80 @@
1
+ module Ons
2
+ # the ONS Producer
3
+ class Producer
4
+ # Get all the Producer instances.
5
+ #
6
+ # @return [<Producer>] all the Producer instances
7
+ def self.instances
8
+ @instances ||= []
9
+ end
10
+
11
+ # Create a new aliyun ONS Producer instance.
12
+ #
13
+ # @param access_key [String] the access key to aliyun ONS
14
+ # @param secret_key [String] the secret key to aliyun ONS
15
+ # @param producer_id [String] the producer ID
16
+ # @param options [Hash{String, Symbol => String}]
17
+ # @option options [String] :namesrv_addr the nameserver used to fetching ons_addr
18
+ # @option options [String] :ons_addr the ONS server address
19
+ # @option options [String, Fixnum, Bignum] :send_timeout (3000) send message timeout
20
+ def initialize(access_key, secret_key, producer_id, options = {})
21
+ @producer = Internal::Producer.new(access_key, secret_key, producer_id, options)
22
+
23
+ # register instance
24
+ self.class.instances << self
25
+ end
26
+
27
+ # Send a message.
28
+ #
29
+ # @example send 'Hello, World!' message with tag :tagA which is under topic :TopicTestMQ
30
+ # producer.send_message('TopicTestMQ', 'tagA', 'Hello, World!')
31
+ #
32
+ # @see #send_timer_message
33
+ #
34
+ # @param topic [String] the message topic
35
+ # @param tag [String] the message tag
36
+ # @param body [String] the message body
37
+ # @param key [String] the message key
38
+ # @return [String] the message id
39
+ def send_message(topic, tag, body, key = '')
40
+ @producer.send_message(topic, tag, body, key)
41
+ end
42
+
43
+ # Send a timer message.
44
+ #
45
+ # @example send 'Hello, World!' message at 30 seconds later
46
+ # producer.send_timer_message('TopicTestMQ', 'tagA', 'Hello, World!', Time.now + 30)
47
+ #
48
+ # @see #send_message
49
+ #
50
+ # @param topic [String] the message topic
51
+ # @param tag [String] the message tag
52
+ # @param body [String] the message body
53
+ # @param timer [#to_i] when deliver the message
54
+ # @param key [String] the message key
55
+ # @return [String] the message id
56
+ def send_timer_message(topic, tag, body, timer, key = '')
57
+ @producer.send_timer_message(topic, tag, body, timer.to_i * 1000, key)
58
+ end
59
+
60
+ # Start the Producer instance.
61
+ #
62
+ # @return [self] returns itself
63
+ #
64
+ # @note this method should be called before send any message.
65
+ def start
66
+ @producer.start
67
+ self
68
+ end
69
+
70
+ # Shutdown the Producer instance
71
+ #
72
+ # @return [void]
73
+ #
74
+ # @note this method should be called before program exit, otherwise it would case a memory leak.
75
+ # Please see also {.register_cleanup_hooks} if you want call it automatically.
76
+ def shutdown
77
+ @producer.shutdown
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,3 @@
1
+ module Ons
2
+ VERSION = '1.0.0'.freeze
3
+ end
data/lib/ons.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'ons/version'
2
+
3
+ # require dynamic library
4
+ require 'ons/ons'
5
+
6
+ # require self
7
+ require 'ons/lmfao'
8
+ require 'ons/consumer'
9
+ require 'ons/producer'
10
+
11
+ # .
12
+ module Ons
13
+ # Perform an automatic cleanup at program exit.
14
+ #
15
+ # It handles:
16
+ #
17
+ # * shutdown all the Consumer instances, see also {Consumer#shutdown}
18
+ # * shutdown all the Producer instances, see also {Producer#shutdown}
19
+ # * kill the global LMFAO event thread if it's running
20
+ def self.register_cleanup_hooks
21
+ return if @registered
22
+ @registered = true
23
+
24
+ at_exit do
25
+ Consumer.instances.each(&:shutdown)
26
+ Producer.instances.each(&:shutdown)
27
+ LMFAO.event_thread && LMFAO.event_thread.terminate
28
+ end
29
+ end
30
+
31
+ # Block the current thread.
32
+ def self.loop_forever
33
+ raise 'please start an Ons::Consumer instance before loop forever' if Consumer.instances.empty?
34
+ LMFAO.event_thread.join
35
+ end
36
+ end
data/ons.gemspec ADDED
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'ons/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'ons'
9
+ spec.version = Ons::VERSION
10
+ spec.authors = ['caochaoping']
11
+ spec.email = ['caochaoping@souche.com']
12
+
13
+ spec.summary = 'unoffical aliyun ONS sdk (ruby version)'
14
+ spec.description = 'unoffical aliyun ONS sdk (ruby version).'
15
+ spec.homepage = 'https://github.com/souche/aliyun-ons-ruby-sdk'
16
+ spec.license = 'MIT'
17
+
18
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
19
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
20
+ if spec.respond_to?(:metadata) # rubocop: disable Style/GuardClause
21
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
22
+ else
23
+ raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.extensions = ['ext/ons/extconf.rb']
30
+ spec.require_paths = ['lib']
31
+
32
+ spec.add_runtime_dependency 'rice', '~> 2.1'
33
+
34
+ spec.add_development_dependency 'bundler', '~> 1.12'
35
+ spec.add_development_dependency 'rake', '~> 10.0'
36
+ spec.add_development_dependency 'rspec', '~> 3.0'
37
+ spec.add_development_dependency 'rubocop', '~> 0.41'
38
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.5'
39
+ spec.add_development_dependency 'rake-compiler', '~> 1.0'
40
+ spec.add_development_dependency 'yard', '~> 0.9'
41
+ spec.add_development_dependency 'concurrent-ruby', '~> 1.0'
42
+ end
@@ -0,0 +1,32 @@
1
+ require 'bundler/setup'
2
+ require 'ons'
3
+
4
+ # register cleanup hooks, it will shutdown any Consumer instances at program exit
5
+ Ons.register_cleanup_hooks
6
+
7
+ # create an ONS Consumer instance
8
+ consumer = Ons::Consumer.new(ENV.fetch('ONS_ACCESS_KEY'), ENV.fetch('ONS_SECRET_KEY'), ENV.fetch('ONS_CONSUMER_ID'))
9
+
10
+ # subscribe all tags under specify topic
11
+ consumer.subscribe(ENV.fetch('ONS_TOPIC'), '*') do |message|
12
+ begin
13
+ print format("===== consume message =====\n")
14
+ print format(" topic: %s\n", message[:topic])
15
+ print format(" tag: %s\n", message[:tag])
16
+ print format(" body: %s\n", message[:body])
17
+ print format(" id: %s\n", message[:id])
18
+ print format(" key: %s\n", message[:key])
19
+ print format(" reconsume: %s times\n", message[:reconsume_times])
20
+ print format(" store at: %s (%s)\n", message[:store_timestamp], Time.at(message[:store_timestamp] / 1_000).localtime)
21
+ print format(" deliver at: %s (%s)\n", message[:deliver_timestamp], Time.at(message[:deliver_timestamp] / 1_000).localtime)
22
+ print "\n"
23
+ rescue => ex # handle any exception here
24
+ print format(" failure: %s\n", ex.message)
25
+ print "\n"
26
+ end
27
+
28
+ true # commit message
29
+ end
30
+
31
+ # start it after subscribe topic
32
+ consumer.start && Ons.loop_forever
@@ -0,0 +1,35 @@
1
+ require 'bundler/setup'
2
+ require 'ons'
3
+
4
+ # register cleanup hooks, it will shutdown any Producer instances at program exit
5
+ Ons.register_cleanup_hooks
6
+
7
+ # create an ONS Producer instance
8
+ producer = Ons::Producer.new(ENV.fetch('ONS_ACCESS_KEY'), ENV.fetch('ONS_SECRET_KEY'), ENV.fetch('ONS_PRODUCER_ID'))
9
+
10
+ # start it before send any message
11
+ producer.start
12
+
13
+ # send messages
14
+ data = Array('a'..'z').join + Array('A'..'Z').join
15
+ loop do
16
+ topic = ENV.fetch('ONS_TOPIC')
17
+ tag = 'onsTag#samples'
18
+ body = Range.new(1, 64).map(&->(_) { data[rand(data.size)] }).join
19
+ key = 'samples-' + Range.new(1, 16).map(&->(_) { data[rand(data.size)] }).join
20
+
21
+ begin
22
+ print format("===== produce message =====\n")
23
+ print format(" topic: %s\n", topic)
24
+ print format(" tag: %s\n", tag)
25
+ print format(" body: %s\n", body)
26
+ id = producer.send_message(topic, tag, body, key)
27
+ print format(" id: %s\n", id)
28
+ print "\n"
29
+ rescue => ex # such as Timeout, etc.
30
+ print format(" failure: %s\n", ex.message)
31
+ print "\n"
32
+ end
33
+
34
+ sleep rand(8)
35
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ons
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - caochaoping
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rice
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.12'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.41'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.41'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake-compiler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
125
+ - !ruby/object:Gem::Dependency
126
+ name: concurrent-ruby
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.0'
139
+ description: unoffical aliyun ONS sdk (ruby version).
140
+ email:
141
+ - caochaoping@souche.com
142
+ executables: []
143
+ extensions:
144
+ - ext/ons/extconf.rb
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".rubocop.yml"
150
+ - ".yardopts"
151
+ - Gemfile
152
+ - README-zh_CN.md
153
+ - README.md
154
+ - Rakefile
155
+ - bin/console
156
+ - bin/rake
157
+ - bin/setup
158
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/Action.h
159
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/ConsumeContext.h
160
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/LocalTransactionChecker.h
161
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/LocalTransactionExecuter.h
162
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/Message.h
163
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/MessageListener.h
164
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSChannel.h
165
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSClient.h
166
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSClientException.h
167
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/ONSFactory.h
168
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/Producer.h
169
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/PushConsumer.h
170
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/SendResultONS.h
171
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/TransactionProducer.h
172
+ - ext/ons/aliyun-mq-cpp-sdk/include/ons/TransactionStatus.h
173
+ - ext/ons/aliyun-mq-cpp-sdk/lib/libonsclient4cpp.so
174
+ - ext/ons/consumer.cpp
175
+ - ext/ons/consumer.hpp
176
+ - ext/ons/extconf.rb
177
+ - ext/ons/listener.cpp
178
+ - ext/ons/listener.hpp
179
+ - ext/ons/lmfao.cpp
180
+ - ext/ons/lmfao.hpp
181
+ - ext/ons/ons.cpp
182
+ - ext/ons/ons.hpp
183
+ - ext/ons/producer.cpp
184
+ - ext/ons/producer.hpp
185
+ - lib/ons.rb
186
+ - lib/ons/consumer.rb
187
+ - lib/ons/lmfao.rb
188
+ - lib/ons/producer.rb
189
+ - lib/ons/version.rb
190
+ - ons.gemspec
191
+ - samples/consumer.rb
192
+ - samples/producer.rb
193
+ homepage: https://github.com/souche/aliyun-ons-ruby-sdk
194
+ licenses:
195
+ - MIT
196
+ metadata:
197
+ allowed_push_host: https://rubygems.org
198
+ post_install_message:
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubyforge_project:
214
+ rubygems_version: 2.5.1
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: unoffical aliyun ONS sdk (ruby version)
218
+ test_files: []