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 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