ons 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []