confire 0.0.3 → 0.1.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
  SHA1:
3
- metadata.gz: 531cbc15f63040bd5b828b9be515239664278068
4
- data.tar.gz: 598f8f0a80010088f49bc902f2e1bc67da23c031
3
+ metadata.gz: e9950b1c6dfbf61bca27c372715a55215d305efe
4
+ data.tar.gz: 1061bfb24a79a379f87d7574dc6d7bbe40030d90
5
5
  SHA512:
6
- metadata.gz: 05055a5c908e3811e64cc284f227446ee8260c7d08e6cc5791022c68140a93b4b51089a28199c598e78e343e41910f106894680052e2326ee8e753e2dada5900
7
- data.tar.gz: 571fdd789bc9a4d85c7638a8177b54696ddd914deba136ca760a722713f11fb48ae24b0da4e30981315669505968b4f4d48e4dd220a15e67cb6213ca9f0e82b5
6
+ metadata.gz: 8fd5efc88879058d0d3de821b90f20bd4a68b0ef5dfdf44329da00b2e4d2fca9e1b9767ed3d2327f4874b04362aa022071635af8d52ee0b41e77b6da414d589e
7
+ data.tar.gz: a7f7a6bdc253e4ae3d2da37b74b8df65a9a37ea233d1513e09043b6991875ad9c3973fcb5bfd5dd0a1d43b3db923c6e6132a3b3efc915207383ca1a57efcd5f9
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "spec"
5
+ t.test_files = FileList['spec/**/*_spec.rb']
6
+ end
@@ -0,0 +1,66 @@
1
+ require 'yaml'
2
+ require 'log4r'
3
+ require 'confire/parser'
4
+ require 'confire/processor'
5
+ include Log4r
6
+
7
+ class Confire
8
+ class Main
9
+ def initialize(options = {})
10
+ # setup configs
11
+ #config = YAML::load_file(File.join(__dir__, 'config.yml'))
12
+ config = YAML::load_file('config.yml')
13
+ filename = config['filename']
14
+ lines_per_test_case = config['lines_per_test_case']
15
+
16
+ # setup logger
17
+ log_name = options[:log_name] || 'application'
18
+ logger = Logger.new log_name
19
+ log_level = 0
20
+ case config['log_level'].to_sym
21
+ when :debug
22
+ log_level = Log4r::DEBUG
23
+ when :info
24
+ log_level = Log4r::INFO
25
+ when :warn
26
+ log_level = Log4r::WARN
27
+ when :error
28
+ log_level = Log4r::ERROR
29
+ when :fatal
30
+ log_level = Log4r::FATAL
31
+ else
32
+ log_level = 0
33
+ end if config['log_level']
34
+ logger.level = log_level
35
+ logger.outputters = Outputter.stdout
36
+ @logger = logger
37
+
38
+ # setup parser
39
+ @parser = Parser.new(
40
+ filename: filename,
41
+ lines_per_test_case: lines_per_test_case,
42
+ logger: logger
43
+ )
44
+
45
+ # setup processor that will do all the work
46
+ @processor = Processor.new(
47
+ logger: logger,
48
+ custom_processor: options[:custom_processor]
49
+ )
50
+ end
51
+
52
+ def run
53
+ block_processor = ->(line_buffer, test_number) do
54
+ processed_block = @processor.process_block line_buffer, test_number
55
+ puts "Case ##{test_number}: #{processed_block}"
56
+ end
57
+
58
+ line_processor = ->(line) do
59
+ @processor.process_line line
60
+ end
61
+
62
+ @parser.parse block_processor, line_processor
63
+ end
64
+ end
65
+ end
66
+
@@ -0,0 +1,54 @@
1
+ class Confire
2
+ # Parses the google test case
3
+ class Parser
4
+ attr_accessor :filename, :lines_per_test_case
5
+
6
+ # Remember to set:
7
+ # filename to read (will blow a ArgumentError if not set)
8
+ # lines_per_test_case
9
+ def initialize(options = {})
10
+ @filename = options[:filename]
11
+ @lines_per_test_case = options[:lines_per_test_case] || 1
12
+ @logger = options[:logger]
13
+ end
14
+
15
+ # This will read a given test case and pass that into the test_case_processor.
16
+ # A test case is defined as the number of lines_per_test_case
17
+ # Can optionally pass in a line_processor that will process a line before adding it to the buffer.
18
+ # Will stop reading after we hit the number of test cases defined in the file
19
+ # Assumption: Number of test cases is defined in the first line
20
+ def parse(test_case_processor, line_processor = nil)
21
+ (raise ArgumentError.new('Missing input filename to parse')) unless @filename
22
+ line_counter = -1
23
+ test_cases_read = 0
24
+
25
+ test_cases = 0
26
+ line_buffer = []
27
+
28
+ IO.foreach(@filename) do |line|
29
+ line.strip!
30
+ # read number of cases
31
+ if line_counter == -1
32
+ test_cases = line.to_i
33
+ # if unable to parse or we get 0, blow up
34
+ raise ArgumentError.new('Missing number of test cases on first line') if test_cases == 0
35
+ line_counter = 0
36
+ # process the test case
37
+ elsif line_counter == (lines_per_test_case - 1)
38
+ line = line_processor.call(line) if line_processor
39
+ line_buffer << line
40
+ test_cases_read += 1
41
+ test_case_processor.call(line_buffer, test_cases_read)
42
+ line_buffer = []
43
+ line_counter = 0
44
+ return if test_cases_read == test_cases
45
+ # keep reading
46
+ else
47
+ line = line_processor.call(line) if line_processor
48
+ line_buffer << line
49
+ line_counter += 1
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ class Confire
2
+ # This is where the main bits are processed
3
+ # We can process lines and blocks here
4
+ class Processor
5
+ attr_accessor :logger, :custom_processor
6
+
7
+ def initialize(options = {})
8
+ @logger = options[:logger]
9
+ @custom_processor = options[:custom_processor]
10
+ @custom_processor.logger = @logger if @custom_processor
11
+ end
12
+
13
+ # Will process a test case.
14
+ # Just return whatever we want to print out as results.
15
+ # line_buffer: an array of inputs. each line read is an element in the array
16
+ # test_number: the current test case number we are working on. probably won't need this value
17
+ def process_block(line_buffer, test_number)
18
+ if (@custom_processor && @custom_processor.class.method_defined?(:process_testcase))
19
+ @custom_processor.process_testcase line_buffer
20
+ else
21
+ line_buffer
22
+ end
23
+ end
24
+
25
+ # Process the line
26
+ # Each of these lines get stored as an element in the line_buffer array
27
+ # line: the line the process
28
+ def process_line(line)
29
+ if (@custom_processor && @custom_processor.class.method_defined?(:process_line))
30
+ @custom_processor.process_line line
31
+ else
32
+ line.split ' '
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,29 +1,31 @@
1
- class ProjectCreator
2
- def create(project_name)
3
- # make dir with that project_name
4
- Dir.mkdir project_name
1
+ class Confire
2
+ class ProjectCreator
3
+ def create(project_name)
4
+ # make dir with that project_name
5
+ Dir.mkdir project_name
5
6
 
6
- # copy files in
7
- FileUtils.cp(filename_with_path('lib/confire/templates/config.yml'), project_name)
8
- FileUtils.cp(filename_with_path('lib/confire/templates/Gemfile'), project_name)
9
- FileUtils.cp(filename_with_path('lib/confire/templates/main.rb'), project_name)
10
- FileUtils.cp(filename_with_path('lib/confire/templates/Rakefile'), project_name)
11
- FileUtils.cp(filename_with_path('lib/confire/templates/processor.rb'), project_name)
12
- FileUtils.cp_r(filename_with_path('lib/confire/templates/spec'), project_name)
13
- FileUtils.cp(filename_with_path('lib/confire/templates/parser.rb'), project_name)
14
- FileUtils.cp(filename_with_path('lib/confire/templates/run.sh'), project_name)
15
- FileUtils.cp(filename_with_path('lib/confire/templates/input_sample.txt'), project_name)
16
- #copy_and_rename project_name, 'lib/confire/templates/config_sample.yml', 'config_sample.yml', 'config.yml'
17
- #copy_and_rename project_name, 'lib/confire/templates/processor.rb', 'config_sample.yml', 'config.yml'
18
- end
7
+ # copy files in
8
+ FileUtils.cp(filename_with_path('lib/confire/templates/config.yml'), project_name)
9
+ FileUtils.cp(filename_with_path('lib/confire/templates/Gemfile'), project_name)
10
+ FileUtils.cp(filename_with_path('lib/confire/templates/Rakefile'), project_name)
11
+ FileUtils.cp(filename_with_path('lib/confire/templates/driver.rb'), project_name)
12
+ FileUtils.cp(filename_with_path('lib/confire/templates/custom_processor.rb'), project_name)
13
+ FileUtils.cp_r(filename_with_path('lib/confire/templates/spec'), project_name)
14
+ FileUtils.cp(filename_with_path('lib/confire/templates/run.sh'), project_name)
15
+ FileUtils.cp(filename_with_path('lib/confire/templates/input_sample.txt'), project_name)
19
16
 
20
- protected
21
- def filename_with_path(filename)
22
- File.join(Confire.root, filename)
23
- end
17
+ #copy_and_rename project_name, 'lib/confire/templates/config_sample.yml', 'config_sample.yml', 'config.yml'
18
+ #copy_and_rename project_name, 'lib/confire/templates/processor.rb', 'config_sample.yml', 'config.yml'
19
+ end
20
+
21
+ protected
22
+ def filename_with_path(filename)
23
+ File.join(Confire.root, filename)
24
+ end
24
25
 
25
- def copy_and_rename(project_name, source, oldname, newname)
26
- FileUtils.cp(source, project_name)
27
- FileUtils.mv(File.join(project_name, oldname), File.join(project_name, newname))
26
+ def copy_and_rename(project_name, source, oldname, newname)
27
+ FileUtils.cp(source, project_name)
28
+ FileUtils.mv(File.join(project_name, oldname), File.join(project_name, newname))
29
+ end
28
30
  end
29
31
  end
@@ -7,4 +7,5 @@ gem 'pry', '~> 0.9.0'
7
7
  gem 'pry-debugger', '~> 0.2.2'
8
8
  gem 'pry-rails', '~> 0.3.2'
9
9
  gem 'pry-stack_explorer', '~> 0.4.9.1'
10
+ gem 'confire'
10
11
 
@@ -1,3 +1,5 @@
1
1
  filename: input_sample.txt
2
2
  lines_per_test_case: 2
3
- log_level: 0
3
+
4
+ log_level: 'debug'
5
+ log_name: 'application'
@@ -0,0 +1,41 @@
1
+ require 'pry'
2
+ class CustomProcessor
3
+ # Logger setup in config.yml
4
+ attr_accessor :logger
5
+
6
+ # Gets passed in a buffer (array) of lines.
7
+ # Given an input with two lines
8
+ # -------
9
+ # 5 5 23
10
+ # 3 1 1
11
+ # 1 2 3
12
+ # 4 5 6
13
+ # -------
14
+ #
15
+ # For example:
16
+ # If each test case was 2 lines long the first invocation would have the input:
17
+ # ['5 5 23', '3 1 1']
18
+ # and the second would be:
19
+ # ['1 2 3', '4 5 6']
20
+ #
21
+ # For another example:
22
+ # This method takes buffers up what is returned from process_line.
23
+ # So if process_line creates an array by using line.split ' ', you will get an array of arrays.
24
+ # First invocation:
25
+ # [["5", "5", "23"], ["3", "1", "1"]]
26
+ # Second invocation:
27
+ # [["1", "2", "3"], ["4", "5", "6"]]
28
+ def process_testcase(line_buffer)
29
+ line_buffer
30
+ end
31
+
32
+ # Processing that can be done per each line. Whatever this returns gets stored as a line in the
33
+ # array of arrays described in the process_testcase method.
34
+ # For example:
35
+ # method input: '5 5 23'
36
+ # method implementation: line.split ' '
37
+ # method output: ["5", "5", "23"]
38
+ def process_line(line)
39
+ line.split ' '
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ require 'confire/main'
2
+ require_relative 'custom_processor'
3
+
4
+ options = {
5
+ custom_processor: CustomProcessor.new
6
+ }
7
+ Confire::Main.new(options).run
@@ -1,3 +1,3 @@
1
1
  #!/bin/bash
2
2
 
3
- bundle exec ruby main.rb
3
+ bundle exec ruby driver.rb
@@ -0,0 +1,29 @@
1
+ require "minitest/autorun"
2
+ require_relative '../custom_processor'
3
+
4
+ describe CustomProcessor do
5
+ before do
6
+ @processor = CustomProcessor.new
7
+ end
8
+
9
+ describe "when asked to process a test case" do
10
+ it "must process it" do
11
+ line_buffer = [["5", "5", "23"], ["3", "1", "1"]]
12
+ expected = [["5", "5", "23"], ["3", "1", "1"]]
13
+
14
+ actual = @processor.process_testcase line_buffer
15
+ actual.must_equal expected
16
+ end
17
+ end
18
+
19
+ describe "when asked to process a line" do
20
+ it "must process it" do
21
+ line = "5 5 23"
22
+ expected = ["5", "5", "23"]
23
+
24
+ actual = @processor.process_line line
25
+ actual.must_equal expected
26
+ end
27
+ end
28
+ end
29
+
data/lib/confire.rb CHANGED
@@ -1,4 +1,4 @@
1
- require_relative 'confire/project_creator'
1
+ require "confire/project_creator"
2
2
  class Confire
3
3
  def initialize(project_name)
4
4
  project_creator = ProjectCreator.new
@@ -1,9 +1,9 @@
1
1
  require "minitest/autorun"
2
- require_relative '../processor'
2
+ require 'confire/processor'
3
3
 
4
- describe Processor do
4
+ describe Confire::Processor do
5
5
  before do
6
- @processor = Processor.new
6
+ @processor = Confire::Processor.new
7
7
  end
8
8
 
9
9
  describe "when asked to process a test case" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: confire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Keam
@@ -17,18 +17,22 @@ executables:
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - Rakefile
20
21
  - bin/confire
21
22
  - lib/confire.rb
23
+ - lib/confire/main.rb
24
+ - lib/confire/parser.rb
25
+ - lib/confire/processor.rb
22
26
  - lib/confire/project_creator.rb
23
27
  - lib/confire/templates/Gemfile
24
28
  - lib/confire/templates/Rakefile
25
29
  - lib/confire/templates/config.yml
30
+ - lib/confire/templates/custom_processor.rb
31
+ - lib/confire/templates/driver.rb
26
32
  - lib/confire/templates/input_sample.txt
27
- - lib/confire/templates/main.rb
28
- - lib/confire/templates/parser.rb
29
- - lib/confire/templates/processor.rb
30
33
  - lib/confire/templates/run.sh
31
- - lib/confire/templates/spec/processor_spec.rb
34
+ - lib/confire/templates/spec/custom_processor_spec.rb
35
+ - spec/processor_spec.rb
32
36
  homepage: https://github.com/jkeam/confire
33
37
  licenses:
34
38
  - MIT
@@ -1,44 +0,0 @@
1
- require 'yaml'
2
- require 'log4r'
3
- require_relative 'parser'
4
- require_relative 'processor'
5
- include Log4r
6
-
7
- class Main
8
- def initialize
9
- # setup configs
10
- config = YAML::load_file(File.join(__dir__, 'config.yml'))
11
- filename = config['filename']
12
- lines_per_test_case = config['lines_per_test_case']
13
-
14
- # setup parser
15
- @parser = Parser.new(
16
- filename: filename,
17
- lines_per_test_case: lines_per_test_case
18
- )
19
-
20
- # setup logger
21
- logger = Logger.new 'application_logger'
22
- logger.outputters = Outputter.stdout
23
- logger.level = config['log_level']
24
- @logger = logger
25
-
26
- # setup processor that will do all the work
27
- @processor = Processor.new
28
- end
29
-
30
- def run
31
- block_processor = ->(line_buffer, test_number) do
32
- processed_block = @processor.process_block line_buffer, test_number
33
- puts "#{test_number}: #{processed_block}"
34
- end
35
-
36
- line_processor = ->(line) do
37
- @processor.process_line line
38
- end
39
-
40
- @parser.parse block_processor, line_processor
41
- end
42
- end
43
-
44
- Main.new.run
@@ -1,51 +0,0 @@
1
- # Parses the google test case
2
- class Parser
3
- attr_accessor :filename, :lines_per_test_case
4
-
5
- # Remember to set:
6
- # filename to read (will blow a ArgumentError if not set)
7
- # lines_per_test_case
8
- def initialize(options = {})
9
- @filename = options[:filename]
10
- @lines_per_test_case = options[:lines_per_test_case] || 1
11
- end
12
-
13
- # This will read a given test case and pass that into the test_case_processor.
14
- # A test case is defined as the number of lines_per_test_case
15
- # Can optionally pass in a line_processor that will process a line before adding it to the buffer.
16
- # Will stop reading after we hit the number of test cases defined in the file
17
- # Assumption: Number of test cases is defined in the first line
18
- def parse(test_case_processor, line_processor = nil)
19
- (raise ArgumentError.new('Missing input filename to parse')) unless @filename
20
- line_counter = -1
21
- test_cases_read = 0
22
-
23
- test_cases = 0
24
- line_buffer = []
25
-
26
- IO.foreach(@filename) do |line|
27
- line.strip!
28
- # read number of cases
29
- if line_counter == -1
30
- test_cases = line.to_i
31
- # if unable to parse or we get 0, blow up
32
- raise ArgumentError.new('Missing number of test cases on first line') if test_cases == 0
33
- line_counter = 0
34
- # process the test case
35
- elsif line_counter == (lines_per_test_case - 1)
36
- line = line_processor.call(line) if line_processor
37
- line_buffer << line
38
- test_cases_read += 1
39
- test_case_processor.call(line_buffer, test_cases_read)
40
- line_buffer = []
41
- line_counter = 0
42
- return if test_cases_read == test_cases
43
- # keep reading
44
- else
45
- line = line_processor.call(line) if line_processor
46
- line_buffer << line
47
- line_counter += 1
48
- end
49
- end
50
- end
51
- end
@@ -1,13 +0,0 @@
1
- # This is where the main bits are processed
2
- # We can process lines and blocks here
3
- class Processor
4
- # Will process a test case. simply return whatever we want to print out as results
5
- def process_block(line_buffer, test_number)
6
- line_buffer
7
- end
8
-
9
- # Process the line to be stored in the line_buffer
10
- def process_line(line)
11
- line.split ' '
12
- end
13
- end