classnamer 3.0.8

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 739adbbcad3a5bcf1cca2cdd2382c2353f2ab8c42a0f1e8d26aff6dccb9cbe8b
4
+ data.tar.gz: fca286e359dd7d1e24a8475bd24f4e93c77528ddddcc01c905376e4b819c6d97
5
+ SHA512:
6
+ metadata.gz: 5dc4755ce5009c9e96b2c3e3f46d71c52a32cf9c2ff1d1686d786507cb3424f3085a7d68d43a9dcb62c9ef33313a5756acaeba80a2a22480715ad09bf9078fa1
7
+ data.tar.gz: 6bd9610baaec2587275b4514185452d203266834e1bdcbb2b49ee343e87e466e01511bd98a68792249d34f0e9050c7d71b90db3848e1c90d9f11bd8a48db82e3
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2018 Aaron Beckerman
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,57 @@
1
+ = \Classnamer
2
+
3
+ Classnamer randomly generates tongue-in-cheek class names suitable for
4
+ enterprise-friendly object-oriented programming languages like C++ and Java. It
5
+ includes a library and a command-line program.
6
+
7
+ This code is packaged as a RubyGem and tested on the following branches of
8
+ MRI (Matz's Ruby Interpreter): 1.8.7, 1.9.3, 2.0.0, 2.1.x, and 2.2.x.
9
+
10
+
11
+ == Using the command-line program
12
+
13
+ $ classnamer
14
+ PrioritizedUploadWrapper
15
+
16
+
17
+ == Using in Ruby code
18
+
19
+ You can generate a random class name like this:
20
+
21
+ require 'classnamer'
22
+ puts Classnamer.generate # => PrioritizedUploadWrapper
23
+
24
+ You can customize how class names are generated. Classnamer will generate
25
+ random class names by concatenating randomly-selected elements of arrays that
26
+ you provide.
27
+
28
+ puts Classnamer.generate([%w{Foo Bar}, %w{Baz Qux}]) # => FooQux
29
+
30
+ You can also specify a custom random number generator. Maybe you don't even
31
+ want it to be random.
32
+
33
+ puts Classnamer.generate([%w{Foo Bar}, %w{Baz Qux}], lambda { |_| 0 })
34
+ # => FooBaz
35
+
36
+ If you plan to use the same customizations multiple times, you can create
37
+ a Classnamer::Generator object for that.
38
+
39
+ generator = Classnamer::Generator.new([%w{Foo Bar}, %w{Baz Qux}])
40
+ generator.generate # => FooQux
41
+ generator.generate # => BarQux
42
+
43
+
44
+ == Author
45
+
46
+ This was written by Aaron Beckerman.
47
+
48
+
49
+ == Acknowledgements
50
+
51
+ Thanks to Luiz Signorelli and Marta Paciorkowska for their suggestions.
52
+
53
+
54
+ == Copyright
55
+
56
+ This code is distributed under the MIT License (also known as the Expat
57
+ License). See the LICENSE.txt file for details.
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'classnamer'
5
+
6
+ OptionParser.new do |opts|
7
+ opts.banner = 'Usage: classnamer [options]'
8
+
9
+ opts.on_tail '-v', '--version', 'Show version number' do
10
+ puts Classnamer::VERSION
11
+ exit
12
+ end
13
+
14
+ opts.on_tail '-h', '--help', 'Show this message' do
15
+ puts opts
16
+ exit
17
+ end
18
+ end.parse!
19
+
20
+ puts Classnamer.generate
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "classnamer"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "classnamer"
8
+ s.version = Classnamer::VERSION
9
+ s.author = "Aaron Beckerman"
10
+ s.summary = %q{A random class name generator.}
11
+ s.description = %q{Classnamer randomly generates tongue-in-cheek class names suitable for enterprise-friendly object-oriented programming languages like C++ and Java. It includes a library and a command-line program.}
12
+ s.license = "MIT"
13
+ s.platform = Gem::Platform::RUBY
14
+ s.required_ruby_version = ">= 1.8.7"
15
+ s.bindir = "bin"
16
+ s.files = ["LICENSE.txt", "README.rdoc", "bin/classnamer", "classnamer.gemspec", "lib/classnamer.rb", "test/classnamer_test.rb"]
17
+ s.test_files = ["test/classnamer_test.rb"]
18
+ s.executables = ["classnamer"]
19
+ s.require_paths = ["lib"]
20
+ end
@@ -0,0 +1,70 @@
1
+ # This module randomly generates class names, such as
2
+ # "PrioritizedUploadWrapper". It does this by concatenating several parts
3
+ # ("Prioritized", "Upload", and "Wrapper", in this case), which are strings
4
+ # randomly selected from arrays of candidates. ("Prioritized", "Upload", and
5
+ # "Wrapper" were each selected from a different array.) An array of such arrays
6
+ # is called a part candidate matrix.
7
+ module Classnamer
8
+
9
+ # The library's version string.
10
+ VERSION = '3.0.8'
11
+
12
+ # The default part candidate matrix, used by generate.
13
+ PART_CANDIDATE_MATRIX = [
14
+ %w{Threadsafe Optimized Stable Automatic Abstract Serializable Writable
15
+ Readable Blocking Nonblocking Scriptable Smart Basic Remote Simple
16
+ Secure Cryptographic Flexible Configurable Internal Cloneable Legacy
17
+ Recursive Multiple Threaded Virtual Singleton Stateless Stateful
18
+ Localized Prioritized Generic Dynamic Shared Modal Fast Temporary},
19
+ %w{Byte Task Object Resource Mutex Memory List Node File Lock Pixel
20
+ Character Command Client Server Socket Thread Notification Keystroke
21
+ Timestamp Raster String Hash Integer Cache Scrollbar Grid Package
22
+ Connection Database Graph Row Column Record Metadata Transaction Message
23
+ Request Response Query Statement Result Upload Download User Directory
24
+ Button Device Search Lolcat Robot},
25
+ %w{Sorter Allocator Tokenizer Writer Reader Randomizer Initializer Factory
26
+ Panel Frame Container Compressor Expander Counter Collector Collection
27
+ Wrapper Accumulator Table Marshaller Demarshaller Extractor Parser
28
+ Scanner Interpreter Validator Window Dialog Stream Listener Event
29
+ Exception Vector Lexer Analyzer Iterator Set Tree Concatenator Monitor
30
+ Tester Buffer Selector Visitor Adapter Helper Annotation Permission
31
+ Info Action Channel Filter Manager Mediator Operation Context Queue
32
+ Stack View Engine Publisher Subscriber Delegator State Processor Handler
33
+ Generator Dispatcher Bundle Builder Logger Iterator Observer Encoder
34
+ Decoder Importer Exporter Util Policy Preference Formatter Sequence
35
+ Comparator Definition Timer Classifier Controller Loader Converter
36
+ Constraint Module Migrator Descriptor Process}
37
+ ]
38
+
39
+ # The default index generator, used by generate.
40
+ PRNG = ::Kernel.method(:rand)
41
+
42
+ # This method does the actual work of randomly generating a class name. It
43
+ # takes two arguments, both optional: a part candidate matrix (+matrix+) and
44
+ # an index generator (+prng+). If +matrix+ is not specified, the module's
45
+ # default part candidate matrix (PART_CANDIDATE_MATRIX) is used. If +prng+ is
46
+ # not specified, Kernel::rand is used. +matrix+ must act like an array of
47
+ # arrays of strings. +prng+ must have a "call" method that takes one integer
48
+ # argument (an array length) and acts like Kernel::rand.
49
+ def self.generate(matrix = self::PART_CANDIDATE_MATRIX, prng = self::PRNG)
50
+ matrix.map { |a| a[prng.call a.length] }.join ''
51
+ end
52
+
53
+ # A class name generator that always uses the specified part candidate matrix
54
+ # and index generator.
55
+ class Generator
56
+ # Creates a class name generator with the specified part candidate matrix
57
+ # and index generator.
58
+ def initialize(matrix = Classnamer::PART_CANDIDATE_MATRIX,
59
+ prng = Classnamer::PRNG)
60
+ @matrix = matrix
61
+ @prng = prng
62
+ end
63
+
64
+ # Generates a class name using the part candidate matrix and index
65
+ # generator passed in when the object was created.
66
+ def generate
67
+ Classnamer.generate @matrix, @prng
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,73 @@
1
+ require 'classnamer'
2
+
3
+ String == Classnamer::VERSION.class or fail
4
+
5
+ 3 == Classnamer::PART_CANDIDATE_MATRIX.length or fail
6
+
7
+ Classnamer::PART_CANDIDATE_MATRIX.flatten(1).
8
+ all? { |part_candidate| /\A[A-Z]/ =~ part_candidate } or fail
9
+
10
+ Classnamer.respond_to?(:generate) or fail
11
+
12
+ String == Classnamer.generate.class or fail
13
+
14
+ '42ObjecttrueSymbolFoo' == Classnamer.generate(
15
+ [[42], [Object], [nil], [true], [:Symbol], ['Foo']]) or fail
16
+
17
+ lambda do
18
+ matrix = [%w{A B C}, [], %w{A B}, %w{A}]
19
+ prng_args = []
20
+ prng = lambda { |n|
21
+ prng_args << n
22
+ 0
23
+ }
24
+ Classnamer.generate matrix, prng
25
+ [3, 0, 2, 1] == prng_args or fail
26
+ end.call
27
+
28
+ lambda do
29
+ matrix = [%w{Foo0 Foo1 Foo2}, %w{Bar0 Bar1 Bar2}, %w{Baz0 Baz1 Baz2}]
30
+ indices = [0, 2, 1]
31
+ 'Foo0Bar2Baz1' == Classnamer.generate(matrix, lambda { |_| indices.shift }) \
32
+ or fail
33
+ end.call
34
+
35
+ 'Foo' == Classnamer.generate([['Foo']]) or fail
36
+
37
+ '' == Classnamer.generate([]) or fail
38
+
39
+ '' == Classnamer.generate([[], [], []]) or fail
40
+
41
+ begin
42
+ Classnamer.generate nil
43
+ rescue NoMethodError
44
+ else
45
+ fail
46
+ end
47
+
48
+ begin
49
+ Classnamer.generate Classnamer::PART_CANDIDATE_MATRIX, nil
50
+ rescue NoMethodError
51
+ else
52
+ fail
53
+ end
54
+
55
+ begin
56
+ Classnamer.generate [['Foo'], nil]
57
+ rescue NoMethodError
58
+ else
59
+ fail
60
+ end
61
+
62
+ Classnamer::Generator == Classnamer::Generator.new.class or fail
63
+
64
+ Classnamer::Generator.new.respond_to?(:generate) or fail
65
+
66
+ lambda do
67
+ matrix = [%w{Foo0 Foo1 Foo2}, %w{Bar0 Bar1 Bar2}, %w{Baz0 Baz1 Baz2}]
68
+ indices = [0, 2, 1]
69
+ generator = Classnamer::Generator.new(matrix, lambda { |_| indices.shift })
70
+ 'Foo0Bar2Baz1' == generator.generate or fail
71
+ end.call
72
+
73
+ puts 'Test finished.'
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: classnamer
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.8
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Beckerman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-05-28 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Classnamer randomly generates tongue-in-cheek class names suitable for
14
+ enterprise-friendly object-oriented programming languages like C++ and Java. It
15
+ includes a library and a command-line program.
16
+ email:
17
+ executables:
18
+ - classnamer
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - LICENSE.txt
23
+ - README.rdoc
24
+ - bin/classnamer
25
+ - classnamer.gemspec
26
+ - lib/classnamer.rb
27
+ - test/classnamer_test.rb
28
+ homepage:
29
+ licenses:
30
+ - MIT
31
+ metadata: {}
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.7
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 2.7.6
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: A random class name generator.
52
+ test_files:
53
+ - test/classnamer_test.rb