meetup-generator 1.2.129 → 1.3.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.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/Gemfile.lock +66 -0
- data/README.md +36 -2
- data/Rakefile +4 -11
- data/bin/locate_meetup-generator +1 -0
- data/bin/meetup-generator.rb +17 -14
- data/config.ru +2 -0
- data/lib/locator.rb +2 -0
- data/lib/meetup_generator.rb +101 -0
- data/lib/version.rb +3 -4
- data/lib/words.gz +0 -0
- data/meetup-generator.gemspec +15 -14
- data/public/css/main.css +5 -2
- data/spec/acceptance_spec.rb +58 -32
- data/spec/meetup_generator_spec.rb +133 -0
- data/views/default.slim +14 -14
- data/views/partial_talk.slim +11 -0
- metadata +55 -59
- data/.gitignore +0 -5
- data/.travis.yml +0 -22
- data/lib/build_helpers.rb +0 -9
- data/lib/meetup-generator.rb +0 -70
- data/spec/unit_spec.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bedef0a4dc3f397d3714df080b5ea62b56860a611ec7e2f86a3b59d2c8d3f94
|
4
|
+
data.tar.gz: 8a59cf04b06f957f546f5b5deb1ac0097b65b78fe4751cfab28e1ae98b48bf7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bb2e3a6d6e74cf7e39ffa74841708ec86723bbd6f7df9897f1a0c543f454f4fda9ffdb15b02694784dddbe142e6e946086077b369adfe4ce8b373272ba217b8
|
7
|
+
data.tar.gz: 5cf24f515defa4b3be5b0e4249209018736ec8730dfcb9ff082751a365e2578540c528f5e613257fe62b9ae2de30af41ac84cad6ad9c0433b1a89b8e676f4347
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
meetup-generator (1.3.0)
|
5
|
+
puma (~> 3.12, >= 3.12.0)
|
6
|
+
sinatra (~> 2.0, >= 2.0.1)
|
7
|
+
slim (~> 4.0, >= 4.0.1)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
ast (2.4.0)
|
13
|
+
jaro_winkler (1.5.2)
|
14
|
+
mini_portile2 (2.4.0)
|
15
|
+
minitest (5.11.3)
|
16
|
+
mustermann (1.0.3)
|
17
|
+
nokogiri (1.10.3)
|
18
|
+
mini_portile2 (~> 2.4.0)
|
19
|
+
parallel (1.17.0)
|
20
|
+
parser (2.6.3.0)
|
21
|
+
ast (~> 2.4.0)
|
22
|
+
puma (3.12.1)
|
23
|
+
rack (2.0.7)
|
24
|
+
rack-protection (2.0.5)
|
25
|
+
rack
|
26
|
+
rack-test (1.1.0)
|
27
|
+
rack (>= 1.0, < 3)
|
28
|
+
rainbow (3.0.0)
|
29
|
+
rake (12.3.2)
|
30
|
+
rubocop (0.69.0)
|
31
|
+
jaro_winkler (~> 1.5.1)
|
32
|
+
parallel (~> 1.10)
|
33
|
+
parser (>= 2.6)
|
34
|
+
rainbow (>= 2.2.2, < 4.0)
|
35
|
+
ruby-progressbar (~> 1.7)
|
36
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
37
|
+
rubocop-performance (1.3.0)
|
38
|
+
rubocop (>= 0.68.0)
|
39
|
+
ruby-progressbar (1.10.0)
|
40
|
+
sinatra (2.0.5)
|
41
|
+
mustermann (~> 1.0)
|
42
|
+
rack (~> 2.0)
|
43
|
+
rack-protection (= 2.0.5)
|
44
|
+
tilt (~> 2.0)
|
45
|
+
slim (4.0.1)
|
46
|
+
temple (>= 0.7.6, < 0.9)
|
47
|
+
tilt (>= 2.0.6, < 2.1)
|
48
|
+
temple (0.8.1)
|
49
|
+
tilt (2.0.9)
|
50
|
+
unicode-display_width (1.6.0)
|
51
|
+
|
52
|
+
PLATFORMS
|
53
|
+
ruby
|
54
|
+
|
55
|
+
DEPENDENCIES
|
56
|
+
bundler (~> 2.0)
|
57
|
+
meetup-generator!
|
58
|
+
minitest (~> 5.11, >= 5.11.0)
|
59
|
+
nokogiri (~> 1.10)
|
60
|
+
rack-test (~> 1.1)
|
61
|
+
rake (~> 12.3, >= 12.3.0)
|
62
|
+
rubocop (~> 0.69)
|
63
|
+
rubocop-performance (~> 1.3)
|
64
|
+
|
65
|
+
BUNDLED WITH
|
66
|
+
2.0.1
|
data/README.md
CHANGED
@@ -15,6 +15,40 @@ $ curl -s localhost:4567/api/talk | json
|
|
15
15
|
}
|
16
16
|
```
|
17
17
|
|
18
|
-
|
18
|
+
## Building
|
19
19
|
|
20
|
-
|
20
|
+
Build a gem with
|
21
|
+
|
22
|
+
```sh
|
23
|
+
$ rake build
|
24
|
+
```
|
25
|
+
|
26
|
+
## Running
|
27
|
+
|
28
|
+
Install from Rubygems
|
29
|
+
|
30
|
+
```
|
31
|
+
$ gem install meetup-generator
|
32
|
+
```
|
33
|
+
|
34
|
+
then run with
|
35
|
+
|
36
|
+
```
|
37
|
+
$ rackup $(locate_meetup-generator)
|
38
|
+
```
|
39
|
+
|
40
|
+
Run from a git checkout
|
41
|
+
|
42
|
+
```
|
43
|
+
$ bin/meetup-generator.rb
|
44
|
+
```
|
45
|
+
|
46
|
+
Install as a Solaris/Illumos service
|
47
|
+
|
48
|
+
```
|
49
|
+
$ pfexec svccfg import package/meetup-generator.xml
|
50
|
+
```
|
51
|
+
|
52
|
+
Contributing
|
53
|
+
|
54
|
+
Fork it, raise a PR.
|
data/Rakefile
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'pathname'
|
2
4
|
require 'rake/testtask'
|
3
5
|
require 'rubocop/rake_task'
|
4
|
-
|
6
|
+
require 'bundler/gem_tasks'
|
5
7
|
|
6
8
|
ROOT = Pathname(__FILE__).dirname
|
7
9
|
|
8
|
-
task default:
|
10
|
+
task default: %i[rubocop test]
|
9
11
|
|
10
12
|
Rake::TestTask.new do |t|
|
11
13
|
t.pattern = 'spec/*_spec.rb'
|
@@ -15,12 +17,3 @@ end
|
|
15
17
|
RuboCop::RakeTask.new(:rubocop) do |t|
|
16
18
|
t.options = ['--display-cop-names']
|
17
19
|
end
|
18
|
-
|
19
|
-
desc 'build gem'
|
20
|
-
#task :build => :test do
|
21
|
-
task :build do
|
22
|
-
version = gem_version
|
23
|
-
puts "building gem version #{gem_version}"
|
24
|
-
`gem build #{ROOT + 'meetup-generator.gemspec'}`
|
25
|
-
end
|
26
|
-
|
data/bin/locate_meetup-generator
CHANGED
data/bin/meetup-generator.rb
CHANGED
@@ -1,31 +1,34 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
require 'sinatra/base'
|
5
|
+
require 'slim'
|
6
|
+
require 'pathname'
|
7
|
+
require_relative '../lib/meetup_generator'
|
5
8
|
|
6
9
|
ROOT = Pathname.new(__FILE__).dirname.parent
|
7
|
-
MG
|
10
|
+
MG = MeetupGenerator.new
|
8
11
|
|
12
|
+
# The Meetup Generator. Works is done in lib/meetup_generator.rb
|
13
|
+
#
|
9
14
|
class MeetupGeneratorWebApp < Sinatra::Base
|
15
|
+
def api_methods
|
16
|
+
%w[talk title talker role company refreshment agenda date location]
|
17
|
+
end
|
18
|
+
|
10
19
|
set :root, ROOT
|
11
20
|
|
12
21
|
get '/api/:item?/?*' do
|
13
22
|
content_type :json
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
[404, 'not found']
|
18
|
-
end
|
23
|
+
return [404, 'not found'] unless api_methods.include?(params[:item])
|
24
|
+
|
25
|
+
MG.send(params[:item]).to_json.chomp
|
19
26
|
end
|
20
27
|
|
21
28
|
get '*' do
|
22
|
-
@
|
23
|
-
@food = MG.refreshment
|
24
|
-
@jobs = 5.times.with_object([]) do |_i, a|
|
25
|
-
a.<< [MG.talker, '//', MG.role, '@', MG.company].join(' ')
|
26
|
-
end
|
29
|
+
@agenda = MG.agenda(5)
|
27
30
|
slim :default
|
28
31
|
end
|
29
32
|
|
30
|
-
run! if
|
33
|
+
run! if $PROGRAM_NAME == __FILE__
|
31
34
|
end
|
data/config.ru
CHANGED
data/lib/locator.rb
CHANGED
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'date'
|
5
|
+
require 'zlib'
|
6
|
+
|
7
|
+
LIB = Pathname.new(__dir__)
|
8
|
+
|
9
|
+
# Everything needed for a meetup generator
|
10
|
+
#
|
11
|
+
class MeetupGenerator
|
12
|
+
attr_reader :words, :lib
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@words = Zlib::GzipReader.open(LIB + 'words.gz').readlines.map(&:strip)
|
16
|
+
@lib = YAML.load_file(LIB + 'all_the_things.yaml')
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param num [Integer] how many talks you want
|
20
|
+
# @return [Hash] full meetup agenda
|
21
|
+
#
|
22
|
+
def agenda(num = 5)
|
23
|
+
{ talks: lib[:template].sample(num).map { |t| talk(t) },
|
24
|
+
refreshment: refreshment,
|
25
|
+
location: location,
|
26
|
+
date: date }
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param templates [Array[String]] array of templates
|
30
|
+
#
|
31
|
+
def talk(template = random_template)
|
32
|
+
{ title: title(template),
|
33
|
+
talker: talker,
|
34
|
+
role: role,
|
35
|
+
company: company }
|
36
|
+
end
|
37
|
+
|
38
|
+
def location
|
39
|
+
'Shoreditch, probably'
|
40
|
+
end
|
41
|
+
|
42
|
+
def date
|
43
|
+
(Date.today + 1).strftime('%d/%m/%Y')
|
44
|
+
end
|
45
|
+
|
46
|
+
def title(template = random_template)
|
47
|
+
replace_number(replace_ops(replace_things(template)))
|
48
|
+
end
|
49
|
+
|
50
|
+
def random_template(number = 1)
|
51
|
+
lib[:template].sample(number).first
|
52
|
+
end
|
53
|
+
|
54
|
+
def talker
|
55
|
+
pair(:first_name, :last_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def role
|
59
|
+
pair(:job_role, :job_title)
|
60
|
+
end
|
61
|
+
|
62
|
+
def refreshment
|
63
|
+
pair(:food_style, :food)
|
64
|
+
end
|
65
|
+
|
66
|
+
def company
|
67
|
+
format('%<word>s.io', word: words.sample.sub(/([^aeiou])er$/, '\\1r'))
|
68
|
+
end
|
69
|
+
|
70
|
+
def something_ops
|
71
|
+
rand(2..4).times.with_object(%w[Ops]) do |_i, a|
|
72
|
+
a.unshift(lib[:something_ops].sample)
|
73
|
+
end.join
|
74
|
+
end
|
75
|
+
|
76
|
+
def pair(list1, list2)
|
77
|
+
[lib[list1].sample, lib[list2].sample].join(' ')
|
78
|
+
end
|
79
|
+
|
80
|
+
def replace_things(template)
|
81
|
+
return template unless template =~ /%\w+%/
|
82
|
+
|
83
|
+
replace_things(template.sub(/%(\w+)%/) do
|
84
|
+
lib[Regexp.last_match(1).to_sym].sample
|
85
|
+
end)
|
86
|
+
end
|
87
|
+
|
88
|
+
def replace_ops(template)
|
89
|
+
return template unless template.include?('FNOPS')
|
90
|
+
|
91
|
+
replace_ops(template.sub(/FNOPS/, something_ops))
|
92
|
+
end
|
93
|
+
|
94
|
+
def replace_number(template)
|
95
|
+
return template unless template =~ /RAND\d+/
|
96
|
+
|
97
|
+
replace_number(template.sub(/RAND(\d+)/) do
|
98
|
+
rand(2..Regexp.last_match(1).to_i).to_s
|
99
|
+
end)
|
100
|
+
end
|
101
|
+
end
|
data/lib/version.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
BASE_VERSION = '1.2'.freeze
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
VERSION = '1.3.0'
|
data/lib/words.gz
ADDED
Binary file
|
data/meetup-generator.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'English'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
require 'date'
|
4
|
+
require_relative 'lib/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = 'meetup-generator'
|
8
|
-
gem.version =
|
8
|
+
gem.version = VERSION
|
9
9
|
gem.date = Date.today.to_s
|
10
10
|
|
11
11
|
gem.summary = 'Stupid fatuous random string generatpr'
|
@@ -13,26 +13,27 @@ Gem::Specification.new do |gem|
|
|
13
13
|
'DevOps meetup, using all the latest buzzwords, ' \
|
14
14
|
'new-shiny, and clichés'
|
15
15
|
gem.authors = ['Robert Fisher']
|
16
|
-
gem.email = '
|
16
|
+
gem.email = 'rob@sysdef.xyz'
|
17
17
|
gem.homepage = 'https://github.com/snltd/meetup-generator'
|
18
18
|
gem.license = 'BSD-2-Clause'
|
19
19
|
|
20
20
|
gem.bindir = 'bin'
|
21
21
|
gem.executables = ['meetup-generator.rb', 'locate_meetup-generator']
|
22
|
-
gem.files =
|
22
|
+
gem.files = IO.readlines('package/runtime_files', chomp: true)
|
23
23
|
gem.test_files = gem.files.grep(%r{^spec/})
|
24
|
-
gem.require_paths = %w
|
24
|
+
gem.require_paths = %w[lib]
|
25
25
|
|
26
|
+
gem.add_runtime_dependency 'puma', '~> 3.12', '>= 3.12.0'
|
26
27
|
gem.add_runtime_dependency 'sinatra', '~>2.0', '>= 2.0.1'
|
27
|
-
gem.add_runtime_dependency 'slim', '~>
|
28
|
-
gem.add_runtime_dependency 'puma', '~> 3.11', '>= 3.11.0'
|
28
|
+
gem.add_runtime_dependency 'slim', '~> 4.0', '>= 4.0.1'
|
29
29
|
|
30
|
-
gem.add_development_dependency 'bundler', '~>
|
30
|
+
gem.add_development_dependency 'bundler', '~> 2.0'
|
31
31
|
gem.add_development_dependency 'minitest', '~> 5.11', '>= 5.11.0'
|
32
|
-
gem.add_development_dependency 'nokogiri', '~> 1.
|
33
|
-
gem.add_development_dependency 'rack-test', '
|
32
|
+
gem.add_development_dependency 'nokogiri', '~> 1.10'
|
33
|
+
gem.add_development_dependency 'rack-test', '~> 1.1'
|
34
34
|
gem.add_development_dependency 'rake', '~> 12.3', '>= 12.3.0'
|
35
|
-
gem.add_development_dependency 'rubocop', '~> 0.
|
35
|
+
gem.add_development_dependency 'rubocop', '~> 0.69'
|
36
|
+
gem.add_development_dependency 'rubocop-performance', '~> 1.3'
|
36
37
|
|
37
|
-
gem.required_ruby_version = Gem::Requirement.new('>= 2.
|
38
|
+
gem.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
38
39
|
end
|
data/public/css/main.css
CHANGED
@@ -11,11 +11,15 @@ body {
|
|
11
11
|
line-height: 120%;
|
12
12
|
}
|
13
13
|
|
14
|
-
.
|
14
|
+
.indent {
|
15
15
|
font-size: small;
|
16
16
|
margin-left: 12em;
|
17
17
|
}
|
18
18
|
|
19
|
+
.indent a {
|
20
|
+
color: #0f0;
|
21
|
+
}
|
22
|
+
|
19
23
|
ul {
|
20
24
|
list-style: none;
|
21
25
|
}
|
@@ -27,7 +31,6 @@ li {
|
|
27
31
|
}
|
28
32
|
|
29
33
|
.ttitle {
|
30
|
-
/*font-style: italic;*/
|
31
34
|
font-weight: bold;
|
32
35
|
background-color: #0ff;
|
33
36
|
color: #000;
|
data/spec/acceptance_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
|
4
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
5
4
|
%w[minitest minitest/unit minitest/autorun rack/test pathname json
|
6
5
|
yaml cgi nokogiri].each { |f| require f }
|
7
6
|
|
@@ -9,6 +8,8 @@ MGROOT = Pathname.new(__FILE__).realpath.dirname.parent
|
|
9
8
|
|
10
9
|
OUTER_APP = Rack::Builder.parse_file((MGROOT + 'config.ru').to_s).first
|
11
10
|
|
11
|
+
# Acceptance tests for the meetup generator. Yeah, I know.
|
12
|
+
#
|
12
13
|
class TestApp < MiniTest::Test
|
13
14
|
attr_reader :things
|
14
15
|
include Rack::Test::Methods
|
@@ -22,8 +23,8 @@ class TestApp < MiniTest::Test
|
|
22
23
|
OUTER_APP
|
23
24
|
end
|
24
25
|
|
25
|
-
# Load the page
|
26
|
-
# twice
|
26
|
+
# Load the page a thousand times and make sure no talk titles
|
27
|
+
# occur twice
|
27
28
|
#
|
28
29
|
def test_no_repeats
|
29
30
|
1000.times do
|
@@ -33,54 +34,79 @@ class TestApp < MiniTest::Test
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
# Get all of the templates used to generate talk titles, and
|
38
|
+
# re-run the test until we've seen them all. Then we know no
|
39
|
+
# template causes a crash. That's good enough.
|
40
|
+
#
|
36
41
|
def test_default
|
37
|
-
#
|
38
|
-
# Get all of the templates used to generate talk titles, and re-run
|
39
|
-
# the test until we've seen them all. Then we know no template
|
40
|
-
# causes a crash. That's good enough.
|
41
|
-
#
|
42
42
|
templates = things[:template].map do |t|
|
43
43
|
escaped = Regexp.escape(CGI.escapeHTML(t))
|
44
|
-
matcher = escaped.gsub(/%\w+%/, '[\w\-]+').gsub(/RAND\d+/, '\d+')
|
45
|
-
|
44
|
+
matcher = escaped.gsub(/%\w+%/, '[\w\-]+').gsub(/RAND\d+/, '\d+')
|
45
|
+
.gsub(/FNOPS/, '\w+')
|
46
46
|
Regexp.new('^.*ttitle">' + matcher + '</span>.*$')
|
47
47
|
end
|
48
48
|
|
49
49
|
until templates.empty?
|
50
50
|
get '/'
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
assert_match(/
|
56
|
-
|
51
|
+
assert_equal('text/html;charset=utf-8',
|
52
|
+
last_response.header['Content-Type'])
|
53
|
+
last_response.ok?
|
54
|
+
resp = last_response.body
|
55
|
+
assert_match(/The code./, resp)
|
56
|
+
assert_match(/DevOps Meetup/, resp)
|
57
|
+
templates.each { |t| templates.delete(t) if resp =~ t }
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
60
|
-
def
|
61
|
-
get '/api/
|
61
|
+
def test_api_talker
|
62
|
+
get format('/api/talker')
|
62
63
|
assert last_response.ok?
|
64
|
+
assert_instance_of(String, last_response.body)
|
65
|
+
assert_match(/^\"\w+ \w+\"$/, last_response.body)
|
66
|
+
assert last_response.header['Content-Type'] == 'application/json'
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_api_company
|
70
|
+
get format('/api/company')
|
71
|
+
assert last_response.ok?
|
72
|
+
assert_instance_of(String, last_response.body)
|
73
|
+
assert_match(/^\"\w+.io\"$/, last_response.body)
|
63
74
|
assert last_response.header['Content-Type'] == 'application/json'
|
64
|
-
resp = last_response.body
|
65
|
-
refute_empty resp
|
66
|
-
j = JSON.parse(resp)
|
67
|
-
fields = %w[talk talker role company]
|
68
|
-
assert_equal(j.keys, fields)
|
69
|
-
fields.each { |f| refute_empty j[f] }
|
70
|
-
name = j['talker'].split
|
71
|
-
assert_includes(things[:first_name], name.first)
|
72
|
-
assert_includes(things[:last_name], name.last)
|
73
|
-
assert j['company'].end_with?('.io')
|
74
75
|
end
|
75
76
|
|
76
77
|
def test_api_misc
|
77
|
-
%w[title
|
78
|
-
get format('/api
|
78
|
+
%w[title role refreshment location date].each do |word|
|
79
|
+
get format('/api/%<word>s', word: word)
|
79
80
|
assert last_response.ok?
|
81
|
+
assert_instance_of(String, last_response.body)
|
80
82
|
assert last_response.header['Content-Type'] == 'application/json'
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
86
|
+
def test_api_talk
|
87
|
+
get format('/api/talk')
|
88
|
+
assert last_response.ok?
|
89
|
+
assert_instance_of(String, last_response.body)
|
90
|
+
as_obj = JSON.parse(last_response.body, symbolize_names: true)
|
91
|
+
assert_equal(%i[title talker role company], as_obj.keys)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_api_agenda
|
95
|
+
get format('/api/agenda')
|
96
|
+
assert last_response.ok?
|
97
|
+
assert_instance_of(String, last_response.body)
|
98
|
+
agenda = JSON.parse(last_response.body, symbolize_names: true)
|
99
|
+
assert_equal(%i[date location refreshment talks], agenda.keys.sort)
|
100
|
+
|
101
|
+
agenda[:talks].each do |t|
|
102
|
+
assert_equal(%i[title talker role company], t.keys)
|
103
|
+
end
|
104
|
+
|
105
|
+
assert_instance_of(String, agenda[:refreshment])
|
106
|
+
assert_instance_of(String, agenda[:date])
|
107
|
+
assert_instance_of(String, agenda[:location])
|
108
|
+
end
|
109
|
+
|
84
110
|
def test_api_404
|
85
111
|
get '/api/no_such_thing'
|
86
112
|
assert_equal(last_response.status, 404)
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pathname'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require_relative '../lib/meetup_generator'
|
7
|
+
|
8
|
+
THINGS = { food_style: %w[artisan],
|
9
|
+
food: %w[flatbread],
|
10
|
+
first_name: %w[John],
|
11
|
+
last_name: %w[Smith],
|
12
|
+
job_role: %w[Neckbeard],
|
13
|
+
job_title: ['Without Portfolio'],
|
14
|
+
tech: %w[Ruby],
|
15
|
+
something_ops: %w[Dev Test No],
|
16
|
+
template: ['RAND20 %tech% things'] }.freeze
|
17
|
+
|
18
|
+
class TestMeetupGenerator < Minitest::Test
|
19
|
+
attr_reader :mg
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@mg = MeetupGenerator.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_words
|
26
|
+
assert_instance_of(Array, mg.words)
|
27
|
+
assert mg.words.size > 19_000
|
28
|
+
assert_includes(mg.words, 'woebegone')
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_lib
|
32
|
+
assert_instance_of(Hash, mg.lib)
|
33
|
+
assert_includes(mg.lib[:tech], 'SmartOS')
|
34
|
+
|
35
|
+
%i[verb tech service extreme quantifier time food_style food
|
36
|
+
skill_level is_not company driver adjective panacea language
|
37
|
+
something_ops template first_name last_name job_role
|
38
|
+
job_title].each do |k|
|
39
|
+
assert_includes(mg.lib.keys, k)
|
40
|
+
assert_instance_of(Array, mg.lib[k])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# We don't want the class properly initialized
|
46
|
+
#
|
47
|
+
class Giblets < MeetupGenerator
|
48
|
+
def initialize; end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Test the uninitialized class
|
52
|
+
#
|
53
|
+
class GibletsTest < MiniTest::Test
|
54
|
+
attr_reader :m
|
55
|
+
|
56
|
+
def setup
|
57
|
+
@m = Giblets.new
|
58
|
+
m.instance_variable_set(:@lib, THINGS)
|
59
|
+
m.instance_variable_set(:@words, %w[leadswinger])
|
60
|
+
end
|
61
|
+
|
62
|
+
def _test_title
|
63
|
+
x = m.title
|
64
|
+
assert_instance_of(String, x)
|
65
|
+
assert !x.empty?
|
66
|
+
refute_match(/%\w+%/, x)
|
67
|
+
refute_match(/RAND/, x)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_agenda
|
71
|
+
agenda = m.agenda(1)
|
72
|
+
talks = agenda[:talks]
|
73
|
+
|
74
|
+
assert_instance_of(Array, talks)
|
75
|
+
assert_equal(1, talks.size)
|
76
|
+
|
77
|
+
talk = talks.first
|
78
|
+
assert_instance_of(Hash, talk)
|
79
|
+
|
80
|
+
assert_equal(%i[title talker role company], talk.keys)
|
81
|
+
tokens = talk[:title].split
|
82
|
+
number = tokens.first.to_i
|
83
|
+
assert number.positive?
|
84
|
+
assert number <= 20
|
85
|
+
assert_equal('Ruby', tokens[1])
|
86
|
+
assert_equal('things', tokens[2])
|
87
|
+
|
88
|
+
assert_equal('artisan flatbread', agenda[:refreshment])
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_something_ops
|
92
|
+
assert m.something_ops.is_a?(String)
|
93
|
+
assert m.something_ops.end_with?('Ops')
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_talker
|
97
|
+
assert_equal('John Smith', m.talker)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_role
|
101
|
+
assert_equal('Neckbeard Without Portfolio', m.role)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_company_no_e
|
105
|
+
assert_equal('leadswingr.io', m.company)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_company
|
109
|
+
m.instance_variable_set(:@words, %w[cabbage])
|
110
|
+
assert_equal('cabbage.io', m.company)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_refreshment
|
114
|
+
assert_equal('artisan flatbread', m.refreshment)
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_replace_things
|
118
|
+
x = m.replace_things('%tech% is %tech%')
|
119
|
+
assert_equal('Ruby is Ruby', x)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_replace_ops
|
123
|
+
x = m.replace_ops('From FNOPS to FNOPS')
|
124
|
+
assert_instance_of(String, x)
|
125
|
+
assert_match(/From \w+Ops to \w+Ops$/, x)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_replace_number
|
129
|
+
x = m.replace_number('RAND9 years and RAND5 months')
|
130
|
+
assert_instance_of(String, x)
|
131
|
+
assert_match(/\d years and \d months/, x)
|
132
|
+
end
|
133
|
+
end
|
data/views/default.slim
CHANGED
@@ -7,42 +7,42 @@ html
|
|
7
7
|
|
8
8
|
body
|
9
9
|
#container
|
10
|
-
h1
|
10
|
+
h1
|
11
|
+
' #DevOps Meetup //
|
12
|
+
=> @agenda[:location]
|
13
|
+
' //
|
14
|
+
== @agenda[:date]
|
11
15
|
|
12
16
|
ul
|
13
17
|
li 18:00 // Introduction
|
14
18
|
|
15
19
|
li
|
16
20
|
' 18:10 // Lightning talk //
|
17
|
-
|
18
|
-
.tperson=@jobs.pop
|
21
|
+
== slim :partial_talk
|
19
22
|
|
20
23
|
li
|
21
24
|
' 18:20 //
|
22
|
-
|
23
|
-
.tperson=@jobs.pop
|
25
|
+
== slim :partial_talk
|
24
26
|
|
25
|
-
li
|
26
|
-
|
27
|
+
li
|
28
|
+
' 18:50 // break
|
29
|
+
.indent=@agenda[:refreshment]
|
27
30
|
|
28
31
|
li
|
29
32
|
' 19:20 //
|
30
|
-
|
31
|
-
.tperson=@jobs.pop
|
33
|
+
== slim :partial_talk
|
32
34
|
|
33
35
|
li
|
34
36
|
' 19:40 // Ignite //
|
35
|
-
|
36
|
-
.tperson=@jobs.pop
|
37
|
+
== slim :partial_talk
|
37
38
|
|
38
39
|
li
|
39
40
|
' 20:00 //
|
40
|
-
|
41
|
-
.tperson=@jobs.pop
|
41
|
+
== slim :partial_talk
|
42
42
|
|
43
43
|
li
|
44
44
|
' 20:30 // Close
|
45
|
-
.
|
45
|
+
.indent Everyone is hiring, but no one's paying
|
46
46
|
|
47
47
|
#footer
|
48
48
|
a href='https://github.com/snltd/meetup-generator' The code.
|
metadata
CHANGED
@@ -1,15 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meetup-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Fisher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: puma
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.12.0
|
20
|
+
- - "~>"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.12'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.12.0
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.12'
|
13
33
|
- !ruby/object:Gem::Dependency
|
14
34
|
name: sinatra
|
15
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,56 +54,36 @@ dependencies:
|
|
34
54
|
name: slim
|
35
55
|
requirement: !ruby/object:Gem::Requirement
|
36
56
|
requirements:
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: 3.0.0
|
40
57
|
- - "~>"
|
41
58
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
43
|
-
type: :runtime
|
44
|
-
prerelease: false
|
45
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: 3.0.0
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '3.0'
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: puma
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
59
|
+
version: '4.0'
|
57
60
|
- - ">="
|
58
61
|
- !ruby/object:Gem::Version
|
59
|
-
version:
|
60
|
-
- - "~>"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '3.11'
|
62
|
+
version: 4.0.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 3.11.0
|
70
67
|
- - "~>"
|
71
68
|
- !ruby/object:Gem::Version
|
72
|
-
version: '
|
69
|
+
version: '4.0'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 4.0.1
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: bundler
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
77
|
- - "~>"
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: '
|
79
|
+
version: '2.0'
|
80
80
|
type: :development
|
81
81
|
prerelease: false
|
82
82
|
version_requirements: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
84
|
- - "~>"
|
85
85
|
- !ruby/object:Gem::Version
|
86
|
-
version: '
|
86
|
+
version: '2.0'
|
87
87
|
- !ruby/object:Gem::Dependency
|
88
88
|
name: minitest
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,29 +108,20 @@ dependencies:
|
|
108
108
|
name: nokogiri
|
109
109
|
requirement: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: 1.8.0
|
114
111
|
- - "~>"
|
115
112
|
- !ruby/object:Gem::Version
|
116
|
-
version: '1.
|
113
|
+
version: '1.10'
|
117
114
|
type: :development
|
118
115
|
prerelease: false
|
119
116
|
version_requirements: !ruby/object:Gem::Requirement
|
120
117
|
requirements:
|
121
|
-
- - ">="
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: 1.8.0
|
124
118
|
- - "~>"
|
125
119
|
- !ruby/object:Gem::Version
|
126
|
-
version: '1.
|
120
|
+
version: '1.10'
|
127
121
|
- !ruby/object:Gem::Dependency
|
128
122
|
name: rack-test
|
129
123
|
requirement: !ruby/object:Gem::Requirement
|
130
124
|
requirements:
|
131
|
-
- - ">="
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 0.8.0
|
134
125
|
- - "~>"
|
135
126
|
- !ruby/object:Gem::Version
|
136
127
|
version: '1.1'
|
@@ -138,9 +129,6 @@ dependencies:
|
|
138
129
|
prerelease: false
|
139
130
|
version_requirements: !ruby/object:Gem::Requirement
|
140
131
|
requirements:
|
141
|
-
- - ">="
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
version: 0.8.0
|
144
132
|
- - "~>"
|
145
133
|
- !ruby/object:Gem::Version
|
146
134
|
version: '1.1'
|
@@ -168,34 +156,41 @@ dependencies:
|
|
168
156
|
name: rubocop
|
169
157
|
requirement: !ruby/object:Gem::Requirement
|
170
158
|
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 0.52.0
|
174
159
|
- - "~>"
|
175
160
|
- !ruby/object:Gem::Version
|
176
|
-
version: '0.
|
161
|
+
version: '0.69'
|
177
162
|
type: :development
|
178
163
|
prerelease: false
|
179
164
|
version_requirements: !ruby/object:Gem::Requirement
|
180
165
|
requirements:
|
181
|
-
- - "
|
166
|
+
- - "~>"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0.69'
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: rubocop-performance
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - "~>"
|
182
174
|
- !ruby/object:Gem::Version
|
183
|
-
version:
|
175
|
+
version: '1.3'
|
176
|
+
type: :development
|
177
|
+
prerelease: false
|
178
|
+
version_requirements: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
184
180
|
- - "~>"
|
185
181
|
- !ruby/object:Gem::Version
|
186
|
-
version: '
|
182
|
+
version: '1.3'
|
187
183
|
description: Generates a website advertising a fictional DevOps meetup, using all
|
188
184
|
the latest buzzwords, new-shiny, and clichés
|
189
|
-
email:
|
185
|
+
email: rob@sysdef.xyz
|
190
186
|
executables:
|
191
187
|
- meetup-generator.rb
|
192
188
|
- locate_meetup-generator
|
193
189
|
extensions: []
|
194
190
|
extra_rdoc_files: []
|
195
191
|
files:
|
196
|
-
- ".gitignore"
|
197
|
-
- ".travis.yml"
|
198
192
|
- Gemfile
|
193
|
+
- Gemfile.lock
|
199
194
|
- LICENSE.txt
|
200
195
|
- README.md
|
201
196
|
- Rakefile
|
@@ -203,18 +198,19 @@ files:
|
|
203
198
|
- bin/meetup-generator.rb
|
204
199
|
- config.ru
|
205
200
|
- lib/all_the_things.yaml
|
206
|
-
- lib/build_helpers.rb
|
207
201
|
- lib/locator.rb
|
208
|
-
- lib/
|
202
|
+
- lib/meetup_generator.rb
|
209
203
|
- lib/version.rb
|
204
|
+
- lib/words.gz
|
210
205
|
- meetup-generator.gemspec
|
211
206
|
- package/meetup-generator.xml
|
212
207
|
- public/css/main.css
|
213
208
|
- public/favicon.ico
|
214
209
|
- public/zxspectr.woff
|
215
210
|
- spec/acceptance_spec.rb
|
216
|
-
- spec/
|
211
|
+
- spec/meetup_generator_spec.rb
|
217
212
|
- views/default.slim
|
213
|
+
- views/partial_talk.slim
|
218
214
|
homepage: https://github.com/snltd/meetup-generator
|
219
215
|
licenses:
|
220
216
|
- BSD-2-Clause
|
@@ -227,7 +223,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
227
223
|
requirements:
|
228
224
|
- - ">="
|
229
225
|
- !ruby/object:Gem::Version
|
230
|
-
version: 2.
|
226
|
+
version: 2.3.0
|
231
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
228
|
requirements:
|
233
229
|
- - ">="
|
@@ -240,4 +236,4 @@ specification_version: 4
|
|
240
236
|
summary: Stupid fatuous random string generatpr
|
241
237
|
test_files:
|
242
238
|
- spec/acceptance_spec.rb
|
243
|
-
- spec/
|
239
|
+
- spec/meetup_generator_spec.rb
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
cache: bundler
|
3
|
-
rvm:
|
4
|
-
- 2.2.10
|
5
|
-
- 2.3.8
|
6
|
-
- 2.4.5
|
7
|
-
- 2.5.3
|
8
|
-
- 2.6.0
|
9
|
-
before_install: gem install bundler -v 1.17.3 --no-document
|
10
|
-
deploy:
|
11
|
-
provider: rubygems
|
12
|
-
api_key:
|
13
|
-
secure: YKceAbCY5cvk6G22YkgDzjs5jAW9rLTKYTkjE3anqvt3GXa5QX4+hOV0zDT6QOK+R/Dp9LY9KEC83C861pRrNk+QrbOcelo6B9vRmB+jWoYXCJybx2f0xWl1/x9XDmLNYLpgjX2hXQGj+pMaPu+cZehigk0arSXOF3aeBl3lS14=
|
14
|
-
gem: meetup-generator
|
15
|
-
on:
|
16
|
-
branch: master
|
17
|
-
repo: snltd/meetup-generator
|
18
|
-
ruby: 2.5.3
|
19
|
-
notifications:
|
20
|
-
email: false
|
21
|
-
slack:
|
22
|
-
secure: JYsO1HPdbDmYhD/T6Wc8bK+jXIJ5014hVIJo8vSdZO4zlnSyisNqDbVl8m68CqTmDbYSRsYye3lg8sfxA1e18tC5OTbv08GXEGP7Hwyg136VErqthSUGquiRIDQ5kcXit4pI+p+CUxB/uUUalQWlF4sEP9BebWAqzA6suPbn83E=
|
data/lib/build_helpers.rb
DELETED
data/lib/meetup-generator.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
# Everything needed for a meetup generator
|
5
|
-
#
|
6
|
-
class MeetupGenerator
|
7
|
-
attr_reader :words, :lib, :unused_templates
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
grep, dict = find_unix_stuff
|
11
|
-
@words = `#{grep} "^[a-z]*$" #{dict}`.split("\n")
|
12
|
-
@lib = YAML.load_file(ROOT + 'lib' + 'all_the_things.yaml')
|
13
|
-
end
|
14
|
-
|
15
|
-
def find_unix_stuff
|
16
|
-
case RUBY_PLATFORM
|
17
|
-
when /solaris/
|
18
|
-
%w[/bin/grep /usr/share/lib/dict/words]
|
19
|
-
when /linux/
|
20
|
-
%w[/bin/grep /usr/share/dict/words]
|
21
|
-
when /darwin/
|
22
|
-
%w[/usr/bin/grep /usr/share/dict/words]
|
23
|
-
else
|
24
|
-
abort "unsupported platform: #{RUBY_PLATFORM}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def title
|
29
|
-
@unused_templates ||= lib[:template].dup
|
30
|
-
t = unused_templates.sample
|
31
|
-
unused_templates.delete(t)
|
32
|
-
t.scan(/FNOPS/).each { |k| t = t.sub(k, something_ops) }
|
33
|
-
t.scan(/%\w+%/).each { |k| t = t.sub(k, lib[k[1..-2].to_sym].sample) }
|
34
|
-
t.scan(/RAND\d+/).each do |i|
|
35
|
-
t = t.sub(i, rand(2..(i.sub(/RAND/, '').to_i)).to_s)
|
36
|
-
end
|
37
|
-
t
|
38
|
-
end
|
39
|
-
|
40
|
-
def something_ops
|
41
|
-
ret = ''
|
42
|
-
rand(2..4).times { ret.<< lib[:something_ops].sample }
|
43
|
-
ret + 'Ops'
|
44
|
-
end
|
45
|
-
|
46
|
-
def talks(count = 5)
|
47
|
-
@unused_templates = lib[:template].dup
|
48
|
-
count.times.with_object([]) { |_i, a| a.<< title }
|
49
|
-
end
|
50
|
-
|
51
|
-
def talker
|
52
|
-
format('%s %s', lib[:first_name].sample, lib[:last_name].sample)
|
53
|
-
end
|
54
|
-
|
55
|
-
def role
|
56
|
-
format('%s %s', lib[:job_role].sample, lib[:job_title].sample)
|
57
|
-
end
|
58
|
-
|
59
|
-
def company
|
60
|
-
format('%s.io', words.sample.sub(/([^aeiou])er$/, '\\1r').downcase)
|
61
|
-
end
|
62
|
-
|
63
|
-
def refreshment
|
64
|
-
format('%s %s', lib[:food_style].sample, lib[:food].sample)
|
65
|
-
end
|
66
|
-
|
67
|
-
def talk
|
68
|
-
{ talk: talks(1)[0], talker: talker, role: role, company: company }
|
69
|
-
end
|
70
|
-
end
|
data/spec/unit_spec.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'minitest/autorun'
|
4
|
-
require_relative '../lib/meetup-generator'
|
5
|
-
|
6
|
-
THINGS = { food_style: %w[artisan],
|
7
|
-
food: %w[flatbread],
|
8
|
-
first_name: %w[John],
|
9
|
-
last_name: %w[Smith],
|
10
|
-
job_role: %w[Neckbeard],
|
11
|
-
job_title: ['Without Portfolio'],
|
12
|
-
tech: %w[Ruby],
|
13
|
-
something_ops: %w[Dev Test No],
|
14
|
-
template: ['RAND20 %tech% things'] }.freeze
|
15
|
-
|
16
|
-
class Giblets < MeetupGenerator
|
17
|
-
def initialize; end
|
18
|
-
end
|
19
|
-
|
20
|
-
class GibletsTest < MiniTest::Test
|
21
|
-
attr_reader :m
|
22
|
-
|
23
|
-
def setup
|
24
|
-
@m = Giblets.new
|
25
|
-
m.instance_variable_set(:@lib, THINGS)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_title
|
29
|
-
x = m.title
|
30
|
-
assert_instance_of(String, x)
|
31
|
-
assert !x.empty?
|
32
|
-
refute_match(/%\w+%/, x)
|
33
|
-
refute_match(/RAND/, x)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_talk
|
37
|
-
x = m.talks(1)
|
38
|
-
assert_instance_of(Array, x)
|
39
|
-
assert_instance_of(String, x.first)
|
40
|
-
toks = x.first.split
|
41
|
-
number = toks.first.to_i
|
42
|
-
assert number > 0
|
43
|
-
assert number <= 20
|
44
|
-
assert_equal('Ruby', toks[1])
|
45
|
-
assert_equal('things', toks[2])
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_something_ops
|
49
|
-
assert m.something_ops.is_a?(String)
|
50
|
-
assert m.something_ops.end_with?('Ops')
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_talker
|
54
|
-
assert_equal(m.talker, 'John Smith')
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_role
|
58
|
-
assert_equal(m.role, 'Neckbeard Without Portfolio')
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_company_no_e
|
62
|
-
m.instance_variable_set(:@words, %w[leadswinger])
|
63
|
-
assert_equal(m.company, 'leadswingr.io')
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_company
|
67
|
-
m.instance_variable_set(:@words, %w[Cabbage])
|
68
|
-
assert_equal(m.company, 'cabbage.io')
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_refreshment
|
72
|
-
assert_equal(m.refreshment, 'artisan flatbread')
|
73
|
-
end
|
74
|
-
end
|