backgrounded 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ .document
2
+ *.sw?
3
+ .DS_Store
4
+ coverage
5
+ rdoc
6
+ pkg
7
+ *.sqlite3
8
+ *.log
9
+
10
+ *.gem
11
+ .bundle
12
+ Gemfile.lock
13
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in backgrounded.gemspec
4
+ gemspec
data/Rakefile CHANGED
@@ -1,24 +1,5 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "backgrounded"
8
- gem.summary = %Q{Simple API to run Model methods in the background}
9
- gem.email = "ryan.sonnek@gmail.com"
10
- gem.homepage = "http://github.com/wireframe/backgrounded"
11
- gem.authors = ["Ryan Sonnek"]
12
- gem.add_runtime_dependency "activerecord", ">= 2.2.3"
13
- gem.add_runtime_dependency "activesupport", ">= 2.2.3"
14
- gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
15
- gem.add_development_dependency 'resque_unit', ">= 0.3.1"
16
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
- end
18
- Jeweler::RubygemsDotOrgTasks.new
19
- rescue LoadError
20
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
- end
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
22
3
 
23
4
  require 'rake/testtask'
24
5
  Rake::TestTask.new(:test) do |test|
@@ -26,35 +7,4 @@ Rake::TestTask.new(:test) do |test|
26
7
  test.pattern = 'test/**/*_test.rb'
27
8
  test.verbose = true
28
9
  end
29
-
30
- begin
31
- require 'rcov/rcovtask'
32
- Rcov::RcovTask.new do |test|
33
- test.libs << 'test'
34
- test.pattern = 'test/**/*_test.rb'
35
- test.verbose = true
36
- end
37
- rescue LoadError
38
- task :rcov do
39
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
- end
41
- end
42
-
43
-
44
10
  task :default => :test
45
-
46
- require 'rake/rdoctask'
47
- Rake::RDocTask.new do |rdoc|
48
- if File.exist?('VERSION.yml')
49
- config = YAML.load(File.read('VERSION.yml'))
50
- version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
51
- else
52
- version = ""
53
- end
54
-
55
- rdoc.rdoc_dir = 'rdoc'
56
- rdoc.title = "backgrounded #{version}"
57
- rdoc.rdoc_files.include('README*')
58
- rdoc.rdoc_files.include('lib/**/*.rb')
59
- end
60
-
@@ -1,72 +1,31 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "backgrounded/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{backgrounded}
8
- s.version = "0.7.1"
6
+ s.name = "backgrounded"
7
+ s.version = Backgrounded::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ryan Sonnek"]
10
+ s.email = ["ryan@codecrate.com"]
11
+ s.homepage = "http://github.com/wireframe/backgrounded"
12
+ s.summary = %q{Simple API to run Model methods in the background}
13
+ s.description = %q{Execute any ActiveRecord Model method in the background}
9
14
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Ryan Sonnek"]
12
- s.date = %q{2010-12-09}
13
- s.email = %q{ryan.sonnek@gmail.com}
14
- s.extra_rdoc_files = [
15
- "LICENSE",
16
- "README.rdoc"
17
- ]
18
- s.files = [
19
- "LICENSE",
20
- "README.rdoc",
21
- "Rakefile",
22
- "VERSION.yml",
23
- "backgrounded.gemspec",
24
- "lib/backgrounded.rb",
25
- "lib/backgrounded/class_methods.rb",
26
- "lib/backgrounded/handler/delayed_job_handler.rb",
27
- "lib/backgrounded/handler/inprocess_handler.rb",
28
- "lib/backgrounded/handler/no_op_handler.rb",
29
- "lib/backgrounded/handler/resque_handler.rb",
30
- "lib/backgrounded/handler/workling_handler.rb",
31
- "test/backgrounded/handler/delayed_job_handler_test.rb",
32
- "test/backgrounded/handler/resque_handler_test.rb",
33
- "test/backgrounded/handler/workling_handler_test.rb",
34
- "test/backgrounded_test.rb",
35
- "test/database.yml",
36
- "test/test_helper.rb"
37
- ]
38
- s.homepage = %q{http://github.com/wireframe/backgrounded}
39
- s.require_paths = ["lib"]
40
- s.rubygems_version = %q{1.3.7}
41
- s.summary = %q{Simple API to run Model methods in the background}
42
- s.test_files = [
43
- "test/backgrounded/handler/delayed_job_handler_test.rb",
44
- "test/backgrounded/handler/resque_handler_test.rb",
45
- "test/backgrounded/handler/workling_handler_test.rb",
46
- "test/backgrounded_test.rb",
47
- "test/test_helper.rb"
48
- ]
15
+ s.rubyforge_project = "backgrounded"
49
16
 
50
- if s.respond_to? :specification_version then
51
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
- s.specification_version = 3
17
+ s.add_runtime_dependency(%q<activerecord>, [">= 2.3.10"])
18
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.3.10"])
19
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
20
+ s.add_development_dependency(%q<resque>, [">= 0.17.1"])
21
+ s.add_development_dependency(%q<resque_unit>, [">= 0.3.7"])
22
+ s.add_development_dependency(%q<mocha>, [">= 0"])
23
+ s.add_development_dependency(%q<sqlite3-ruby>, [">= 1.3.2"])
24
+ s.add_development_dependency(%q<delayed_job>, [">= 2.1.4"])
25
+ # s.add_development_dependency(%q<ruby-debug>, [">= 0"])
53
26
 
54
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
- s.add_runtime_dependency(%q<activerecord>, [">= 2.2.3"])
56
- s.add_runtime_dependency(%q<activesupport>, [">= 2.2.3"])
57
- s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
58
- s.add_development_dependency(%q<resque_unit>, [">= 0.3.1"])
59
- else
60
- s.add_dependency(%q<activerecord>, [">= 2.2.3"])
61
- s.add_dependency(%q<activesupport>, [">= 2.2.3"])
62
- s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
63
- s.add_dependency(%q<resque_unit>, [">= 0.3.1"])
64
- end
65
- else
66
- s.add_dependency(%q<activerecord>, [">= 2.2.3"])
67
- s.add_dependency(%q<activesupport>, [">= 2.2.3"])
68
- s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
69
- s.add_dependency(%q<resque_unit>, [">= 0.3.1"])
70
- end
27
+ s.files = `git ls-files`.split("\n")
28
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
29
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
30
+ s.require_paths = ["lib"]
71
31
  end
72
-
@@ -6,9 +6,14 @@ require File.join(File.dirname(__FILE__), 'backgrounded', 'handler', 'inprocess_
6
6
  Object.send(:include, Backgrounded::ClassMethods)
7
7
 
8
8
  module Backgrounded
9
- mattr_accessor :handler
10
- def self.handler
11
- @@handler ||= Backgrounded::Handler::InprocessHandler.new
9
+ class << self
10
+ attr_accessor :logger, :handler
12
11
  end
13
12
  end
14
13
 
14
+ # default handler to the basic in process handler
15
+ Backgrounded.handler = Backgrounded::Handler::InprocessHandler.new
16
+
17
+ # configure default logger to standard out with info log level
18
+ Backgrounded.logger = Logger.new STDOUT
19
+ Backgrounded.logger.level = Logger::INFO
@@ -7,16 +7,18 @@ module Backgrounded
7
7
  methods_with_options.each_pair do |method, options|
8
8
  method_basename, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
9
9
  backgrounded_method = "#{method_basename}_backgrounded#{punctuation}"
10
+ backgrounded_options_method = "#{method_basename}_backgrounded_options"
10
11
  class_eval do
11
12
  define_method backgrounded_method do |*args|
13
+ Backgrounded.logger.debug("Requesting #{Backgrounded.handler} backgrounded method: #{method} for instance #{self}")
12
14
  Backgrounded.handler.request(self, method, *args)
13
15
  nil
14
16
  end
17
+ define_method backgrounded_options_method do
18
+ options
19
+ end
15
20
  end
16
21
  end
17
- cattr_accessor :backgrounded_options
18
- self.backgrounded_options ||= {}
19
- self.backgrounded_options.merge! methods_with_options
20
22
  end
21
23
  end
22
- end
24
+ end
@@ -8,7 +8,7 @@ module Backgrounded
8
8
  @@queue = DEFAULT_QUEUE
9
9
 
10
10
  def request(object, method, *args)
11
- options = object.backgrounded_options[method.to_sym]
11
+ options = object.send("#{method.to_s.sub(/([?!=])$/, '')}_backgrounded_options")
12
12
  @@queue = options[:queue] || DEFAULT_QUEUE
13
13
  instance, id = instance_identifiers(object)
14
14
  Resque.enqueue(ResqueHandler, instance, id, method, *args)
@@ -0,0 +1,3 @@
1
+ module Backgrounded
2
+ VERSION = "0.7.2"
3
+ end
@@ -1,15 +1,15 @@
1
1
  require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
- RAILS_DEFAULT_LOGGER = Logger.new STDOUT
3
- RAILS_ENV = 'test'
4
- require 'newrelic_rpm'
5
- require 'memcache'
6
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling')
7
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'base')
8
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'discovery')
9
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'routing', 'class_and_method_routing')
10
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'remote', 'invokers', 'threaded_poller')
11
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'remote')
12
- require 'backgrounded/handler/workling_handler'
2
+ # RAILS_DEFAULT_LOGGER = Logger.new STDOUT
3
+ # RAILS_ENV = 'test'
4
+ # require 'newrelic_rpm'
5
+ # require 'memcache'
6
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling')
7
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'base')
8
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'discovery')
9
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'routing', 'class_and_method_routing')
10
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'remote', 'invokers', 'threaded_poller')
11
+ # require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'socialcast', 'vendor', 'plugins', 'workling', 'lib', 'workling', 'remote')
12
+ # require 'backgrounded/handler/workling_handler'
13
13
 
14
14
  ActiveRecord::Schema.define(:version => 1) do
15
15
  create_table :users, :force => true do |t|
@@ -37,6 +37,7 @@ class WorklingHandlerTest < Test::Unit::TestCase
37
37
 
38
38
  context 'when backgrounded is configured with workling' do
39
39
  setup do
40
+ fail 'workling not available as a gem'
40
41
  @handler = Backgrounded::Handler::WorklingHandler.new
41
42
  Backgrounded.handler = @handler
42
43
  end
@@ -64,8 +64,11 @@ class BackgroundedTest < Test::Unit::TestCase
64
64
  should 'define backgrounded method' do
65
65
  assert @user.respond_to?('do_stuff_backgrounded')
66
66
  end
67
+ should 'define backgrounded_options method' do
68
+ assert @user.respond_to?('do_stuff_backgrounded_options')
69
+ end
67
70
  should 'save backgrounded options for method' do
68
- assert_not_nil User.backgrounded_options[:do_stuff]
71
+ assert_equal({}, @user.do_stuff_backgrounded_options)
69
72
  end
70
73
  context 'executing backgrounded method' do
71
74
  setup do
@@ -116,8 +119,8 @@ class BackgroundedTest < Test::Unit::TestCase
116
119
  @post = Entry.new
117
120
  end
118
121
  should "setup options for both methods" do
119
- assert_not_nil Entry.backgrounded_options[:do_stuff]
120
- assert_not_nil Entry.backgrounded_options[:notify_users]
122
+ assert_equal({}, @post.do_stuff_backgrounded_options)
123
+ assert_equal({}, @post.notify_users_backgrounded_options)
121
124
  end
122
125
  end
123
126
 
@@ -126,7 +129,7 @@ class BackgroundedTest < Test::Unit::TestCase
126
129
  @dog = Dog.new
127
130
  end
128
131
  should 'save method options for future use' do
129
- assert_equal :low, @dog.backgrounded_options[:bark][:priority]
132
+ assert_equal({:priority => :low}, @dog.bark_backgrounded_options)
130
133
  end
131
134
  end
132
135
 
@@ -134,15 +137,18 @@ class BackgroundedTest < Test::Unit::TestCase
134
137
  should 'define backgrounded method' do
135
138
  assert Blog.respond_to?('update_info_backgrounded')
136
139
  end
140
+ should 'defined backgrounded_options method' do
141
+ assert Blog.respond_to?('update_info_backgrounded_options')
142
+ end
137
143
  should 'save backgrounded options for method' do
138
- assert_not_nil Blog.backgrounded_options[:update_info]
144
+ assert_equal({}, Blog.update_info_backgrounded_options)
139
145
  end
140
146
  context 'invoking backgrounded method' do
141
- setup do
142
- Blog.expects(:update_info)
143
- Blog.update_info_backgrounded
144
- end
145
- should 'invoke class method' do end #see expectations
147
+ setup do
148
+ Blog.expects(:update_info)
149
+ Blog.update_info_backgrounded
146
150
  end
151
+ should 'invoke class method' do end #see expectations
147
152
  end
153
+ end
148
154
  end
@@ -1,4 +1,12 @@
1
1
  require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
2
10
  require 'test/unit'
3
11
  require 'shoulda'
4
12
  require 'mocha'
@@ -8,6 +16,8 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
16
  $LOAD_PATH.unshift(File.dirname(__FILE__))
9
17
  require 'backgrounded'
10
18
 
19
+ Backgrounded.logger.level = Logger::DEBUG
20
+
11
21
  config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
12
22
  ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
13
23
  ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite'])
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backgrounded
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 7
9
- - 1
10
- version: 0.7.1
4
+ prerelease:
5
+ version: 0.7.2
11
6
  platform: ruby
12
7
  authors:
13
8
  - Ryan Sonnek
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2010-12-09 00:00:00 -06:00
19
- default_executable:
13
+ date: 2011-06-02 00:00:00 Z
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
22
16
  name: activerecord
@@ -26,12 +20,7 @@ dependencies:
26
20
  requirements:
27
21
  - - ">="
28
22
  - !ruby/object:Gem::Version
29
- hash: 1
30
- segments:
31
- - 2
32
- - 2
33
- - 3
34
- version: 2.2.3
23
+ version: 2.3.10
35
24
  type: :runtime
36
25
  version_requirements: *id001
37
26
  - !ruby/object:Gem::Dependency
@@ -42,58 +31,90 @@ dependencies:
42
31
  requirements:
43
32
  - - ">="
44
33
  - !ruby/object:Gem::Version
45
- hash: 1
46
- segments:
47
- - 2
48
- - 2
49
- - 3
50
- version: 2.2.3
34
+ version: 2.3.10
51
35
  type: :runtime
52
36
  version_requirements: *id002
53
37
  - !ruby/object:Gem::Dependency
54
- name: thoughtbot-shoulda
38
+ name: shoulda
55
39
  prerelease: false
56
40
  requirement: &id003 !ruby/object:Gem::Requirement
57
41
  none: false
58
42
  requirements:
59
43
  - - ">="
60
44
  - !ruby/object:Gem::Version
61
- hash: 3
62
- segments:
63
- - 0
64
45
  version: "0"
65
46
  type: :development
66
47
  version_requirements: *id003
67
48
  - !ruby/object:Gem::Dependency
68
- name: resque_unit
49
+ name: resque
69
50
  prerelease: false
70
51
  requirement: &id004 !ruby/object:Gem::Requirement
71
52
  none: false
72
53
  requirements:
73
54
  - - ">="
74
55
  - !ruby/object:Gem::Version
75
- hash: 17
76
- segments:
77
- - 0
78
- - 3
79
- - 1
80
- version: 0.3.1
56
+ version: 0.17.1
81
57
  type: :development
82
58
  version_requirements: *id004
83
- description:
84
- email: ryan.sonnek@gmail.com
59
+ - !ruby/object:Gem::Dependency
60
+ name: resque_unit
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.3.7
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: mocha
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: sqlite3-ruby
83
+ prerelease: false
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.3.2
90
+ type: :development
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: delayed_job
94
+ prerelease: false
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 2.1.4
101
+ type: :development
102
+ version_requirements: *id008
103
+ description: Execute any ActiveRecord Model method in the background
104
+ email:
105
+ - ryan@codecrate.com
85
106
  executables: []
86
107
 
87
108
  extensions: []
88
109
 
89
- extra_rdoc_files:
90
- - LICENSE
91
- - README.rdoc
110
+ extra_rdoc_files: []
111
+
92
112
  files:
113
+ - .gitignore
114
+ - Gemfile
93
115
  - LICENSE
94
116
  - README.rdoc
95
117
  - Rakefile
96
- - VERSION.yml
97
118
  - backgrounded.gemspec
98
119
  - lib/backgrounded.rb
99
120
  - lib/backgrounded/class_methods.rb
@@ -102,13 +123,13 @@ files:
102
123
  - lib/backgrounded/handler/no_op_handler.rb
103
124
  - lib/backgrounded/handler/resque_handler.rb
104
125
  - lib/backgrounded/handler/workling_handler.rb
126
+ - lib/backgrounded/version.rb
105
127
  - test/backgrounded/handler/delayed_job_handler_test.rb
106
128
  - test/backgrounded/handler/resque_handler_test.rb
107
129
  - test/backgrounded/handler/workling_handler_test.rb
108
130
  - test/backgrounded_test.rb
109
131
  - test/database.yml
110
132
  - test/test_helper.rb
111
- has_rdoc: true
112
133
  homepage: http://github.com/wireframe/backgrounded
113
134
  licenses: []
114
135
 
@@ -122,23 +143,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
143
  requirements:
123
144
  - - ">="
124
145
  - !ruby/object:Gem::Version
125
- hash: 3
126
- segments:
127
- - 0
128
146
  version: "0"
129
147
  required_rubygems_version: !ruby/object:Gem::Requirement
130
148
  none: false
131
149
  requirements:
132
150
  - - ">="
133
151
  - !ruby/object:Gem::Version
134
- hash: 3
135
- segments:
136
- - 0
137
152
  version: "0"
138
153
  requirements: []
139
154
 
140
- rubyforge_project:
141
- rubygems_version: 1.3.7
155
+ rubyforge_project: backgrounded
156
+ rubygems_version: 1.8.5
142
157
  signing_key:
143
158
  specification_version: 3
144
159
  summary: Simple API to run Model methods in the background
@@ -147,4 +162,5 @@ test_files:
147
162
  - test/backgrounded/handler/resque_handler_test.rb
148
163
  - test/backgrounded/handler/workling_handler_test.rb
149
164
  - test/backgrounded_test.rb
165
+ - test/database.yml
150
166
  - test/test_helper.rb
@@ -1,5 +0,0 @@
1
- ---
2
- :major: 0
3
- :minor: 7
4
- :build:
5
- :patch: 1