meetup-generator 1.2.129 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f00807f2d03f103259307f7b4047fb40f60b1a4ec9406ec3bd5314ff237e297b
4
- data.tar.gz: 4ce4933bd49a53664455e6e3973ac84ff5b574c7a87391ca48bdd54724ee86ab
3
+ metadata.gz: 8bedef0a4dc3f397d3714df080b5ea62b56860a611ec7e2f86a3b59d2c8d3f94
4
+ data.tar.gz: 8a59cf04b06f957f546f5b5deb1ac0097b65b78fe4751cfab28e1ae98b48bf7f
5
5
  SHA512:
6
- metadata.gz: b14dbcba0af9ebf4f0259a04ad043b5f2af61ff839f2eba3f4588c688dcb3b7dfdc694e9d6de603be01025903bf064ac612fbb23bc71ce3858e83abde0b93936
7
- data.tar.gz: dbcc6416c450b1f2d32a3597a689efb01e67d9538b1da1f82c5022efbba92e5a56f90be96561362c4b81d04e312216720cbcfe2e9f8d6f8fed34b37f53784e03
6
+ metadata.gz: 5bb2e3a6d6e74cf7e39ffa74841708ec86723bbd6f7df9897f1a0c543f454f4fda9ffdb15b02694784dddbe142e6e946086077b369adfe4ce8b373272ba217b8
7
+ data.tar.gz: 5cf24f515defa4b3be5b0e4249209018736ec8730dfcb9ff082751a365e2578540c528f5e613257fe62b9ae2de30af41ac84cad6ad9c0433b1a89b8e676f4347
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
  gemspec
@@ -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
- Includes SMF manifest for your SunOS pleasure.
18
+ ## Building
19
19
 
20
- Pull requests welcome.
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
- require_relative 'lib/build_helpers'
6
+ require 'bundler/gem_tasks'
5
7
 
6
8
  ROOT = Pathname(__FILE__).dirname
7
9
 
8
- task default: :test
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
-
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require_relative '../lib/locator'
4
5
 
@@ -1,31 +1,34 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- %w[sinatra/base slim pathname].each { |f| require f }
4
- require_relative '../lib/meetup-generator'
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 = MeetupGenerator.new
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
- if MG.respond_to?(params[:item]) && params[:item] != 'initialize'
15
- MG.send(params[:item]).to_json
16
- else
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
- @talks = MG.talks
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 __FILE__ == $0
33
+ run! if $PROGRAM_NAME == __FILE__
31
34
  end
data/config.ru CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'bin/meetup-generator'
2
4
  run MeetupGeneratorWebApp
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
 
3
5
  def locate_config_ru
@@ -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
@@ -1,4 +1,3 @@
1
- # We define the major and minor here. The patch version comes from
2
- # the Travis build number
3
- #
4
- BASE_VERSION = '1.2'.freeze
1
+ # frozen_string_literal: true
2
+
3
+ VERSION = '1.3.0'
Binary file
@@ -1,11 +1,11 @@
1
- require 'date'
2
- require 'English'
1
+ # frozen_string_literal: true
3
2
 
4
- require_relative 'lib/build_helpers'
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 = 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 = 'slackboy@gmail.com'
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 = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
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(lib)
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', '~> 3.0', '>= 3.0.0'
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', '~> 1.17'
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.8', '>= 1.8.0'
33
- gem.add_development_dependency 'rack-test', '>= 0.8.0', '~> 1.1'
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.52', '>= 0.52.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.2.0')
38
+ gem.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
38
39
  end
@@ -11,11 +11,15 @@ body {
11
11
  line-height: 120%;
12
12
  }
13
13
 
14
- .tperson {
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;
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- #
3
- # Acceptance tests for the meetup generator. Yeah, I know.
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 1000 times and make sure no talk titles occur
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
- gsub(/FNOPS/, '\w+')
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
- assert last_response.ok?
52
- assert last_response.header['Content-Type'] == 'text/html;charset=utf-8'
53
- x = last_response.body
54
- assert_match(/The code./, x)
55
- assert_match(/DevOps Meetup/, x)
56
- templates.each { |t| templates.delete(t) if x.match(t) }
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 test_api_talk
61
- get '/api/talk'
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 talker company role refreshment].each do |word|
78
- get format('/api/%s', word)
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
@@ -7,42 +7,42 @@ html
7
7
 
8
8
  body
9
9
  #container
10
- h1 #DevOps Meetup // Shoreditch, probably // #{(Date.today + 1).strftime("%d/%m/%Y")}
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
- span.ttitle=@talks.pop
18
- .tperson=@jobs.pop
21
+ == slim :partial_talk
19
22
 
20
23
  li
21
24
  ' 18:20 //
22
- span.ttitle=@talks.pop
23
- .tperson=@jobs.pop
25
+ == slim :partial_talk
24
26
 
25
- li 18:50 // break
26
- .tperson=@food
27
+ li
28
+ ' 18:50 // break
29
+ .indent=@agenda[:refreshment]
27
30
 
28
31
  li
29
32
  ' 19:20 //
30
- span.ttitle=@talks.pop
31
- .tperson=@jobs.pop
33
+ == slim :partial_talk
32
34
 
33
35
  li
34
36
  ' 19:40 // Ignite //
35
- span.ttitle=@talks.pop
36
- .tperson=@jobs.pop
37
+ == slim :partial_talk
37
38
 
38
39
  li
39
40
  ' 20:00 //
40
- span.ttitle=@talks.pop
41
- .tperson=@jobs.pop
41
+ == slim :partial_talk
42
42
 
43
43
  li
44
44
  ' 20:30 // Close
45
- .tperson Everyone is hiring, but no one's paying
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.
@@ -0,0 +1,11 @@
1
+ - talk = @agenda[:talks].pop
2
+
3
+ span.ttitle=talk[:title]
4
+ .indent
5
+ => talk[:talker]
6
+ ' //
7
+ => talk[:role]
8
+ ' @
9
+ a href="http://#{talk[:company]}"
10
+ == talk[:company]
11
+
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.2.129
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-03-15 00:00:00.000000000 Z
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: '3.0'
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: 3.11.0
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: '3.11'
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: '1.17'
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: '1.17'
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.8'
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.8'
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.52'
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: 0.52.0
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: '0.52'
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: slackboy@gmail.com
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/meetup-generator.rb
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/unit_spec.rb
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.2.0
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/unit_spec.rb
239
+ - spec/meetup_generator_spec.rb
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- *.gem
2
- *.swp
3
- .bundle/
4
- vendor/
5
- Gemfile.lock
@@ -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=
@@ -1,9 +0,0 @@
1
- require_relative 'version'
2
-
3
- def gem_version
4
- format('%s.%s', BASE_VERSION, build_number)
5
- end
6
-
7
- def build_number
8
- ENV['TRAVIS_BUILD_NUMBER'] || 0
9
- end
@@ -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
@@ -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