ons_on_rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5500013e0fc7f8f209737d0acce0a689e0678723
4
+ data.tar.gz: ac62eb44fea0c3d3050fccfe746e408c1e1d3a8f
5
+ SHA512:
6
+ metadata.gz: 23b94cedd8086a7934cd9d07533811c30c72a33d0a7245a13021150f8609f9a5b17eabd02cf6008f59fcaa54915aad83b49a39a0f29ee5143347504f748f591f
7
+ data.tar.gz: bc3305b4ec327dd2af246564d5743ba8147960a4e719e1f22980107b8397fa3f9e6db6be57ab442a3f23c89a144082f12331a8f68b420a8c60ecf7d1abdf643a
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /gemfiles/*.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,47 @@
1
+ require: rubocop-rspec
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'spec/dummy/db/**/*'
6
+
7
+ Metrics/AbcSize:
8
+ Enabled: false
9
+
10
+ Metrics/CyclomaticComplexity:
11
+ Enabled: false
12
+
13
+ Metrics/ClassLength:
14
+ Max: 160
15
+
16
+ Metrics/LineLength:
17
+ Max: 160
18
+
19
+ Metrics/MethodLength:
20
+ Max: 40
21
+
22
+ Metrics/PerceivedComplexity:
23
+ Max: 12
24
+
25
+ Style/Documentation:
26
+ Enabled: false
27
+
28
+ Style/FrozenStringLiteralComment:
29
+ Enabled: false
30
+
31
+ Style/GlobalVars:
32
+ AllowedVariables: ['$user_service_publisher']
33
+
34
+ Style/ParallelAssignment:
35
+ Enabled: false
36
+
37
+ Style/RedundantReturn:
38
+ Enabled: false
39
+
40
+ RSpec/NamedSubject:
41
+ Enabled: false
42
+
43
+ RSpec/ExampleLength:
44
+ Max: 16
45
+
46
+ RSpec/MultipleExpectations:
47
+ Max: 8
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ -
2
+ README.md
data/Gemfile ADDED
@@ -0,0 +1 @@
1
+ eval_gemfile File.expand_path('../gemfiles/rails50.gemfile', __FILE__)
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Souche Car Service Co., Ltd, HANGZHOU.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,125 @@
1
+ [![GitHub issues](https://img.shields.io/github/issues/souche/ons_on_rails.svg)](https://github.com/souche/ons_on_rails/issues)
2
+ [![GitHub forks](https://img.shields.io/github/forks/souche/ons_on_rails.svg)](https://github.com/souche/ons_on_rails/network)
3
+ [![GitHub stars](https://img.shields.io/github/stars/souche/ons_on_rails.svg)](https://github.com/souche/ons_on_rails/stargazers)
4
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/souche/ons_on_rails/master)
5
+ [![Gem Version](http://img.shields.io/gem/v/ons_on_rails.svg)](https://rubygems.org/gems/ons_on_rails)
6
+ [![License](http://img.shields.io/:license-mit-blue.svg)](https://souche.mit-license.org/)
7
+
8
+
9
+ # OnsOnRails
10
+
11
+ 整合阿里云 ONS 到 Rails 项目
12
+
13
+ ## 项目依赖
14
+
15
+ * Linux/Unix 系统
16
+ * Ruby 2.1.5 或以上版本
17
+ * Rails 4.1.0 或以上版本
18
+
19
+ ## 如何使用
20
+
21
+ ### 配置 Rails 环境
22
+
23
+ #### 在 Gemfile 添加依赖规则
24
+
25
+ ```ruby
26
+ gem 'ons', group: :linux
27
+ gem 'ons_on_rails'
28
+ ```
29
+
30
+ #### 在 config/application.rb 添加 require 规则
31
+
32
+ ```ruby
33
+ Bundler.require(*Rails.groups)
34
+ Bundler.require(RUBY_PLATFORM.match(/(linux|darwin)/)[0].to_sym)
35
+ ```
36
+
37
+ #### 在 config/ 目录下添加配置文件 ons\_on\_rails.yml
38
+
39
+ ```yaml
40
+ #
41
+ # access_key,阿里云官网身份验证访问码
42
+ # secret_key,阿里云身份验证密钥
43
+ #
44
+ # user_service_subscriber,消费者名称,需要与实际定义的类名信息保持一致,具体见下文的消费者章节
45
+ # user_service_subscriber#consumer_id,阿里云 MQ 控制台创建的 Consumer ID
46
+ # user_service_subscriber#topic,阿里云 MQ 控制台创建的 Topic
47
+ # user_service_subscriber#tag,当前消费者订阅的 Topic 下所关注的消息标签表达式
48
+ #
49
+ # user_service_publisher,生成者名称,具体见下文的生成者章节
50
+ # user_service_publisher#producer_id,阿里云 MQ 控制台创建的 Producer ID
51
+ # user_service_publisher#topic,阿里云 MQ 控制台创建的 Topic
52
+ # user_service_publisher#tag,当前生成者发布的消息所使用的消息标签
53
+ #
54
+ default: &default
55
+ access_key: <%= ENV['ONS_ACCESS_KEY'] %>
56
+ secret_key: <%= ENV['ONS_SECRET_KEY'] %>
57
+ user_service_subscriber:
58
+ consumer_id: <%= ENV['ONS_CONSUMER_ID'] %>
59
+ topic: <%= ENV['ONS_TOPIC'] %>
60
+ tag: 'user_service'
61
+ user_service_publisher:
62
+ producer_id: <%= ENV['ONS_PRODUCER_ID'] %>
63
+ topic: <%= ENV['ONS_TOPIC'] %>
64
+ tag: 'user_service'
65
+
66
+ development:
67
+ <<: *default
68
+
69
+ test:
70
+ <<: *default
71
+
72
+ production:
73
+ <<: *default
74
+ ```
75
+
76
+ ### 消费者
77
+
78
+ #### 在 app/subscribers 目录下添加消费者实现文件,比如 user\_service\_subscriber.rb
79
+
80
+ ```ruby
81
+ # 注意,类名应当与 config/ons_on_rails.yml 中的配置保持一致
82
+ class UserServiceSubscriber
83
+ include OnsOnRails::Subscriber
84
+
85
+ def consume(message)
86
+ # do something...
87
+ end
88
+ end
89
+ ```
90
+
91
+ #### 在 daemons/ 目录下添加守护进程定义文件,比如 user\_service\_subscriber\_control.rb
92
+
93
+ ```ruby
94
+ require 'rubygems'
95
+ require 'ons_on_rails'
96
+
97
+ APP_PATH = File.expand_path('../..', __FILE__)
98
+ OnsOnRails.run_subscriber_as_a_daemon(:user_service_subscriber, APP_PATH)
99
+ ```
100
+
101
+ #### 启动或关闭消费者进程,此进程会与阿里云 MQ 建立 TCP 连接,然后在本地消费消息
102
+
103
+ ```bash
104
+ $ RAILS_ENV=development bundle exec ruby daemons/user_service_subscriber_control.rb start
105
+ $ RAILS_ENV=development bundle exec ruby daemons/user_service_subscriber_control.rb stop
106
+ ```
107
+
108
+ ### 生产者
109
+
110
+ #### 在 config/initializers/ 目录下添加初始化文件,比如 ons\_on\_rails.rb
111
+
112
+ ```ruby
113
+ # 注意,第一个参数应当与 config/ons_on_rails.yml 中的配置保持一致
114
+ $user_service_publisher = OnsOnRails.create_publisher(:user_service_publisher, backend: :tcp)
115
+ ```
116
+
117
+ #### 调用 OnsOnRails::Publisher#publish 方法
118
+
119
+ ```ruby
120
+ $user_service_publisher.publish(operate: :create, user: { name: '123456lkjhgf' })
121
+ ```
122
+
123
+ #### 测试相关
124
+
125
+ 设置 OnsOnRails::Publisher 的 backend 为 :test 方法即可,这样生产者会将消息保存到 OnsOnRails::Publisher.deliveries 数组中
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require 'bundler/setup'
2
+
3
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
4
+ load 'rails/tasks/engine.rake'
5
+ load 'rails/tasks/statistics.rake'
6
+
7
+ require 'bundler/gem_tasks'
8
+ require 'rspec/core/rake_task'
9
+
10
+ RSpec::Core::RakeTask.new :spec do
11
+ Rails.env = 'test'
12
+ Rake::Task['app:db:environment:set'].invoke if Rails::VERSION::MAJOR == 5
13
+ Rake::Task['app:db:drop'].invoke
14
+ Rake::Task['app:db:create'].invoke
15
+ Rake::Task['app:db:schema:load'].invoke
16
+ end
17
+
18
+ task 'spec:all' do
19
+ Dir.glob(File.join(__dir__, 'gemfiles', '*.gemfile')).each do |gemfile|
20
+ sh "BUNDLE_GEMFILE=#{gemfile} bundle install --quiet"
21
+ sh "BUNDLE_GEMFILE=#{gemfile} bin/rake spec"
22
+ end
23
+ end
24
+
25
+ task default: 'spec:all'
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'ons_on_rails'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/rake ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require 'pathname'
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require 'rubygems'
15
+ require 'bundler/setup'
16
+
17
+ load Gem.bin_path('rake', 'rake')
data/bin/rspec ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rspec' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require 'pathname'
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require 'rubygems'
15
+ require 'bundler/setup'
16
+
17
+ load Gem.bin_path('rspec-core', 'rspec')
data/bin/rubocop ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rubocop' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require 'pathname'
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require 'rubygems'
15
+ require 'bundler/setup'
16
+
17
+ load Gem.bin_path('rubocop', 'rubocop')
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.1.0'
4
+
5
+ gemspec path: '..'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+
5
+ gemspec path: '..'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.0.0'
4
+
5
+ gemspec path: '..'
@@ -0,0 +1,52 @@
1
+ module OnsOnRails
2
+ class Publisher
3
+ # Create a Publisher.
4
+ #
5
+ # @param backend [#to_s] backend name, such as :tcp, :test, etc.
6
+ # @param options [Hash{Symbol => String}]
7
+ # @option options [String] :access_key the access key to aliyun ONS
8
+ # @option options [String] :secret_key the secret key to aliyun ONS
9
+ # @option options [String] :producer_id the producer ID
10
+ # @option options [String] :topic the message topic
11
+ # @option options [String] :tag the message tag
12
+ def initialize(backend, options)
13
+ required_keys = %i(access_key secret_key producer_id topic tag)
14
+ required_keys.each { |required_key| options.fetch(required_key) }
15
+
16
+ @default_topic = options.fetch(:topic)
17
+ @default_tag = options.fetch(:tag)
18
+
19
+ @backend_klass = OnsOnRails::Publishers.const_get(backend.to_s.camelize)
20
+ @backend = @backend_klass.new(options.slice(:access_key, :secret_key, :producer_id))
21
+ end
22
+
23
+ # Publish a message.
24
+ #
25
+ # @param data [Hash, String] the data which will be converted to the message body
26
+ # @param options [Hash{Symbol => String}]
27
+ # @option options [String] :topic overwrite the message topic
28
+ # @option options [String] :tag overwrite the message tag
29
+ # @option options [String] :key the message key, useful when debug
30
+ # @option options [String] :format('json') how convert the data to the message body, available format: 'json', 'raw', etc.
31
+ # @return [void]
32
+ def publish(data, options = {})
33
+ topic = options.fetch(:topic, @default_topic)
34
+ tag = options.fetch(:tag, @default_tag)
35
+
36
+ format = options.fetch(:format, 'json').to_sym
37
+ body =
38
+ case format
39
+ when :json then data.to_json
40
+ when :raw then data.to_s
41
+ else raise "unsupported message format #{format}"
42
+ end
43
+
44
+ @backend.publish(topic, tag, body, options.fetch(:key, ''))
45
+ end
46
+
47
+ # Keeps an array of all the messages published through the Publishers::Test backend. Most useful for unit and functional testing.
48
+ def self.deliveries
49
+ @deliveries ||= []
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,14 @@
1
+ module OnsOnRails
2
+ module Publishers
3
+ class Tcp
4
+ def initialize(options)
5
+ @client = Ons::Producer.new(options.fetch(:access_key), options.fetch(:secret_key), options.fetch(:producer_id))
6
+ @client.start
7
+ end
8
+
9
+ def publish(topic, tag, body, key)
10
+ @client.send_message(topic, tag, body, key)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module OnsOnRails
2
+ module Publishers
3
+ class Test
4
+ def initialize(_options)
5
+ end
6
+
7
+ def publish(topic, tag, body, key)
8
+ Publisher.deliveries << { topic: topic, tag: tag, body: body, key: key }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,53 @@
1
+ module OnsOnRails
2
+ # .
3
+ module Subscriber
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ # Allows customization for this type of subscriber.
10
+ #
11
+ # @param options [Hash{String, Symbol => String}]
12
+ # @option options [String] :access_key the access key to aliyun ONS
13
+ # @option options [String] :secret_key the secret key to aliyun ONS
14
+ # @option options [String] :consumer_id the consumer ID
15
+ # @option options [String] :topic the message topic
16
+ # @option options [String] :tag the subscribe expression used to filter messages
17
+ def ons_options(options = {})
18
+ @ons_options ||= begin
19
+ opts = OnsOnRails.ons_default_options
20
+ opts.slice(:access_key, :secret_key).merge(opts.fetch(name.to_s.underscore.to_sym, {}))
21
+ end
22
+
23
+ return @ons_options if options.blank?
24
+ @ons_options.merge!(options.symbolize_keys)
25
+ end
26
+
27
+ # Create a new subscriber instance to consume the incoming message.
28
+ #
29
+ # @param message [Hash{Symbol => Object}]
30
+ # @option message [String] topic, the message topic
31
+ # @option message [String] tag, the message tag
32
+ # @option message [String] body, the message body
33
+ # @option message [String] id, the message id
34
+ # @option message [String] key, the message key
35
+ # @return [Boolean] true/CommitMessage or false/ReconsumeLater
36
+ def consume(message)
37
+ new.consume(message)
38
+ true
39
+ rescue => ex
40
+ OnsOnRails.logger.error ex.message
41
+ OnsOnRails.logger.error ex.backtrace.join("\n")
42
+ false
43
+ end
44
+
45
+ # Determine whether it is a valid subscriber or not.
46
+ def check_subscriber_definition!
47
+ keys = %i(access_key secret_key consumer_id topic tag)
48
+ keys.each { |key| raise "missing key :#{key} in ons options" unless ons_options.key?(key) }
49
+ raise 'method #consume not implemented' unless instance_methods(false).include?(:consume)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module OnsOnRails
2
+ VERSION = '1.0.0'.freeze
3
+ end
@@ -0,0 +1,88 @@
1
+ require 'active_support/all'
2
+ require 'daemons'
3
+
4
+ require 'ons_on_rails/publisher'
5
+ Dir[File.expand_path('../ons_on_rails/publishers/*', __FILE__)].each { |f| require f }
6
+
7
+ require 'ons_on_rails/subscriber'
8
+ require 'ons_on_rails/version'
9
+
10
+ # .
11
+ module OnsOnRails
12
+ # Get the global logger.
13
+ def self.logger
14
+ @logger ||= initialize_logger
15
+ end
16
+
17
+ # Initialize an logger instance.
18
+ def self.initialize_logger
19
+ require 'logger'
20
+ Logger.new(STDOUT)
21
+ end
22
+ private_class_method :initialize_logger
23
+
24
+ # Get the ons default options.
25
+ def self.ons_default_options
26
+ @ons_default_options ||= initialize_ons_default_options
27
+ end
28
+
29
+ # Try to load ons options from config/ons_on_rails.yml.
30
+ def self.initialize_ons_default_options
31
+ return {} unless defined?(::Rails)
32
+
33
+ file = ::Rails.root.join('config', 'ons_on_rails.yml')
34
+ return {} unless file.exist?
35
+
36
+ require 'erb'
37
+ require 'yaml'
38
+ opts = YAML.load(ERB.new(IO.read(file)).result) || {}
39
+ opts.deep_symbolize_keys.fetch(::Rails.env.to_sym, {})
40
+ end
41
+ private_class_method :initialize_ons_default_options
42
+
43
+ # Create a Publisher.
44
+ #
45
+ # @param publisher_name [Symbol, String] the publisher's name
46
+ # @param backend [#to_s] backend name, such as :tcp, :test, etc.
47
+ #
48
+ # @see OnsOnRails::Publisher
49
+ def self.create_publisher(publisher_name, backend: :tcp)
50
+ options ||= begin
51
+ opts = OnsOnRails.ons_default_options
52
+ opts.slice(:access_key, :secret_key).merge(opts.fetch(publisher_name.to_s.underscore.to_sym, {}))
53
+ end
54
+
55
+ OnsOnRails::Publisher.new(backend, options)
56
+ end
57
+
58
+ # Run a subscriber as a separate process.
59
+ #
60
+ # @param subscriber_class_name [Symbol, String] the subscriber's class name
61
+ # @param app_path [String] the Rails root directory path
62
+ def self.run_subscriber_as_a_daemon(subscriber_class_name, app_path)
63
+ options = {
64
+ backtrace: true,
65
+ dir_mode: :normal,
66
+ dir: File.join(app_path, 'tmp', 'pids'),
67
+ log_dir: File.join(app_path, 'log'),
68
+ log_output: true
69
+ }
70
+
71
+ subscriber_class_name = subscriber_class_name.to_s.camelize
72
+ Daemons.run_proc(subscriber_class_name.underscore, options) do
73
+ require File.join(app_path, 'config', 'environment')
74
+ require 'ons' unless defined?(Ons)
75
+
76
+ subscriber_class = subscriber_class_name.constantize
77
+ subscriber_class.check_subscriber_definition!
78
+
79
+ options = subscriber_class.ons_options
80
+ Ons::Consumer.new(options.fetch(:access_key), options.fetch(:secret_key), options.fetch(:consumer_id))
81
+ .subscribe(options.fetch(:topic), options.fetch(:tag), &->(message) { subscriber_class.consume(message) })
82
+ .start
83
+
84
+ Ons.register_cleanup_hooks
85
+ Ons.loop_forever
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,47 @@
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_on_rails/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'ons_on_rails'
9
+ spec.version = OnsOnRails::VERSION
10
+ spec.authors = ['caochaoping']
11
+ spec.email = ['caochaoping@souche.com']
12
+
13
+ spec.summary = 'integrate the ons gem into a rails application'
14
+ spec.homepage = 'https://github.com/souche/ons_on_rails'
15
+ spec.license = 'MIT'
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata) # rubocop: disable Style/GuardClause
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
+ else
22
+ raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
23
+ end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_runtime_dependency 'daemons', '~> 1.2'
31
+ spec.add_runtime_dependency 'activesupport', '>= 4.1'
32
+
33
+ spec.add_development_dependency 'bundler', '~> 1.12'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'rubocop', '~> 0.41'
37
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.5'
38
+ spec.add_development_dependency 'yard', '~> 0.9'
39
+
40
+ # Rails dependency
41
+ spec.add_development_dependency 'mysql2', '~> 0.3.13'
42
+ spec.add_development_dependency 'ons', '~> 1.0.0'
43
+
44
+ # Rails development dependency
45
+ spec.add_development_dependency 'rspec-rails', '~> 3.5'
46
+ spec.add_development_dependency 'database_cleaner', '~> 1.5'
47
+ end
metadata ADDED
@@ -0,0 +1,236 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ons_on_rails
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-10-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: daemons
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.41'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.41'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.5'
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: mysql2
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.3.13
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.3.13
139
+ - !ruby/object:Gem::Dependency
140
+ name: ons
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.5'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.5'
167
+ - !ruby/object:Gem::Dependency
168
+ name: database_cleaner
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.5'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.5'
181
+ description:
182
+ email:
183
+ - caochaoping@souche.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - ".gitignore"
189
+ - ".rspec"
190
+ - ".rubocop.yml"
191
+ - ".yardopts"
192
+ - Gemfile
193
+ - LICENSE.txt
194
+ - README.md
195
+ - Rakefile
196
+ - bin/console
197
+ - bin/rake
198
+ - bin/rspec
199
+ - bin/rubocop
200
+ - bin/setup
201
+ - gemfiles/rails41.gemfile
202
+ - gemfiles/rails42.gemfile
203
+ - gemfiles/rails50.gemfile
204
+ - lib/ons_on_rails.rb
205
+ - lib/ons_on_rails/publisher.rb
206
+ - lib/ons_on_rails/publishers/tcp.rb
207
+ - lib/ons_on_rails/publishers/test.rb
208
+ - lib/ons_on_rails/subscriber.rb
209
+ - lib/ons_on_rails/version.rb
210
+ - ons_on_rails.gemspec
211
+ homepage: https://github.com/souche/ons_on_rails
212
+ licenses:
213
+ - MIT
214
+ metadata:
215
+ allowed_push_host: https://rubygems.org
216
+ post_install_message:
217
+ rdoc_options: []
218
+ require_paths:
219
+ - lib
220
+ required_ruby_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ requirements: []
231
+ rubyforge_project:
232
+ rubygems_version: 2.5.1
233
+ signing_key:
234
+ specification_version: 4
235
+ summary: integrate the ons gem into a rails application
236
+ test_files: []