issue_scheduler 0.1.1
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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +28 -0
- data/CHANGELOG.md +44 -0
- data/Dockerfile.changelog-rs +12 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +21 -0
- data/README.md +99 -0
- data/Rakefile +98 -0
- data/examples/create-issues +41 -0
- data/exe/issue-scheduler +8 -0
- data/exe/issue-scheduler-admin-ui +8 -0
- data/issue_scheduler.gemspec +56 -0
- data/lib/issue_scheduler/admin_ui.ru +23 -0
- data/lib/issue_scheduler/config.rb +233 -0
- data/lib/issue_scheduler/issue_template.rb +318 -0
- data/lib/issue_scheduler/server.rb +110 -0
- data/lib/issue_scheduler/version.rb +6 -0
- data/lib/issue_scheduler.rb +70 -0
- data/sig/issue_scheduler.rbs +4 -0
- metadata +265 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb4fce5a900cd6f6b8c5ddb71a544612bad9031f861075eb42ad05098ff36f9a
|
4
|
+
data.tar.gz: 1639180c4fcf1ab5e64c9319deb9eb4ae6c2d27c0e2977d07bb3ab67dcf8d75c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 47a6e4b7ba1c410089798718220ebe0821f94397f463ed6f6752585d3664dcee8db5faae2f877ea2dcc3b598f73fc4e75f74c95f5f51cf1f9fe3f6828aae24a7
|
7
|
+
data.tar.gz: c19b097f8b1560f4a2cd3abb6277f8e8140628079d9404d33ae4368977455dec0ed01c004fcd3300829cf0bfa123a38d860cf85f5e76cb35018ef8844ff6fb96
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
AllCops:
|
2
|
+
NewCops: enable
|
3
|
+
# Output extra information for each offense to make it easier to diagnose:
|
4
|
+
DisplayCopNames: true
|
5
|
+
DisplayStyleGuide: true
|
6
|
+
ExtraDetails: true
|
7
|
+
SuggestExtensions: false
|
8
|
+
# RuboCop enforces rules depending on the oldest version of Ruby which
|
9
|
+
# your project supports:
|
10
|
+
TargetRubyVersion: 2.7
|
11
|
+
Exclude:
|
12
|
+
- bin/create-release
|
13
|
+
- vendor/bundle/**/*
|
14
|
+
|
15
|
+
# The default max line length is 80 characters
|
16
|
+
Layout/LineLength:
|
17
|
+
Max: 120
|
18
|
+
|
19
|
+
# The DSL for RSpec and the gemspec file make it very hard to limit block length:
|
20
|
+
Metrics/BlockLength:
|
21
|
+
Exclude:
|
22
|
+
- "spec/**/*_spec.rb"
|
23
|
+
- "*.gemspec"
|
24
|
+
|
25
|
+
# When writing minitest tests, it is very hard to limit test class length:
|
26
|
+
Metrics/ClassLength:
|
27
|
+
Exclude:
|
28
|
+
- "test/**/*_test.rb"
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
<!--
|
2
|
+
# @markup markdown
|
3
|
+
# @title Change Log
|
4
|
+
-->
|
5
|
+
|
6
|
+
# Change Log
|
7
|
+
|
8
|
+
The full change log is stored on [this project's GitHub releases page](https://github.com/jcouball/issue_scheduler).
|
9
|
+
|
10
|
+
## v0.1.1
|
11
|
+
|
12
|
+
* 21efe6f Correctly set allowed_push_host in gemspec
|
13
|
+
* 9e1a722 Create initial CHANGELOG.md
|
14
|
+
* 559d3a3 Add changelog-rs Dockerfile
|
15
|
+
* 37ef841 Use gh to get repo web url instead of hardcoding the url
|
16
|
+
* d007d5f Add JRuby support to build and checkout yard from head
|
17
|
+
* 1b62347 Exclude vendor/bundle/**/* from rubocop
|
18
|
+
* 1c15d36 Exclude bin/create-release from rubocop
|
19
|
+
* 5456538 Add build and release scripts
|
20
|
+
* a66e8f8 Fix Markdown lint offenses
|
21
|
+
* cc807ac Add more usage documentation in the README.md
|
22
|
+
* 8bd404d Only require Ruby 2.7
|
23
|
+
* 6665fc0 Add script that shows example for creating an issue
|
24
|
+
* 87d893d Refactor the server script to make Rubocop happy
|
25
|
+
* c500c95 Add Config#load_issue_templates
|
26
|
+
* b9d482a Refactor reading and parsing YAML
|
27
|
+
* 0b5225b Add lib_dir method
|
28
|
+
* 725f7ee Create the script to start the admin ui
|
29
|
+
* dfbdfa2 Create the main issue-scheduler service start script
|
30
|
+
* b049b13 Rename Config#issue_files to Config#issue_templates
|
31
|
+
* 4ebb1fd Refactor IssueTemplate to use ActiveRecord
|
32
|
+
* dab32f8 Add template_name to IssueTemplate
|
33
|
+
* bf8c835 Add the IssueTemplate class
|
34
|
+
* 5dd23a0 Remove Gemfile.lock from git
|
35
|
+
* 6bd612b Documentation cleanup
|
36
|
+
* ba1564a Refactor config to take a YAML string instead of a filename
|
37
|
+
* ae393bc Add the IssueScheduler::Config class
|
38
|
+
* 32219f2 List undocumented objects in the yard task
|
39
|
+
|
40
|
+
See https://github.com/jcouball/issue_scheduler/releases/tag/v0.1.1
|
41
|
+
|
42
|
+
## v0.1.0
|
43
|
+
|
44
|
+
* caad020 Initial version
|
@@ -0,0 +1,12 @@
|
|
1
|
+
FROM rust
|
2
|
+
|
3
|
+
# Build the docker image (from this project's root directory):
|
4
|
+
# docker build --file Dockerfile.changelog-rs --tag changelog-rs .
|
5
|
+
#
|
6
|
+
# Use this image to output a changelog (from this project's root directory):
|
7
|
+
# docker run --rm --volume "$PWD:/worktree" changelog-rs v1.9.1 v1.10.0
|
8
|
+
|
9
|
+
RUN cargo install changelog-rs
|
10
|
+
WORKDIR /worktree
|
11
|
+
|
12
|
+
ENTRYPOINT ["/usr/local/cargo/bin/changelog-rs", "/worktree"]
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2022 James Couball
|
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
|
13
|
+
all 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
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# IssueScheduler
|
2
|
+
|
3
|
+
Create new Jira issues on a cron like scheduler
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'issue_scheduler'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
```shell
|
16
|
+
$ bundle install
|
17
|
+
...
|
18
|
+
Installing issue_scheduler 5.14.1
|
19
|
+
...
|
20
|
+
$
|
21
|
+
```
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
$ gem install issue_scheduler
|
27
|
+
...
|
28
|
+
$
|
29
|
+
```
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
### Configuration
|
34
|
+
|
35
|
+
Add config in the following format to ~/.issue_scheduler.yaml:
|
36
|
+
|
37
|
+
```text
|
38
|
+
username: your_username
|
39
|
+
password: Qwerty13456!
|
40
|
+
site: https://jira.mydomain.com/
|
41
|
+
context_path: ""
|
42
|
+
auth_type: :basic
|
43
|
+
issue_templates: ~/issue_templates/**/*.yaml
|
44
|
+
```
|
45
|
+
|
46
|
+
Place issue templates in the issue_templates subdirectory. Each teamplate is a yaml
|
47
|
+
file in the following format:
|
48
|
+
|
49
|
+
```text
|
50
|
+
recurrance_rule: 'RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR'
|
51
|
+
project: JIRAPROJECT
|
52
|
+
component: Internal
|
53
|
+
type: Story
|
54
|
+
summary: Take out the trash
|
55
|
+
description: |
|
56
|
+
Remember to take out the trash in the following rooms:
|
57
|
+
* Kitchen
|
58
|
+
* Bathroom
|
59
|
+
* Bedroom
|
60
|
+
* Laundry Room
|
61
|
+
|
62
|
+
When you finish this task, you will feel a lot better!
|
63
|
+
```
|
64
|
+
|
65
|
+
### Running the Scheduler
|
66
|
+
|
67
|
+
Once configuration is finished, run the scheduyler with the following command:
|
68
|
+
|
69
|
+
```shell
|
70
|
+
issue-scheduler
|
71
|
+
```
|
72
|
+
|
73
|
+
Press CTRL-C to exit the scheduler.
|
74
|
+
|
75
|
+
### Running the Admin UI
|
76
|
+
|
77
|
+
Run the admin UI with the following command:
|
78
|
+
|
79
|
+
```shell
|
80
|
+
issue-scheduler-admin-ui
|
81
|
+
```
|
82
|
+
|
83
|
+
Press CTRL-C to exit the admin UI.
|
84
|
+
|
85
|
+
## Development
|
86
|
+
|
87
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake`
|
88
|
+
to run the tests. You can also run `bin/console` for an interactive prompt that will
|
89
|
+
allow you to experiment.
|
90
|
+
|
91
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To
|
92
|
+
release a new version, update the version number in `version.rb`, and then run
|
93
|
+
`bundle exec rake release`, which will create a git tag for the version, push git
|
94
|
+
commits and the created tag, and push the `.gem` file to
|
95
|
+
[rubygems.org](https://rubygems.org).
|
96
|
+
|
97
|
+
## Contributing
|
98
|
+
|
99
|
+
Bug reports and pull requests are welcome on GitHub at [jcouball/issue_scheduler](https://github.com/jcouball/issue_scheduler).
|
data/Rakefile
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake/clean'
|
4
|
+
|
5
|
+
# The default task
|
6
|
+
|
7
|
+
desc 'Run the same tasks that the CI build will run'
|
8
|
+
if RUBY_PLATFORM == 'java'
|
9
|
+
task default: %w[spec rubocop bundle:audit build]
|
10
|
+
else
|
11
|
+
task default: %w[spec rubocop yard yard:audit yard:coverage bundle:audit build]
|
12
|
+
end
|
13
|
+
|
14
|
+
# RSpec
|
15
|
+
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
|
18
|
+
RSpec::Core::RakeTask.new
|
19
|
+
|
20
|
+
CLEAN << 'coverage'
|
21
|
+
CLEAN << '.rspec_status'
|
22
|
+
CLEAN << 'rspec-report.xml'
|
23
|
+
|
24
|
+
# Bundler Audit
|
25
|
+
|
26
|
+
require 'bundler/audit/task'
|
27
|
+
Bundler::Audit::Task.new
|
28
|
+
|
29
|
+
# Bundler Gem Build
|
30
|
+
|
31
|
+
require 'bundler'
|
32
|
+
require 'bundler/gem_tasks'
|
33
|
+
|
34
|
+
begin
|
35
|
+
Bundler.setup(:default, :development)
|
36
|
+
rescue Bundler::BundlerError => e
|
37
|
+
warn e.message
|
38
|
+
warn 'Run `bundle install` to install missing gems'
|
39
|
+
exit e.status_code
|
40
|
+
end
|
41
|
+
|
42
|
+
CLEAN << 'pkg'
|
43
|
+
CLOBBER << 'Gemfile.lock'
|
44
|
+
|
45
|
+
# Bump
|
46
|
+
|
47
|
+
require 'bump/tasks'
|
48
|
+
|
49
|
+
# Rubocop
|
50
|
+
|
51
|
+
require 'rubocop/rake_task'
|
52
|
+
|
53
|
+
RuboCop::RakeTask.new do |t|
|
54
|
+
t.options = %w[
|
55
|
+
--format progress
|
56
|
+
--format json --out rubocop-report.json
|
57
|
+
]
|
58
|
+
end
|
59
|
+
|
60
|
+
CLEAN << 'rubocop-report.json'
|
61
|
+
|
62
|
+
unless RUBY_PLATFORM == 'java'
|
63
|
+
# YARD
|
64
|
+
|
65
|
+
require 'yard'
|
66
|
+
|
67
|
+
YARD::Rake::YardocTask.new do |t|
|
68
|
+
t.files = %w[lib/**/*.rb examples/**/*]
|
69
|
+
t.stats_options = ['--list-undoc']
|
70
|
+
end
|
71
|
+
|
72
|
+
CLEAN << '.yardoc'
|
73
|
+
CLEAN << 'doc'
|
74
|
+
|
75
|
+
# Yardstick
|
76
|
+
|
77
|
+
desc 'Run yardstick to show missing YARD doc elements'
|
78
|
+
task :'yard:audit' do
|
79
|
+
sh "yardstick 'lib/**/*.rb'"
|
80
|
+
end
|
81
|
+
|
82
|
+
# Yardstick coverage
|
83
|
+
|
84
|
+
require 'yardstick/rake/verify'
|
85
|
+
|
86
|
+
Yardstick::Rake::Verify.new(:'yard:coverage') do |verify|
|
87
|
+
verify.threshold = 100
|
88
|
+
end
|
89
|
+
|
90
|
+
# Publish YARD documentation to GitHub
|
91
|
+
|
92
|
+
require 'github_pages_rake_tasks'
|
93
|
+
|
94
|
+
GithubPagesRakeTasks::PublishTask.new do |task|
|
95
|
+
# task.doc_dir = 'documentation'
|
96
|
+
task.verbose = true
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright (c) 2021 Verizon
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'issue_scheduler'
|
6
|
+
require 'pp'
|
7
|
+
|
8
|
+
config = IssueScheduler::Config.new(IssueScheduler.load_yaml('config/config.yaml'))
|
9
|
+
config.load_issue_templates
|
10
|
+
|
11
|
+
pp IssueScheduler::IssueTemplate.all.first
|
12
|
+
|
13
|
+
client = JIRA::Client.new(config.to_jira_options)
|
14
|
+
|
15
|
+
project = client.Project.find('WARPDRIVE')
|
16
|
+
component = project.components.find { |c| c.name == 'Internal' }
|
17
|
+
|
18
|
+
puts "Project: '#{project.id}: #{project.name}'"
|
19
|
+
|
20
|
+
# puts project.issuetypes.map(&:name)
|
21
|
+
# exit
|
22
|
+
|
23
|
+
puts "Component: '#{component.id}: #{component.name}'"
|
24
|
+
|
25
|
+
issue = client.Issue.build
|
26
|
+
|
27
|
+
issue.save(
|
28
|
+
{
|
29
|
+
'fields' => {
|
30
|
+
'summary' => 'Sample Ticket',
|
31
|
+
'project' => { 'key' => 'YPEDTO' },
|
32
|
+
'issuetype' => { 'name' => 'Story' }
|
33
|
+
}
|
34
|
+
}
|
35
|
+
)
|
36
|
+
|
37
|
+
puts issue.pretty_inspect
|
38
|
+
|
39
|
+
issue.fetch
|
40
|
+
|
41
|
+
puts "Created issue #{issue.key}"
|
data/exe/issue-scheduler
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/issue_scheduler/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'issue_scheduler'
|
7
|
+
spec.version = IssueScheduler::VERSION
|
8
|
+
spec.authors = ['James Couball']
|
9
|
+
spec.email = ['jcouball@yahoo.com']
|
10
|
+
|
11
|
+
spec.summary = 'Schedule recurring Jira issue creation'
|
12
|
+
spec.description = 'Allow Jira issues to be created at a specified recurrence'
|
13
|
+
spec.homepage = 'https://github.com/jcouball/issue_scheduler'
|
14
|
+
spec.required_ruby_version = '>= 2.7.0'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
|
18
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
19
|
+
|
20
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
21
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
22
|
+
spec.metadata['changelog_uri'] = File.join(spec.homepage, 'blob/master/CHANGELOG.md')
|
23
|
+
|
24
|
+
# Specify which files should be added to the gem when it is released.
|
25
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
26
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
27
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
28
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
spec.bindir = 'exe'
|
32
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
33
|
+
spec.require_paths = ['lib']
|
34
|
+
|
35
|
+
spec.add_dependency 'active_model_persistence', '~> 0.5.0'
|
36
|
+
spec.add_dependency 'jira-ruby', '~> 2.2'
|
37
|
+
spec.add_dependency 'sidekiq-cron', '~> 1.4'
|
38
|
+
|
39
|
+
spec.add_development_dependency 'bump', '~> 0.10'
|
40
|
+
spec.add_development_dependency 'bundler-audit', '~> 0.9'
|
41
|
+
spec.add_development_dependency 'github_pages_rake_tasks', '~> 0.1'
|
42
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
43
|
+
spec.add_development_dependency 'rspec', '~> 3.11'
|
44
|
+
spec.add_development_dependency 'rubocop', '~> 1.28'
|
45
|
+
spec.add_development_dependency 'simplecov', '~> 0.21'
|
46
|
+
spec.add_development_dependency 'solargraph'
|
47
|
+
|
48
|
+
unless RUBY_PLATFORM == 'java'
|
49
|
+
spec.add_development_dependency 'redcarpet', '~> 3.5'
|
50
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
51
|
+
spec.add_development_dependency 'yardstick', '~> 0.9'
|
52
|
+
end
|
53
|
+
|
54
|
+
# For more information and examples about making a new gem, check out our
|
55
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sidekiq/web'
|
4
|
+
require 'sidekiq/cron/web'
|
5
|
+
|
6
|
+
# Run the admin UI from the command line using:
|
7
|
+
# $ rackup admin_ui.rb
|
8
|
+
|
9
|
+
# A Web process always runs as client, no need to configure server
|
10
|
+
Sidekiq.configure_client do |config|
|
11
|
+
config.redis = { db: 1 }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Sidekiq::Client.push('class' => "HardWorker", 'args' => [])
|
15
|
+
|
16
|
+
# In a multi-process deployment, all Web UI instances should share
|
17
|
+
# this secret key so they can all decode the encrypted browser cookies
|
18
|
+
# and provide a working session.
|
19
|
+
# Rails does this in /config/initializers/secret_token.rb
|
20
|
+
secret_key = SecureRandom.hex(32)
|
21
|
+
use Rack::Session::Cookie, secret: secret_key, same_site: true, max_age: 86_400
|
22
|
+
|
23
|
+
run Sidekiq::Web
|