Browse Source

New class and command for extracting markers

master
Peter J. Jones 7 years ago
parent
commit
b686dfb0a3

+ 16
- 0
Rakefile View File

@@ -0,0 +1,16 @@
################################################################################
require('rake/testtask')

################################################################################
Rake::TestTask.new do |t|
t.ruby_opts = ['-rubygems']
t.pattern = 'test/*_test.rb'
t.verbose = true
end

################################################################################
desc("Build a gem")
task(:gem) {system('gem', 'build', 'edify.gemspec')}

################################################################################
task(:default => :test)

+ 31
- 0
commands/marker.rb View File

@@ -0,0 +1,31 @@
class Marker < Edify::Command

##############################################################################
description('Output text in a file between markers')

##############################################################################
def run
parse_command_line do |p|
p.banner = 'Usage: edify marker [options] file'

p.on('-n', '--name=MARKER', 'Only output MARKER') do |n|
@options.marker_name = n
end

p.on('-l', '--list', 'List available markers') do |l|
@options.marker_list = l
end
end

raise("please give one file name") unless @argv.size == 1
m = Edify::Marker.new(@argv.first)

if @options.marker_list
$stdout.puts(m.markers.join("\n"))
elsif @options.marker_name
$stdout.puts(m.text_inside_marker(@options.marker_name))
else
$stdout.puts(m.text_without_markers)
end
end
end

+ 4
- 1
lib/edify.rb View File

@@ -1,5 +1,7 @@
################################################################################
module Edify; end
module Edify
class Error < Exception; end
end

################################################################################
require('ostruct')
@@ -13,3 +15,4 @@ require('json')
################################################################################
require('edify/version')
require('edify/command')
require('edify/marker')

+ 80
- 0
lib/edify/marker.rb View File

@@ -0,0 +1,80 @@
class Edify::Marker

##############################################################################
class Error < Edify::Error; end

##############################################################################
BEGIN_MARKER = %r/\s*\{BEGIN:\s*([\w-]+)\s*\}/
END_MARKER = %r/\s*\{END\}/

##############################################################################
def initialize (file)
@file = file
@lines = File.readlines(@file)
@markers = parse
end

##############################################################################
def markers
@markers.keys.select {|k| k.is_a?(String)}.sort
end

##############################################################################
def text_inside_marker (marker)
@markers[marker].join
end

##############################################################################
def text_without_markers
@markers[:all].join
end

##############################################################################
private

##############################################################################
class Mark

############################################################################
attr_accessor(:name, :text)

############################################################################
def initialize (name)
@name = name
@text = []
end

############################################################################
def << (line)
@text << line
end
end

##############################################################################
def parse
stack = [Mark.new(:all)]

markers = @lines.inject({}) do |collector, line|
if m = line.match(BEGIN_MARKER)
stack << Mark.new(m[1])
elsif line.match(END_MARKER)
raise('too many end markers') unless stack.size > 1
mark = stack.pop
collector[mark.name] = mark.text
else
stack.each {|m| m << line}
end

collector
end

raise("missing end for #{stack.last.name} marker") unless stack.size == 1
markers[stack.last.name] = stack.last.text
markers
end

##############################################################################
def raise (message)
super(Edify::Marker::Error, message + " in #{@file}")
end
end

+ 2
- 0
test/data/marker_error_01.txt View File

@@ -0,0 +1,2 @@
This file should fail because of too many END markers
{END}

+ 2
- 0
test/data/marker_error_02.txt View File

@@ -0,0 +1,2 @@
This file should fail because not enough END markers
{BEGIN: foo}

+ 6
- 0
test/data/marker_good_01.A.txt View File

@@ -0,0 +1,6 @@
the reading of them. All needless matters have been eliminated, so
that a history almost at variance with the possibilities of latter-day
belief may stand forth as simple fact. There is throughout no
statement of past things wherein memory may err, for all the records
chosen are exactly contemporary, given from the standpoints and within
the range of knowledge of those who made them.

+ 2
- 0
test/data/marker_good_01.B.txt View File

@@ -0,0 +1,2 @@
belief may stand forth as simple fact. There is throughout no
statement of past things wherein memory may err, for all the records

+ 7
- 0
test/data/marker_good_01.all.txt View File

@@ -0,0 +1,7 @@
How these papers have been placed in sequence will be made manifest in
the reading of them. All needless matters have been eliminated, so
that a history almost at variance with the possibilities of latter-day
belief may stand forth as simple fact. There is throughout no
statement of past things wherein memory may err, for all the records
chosen are exactly contemporary, given from the standpoints and within
the range of knowledge of those who made them.

+ 11
- 0
test/data/marker_good_01.txt View File

@@ -0,0 +1,11 @@
How these papers have been placed in sequence will be made manifest in
{BEGIN: A}
the reading of them. All needless matters have been eliminated, so
that a history almost at variance with the possibilities of latter-day
{BEGIN: B}
belief may stand forth as simple fact. There is throughout no
statement of past things wherein memory may err, for all the records
{END}
chosen are exactly contemporary, given from the standpoints and within
the range of knowledge of those who made them.
{END}

+ 23
- 0
test/helper.rb View File

@@ -0,0 +1,23 @@
################################################################################
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
require('edify')

################################################################################
require('test/unit')

################################################################################
module EdifyTestHelpers

##############################################################################
DATA_DIR = File.expand_path('data', File.dirname(__FILE__))

##############################################################################
def data_file_path (name)
File.join(DATA_DIR, name)
end

##############################################################################
def data_file_read (name)
File.read(data_file_path(name))
end
end

+ 35
- 0
test/marker_test.rb View File

@@ -0,0 +1,35 @@
################################################################################
require(File.expand_path('helper', File.dirname(__FILE__)))

################################################################################
class MarkerTest < Test::Unit::TestCase

##############################################################################
include(EdifyTestHelpers)

##############################################################################
def test_expected_markers_and_content
m = Edify::Marker.new(data_file_path('marker_good_01.txt'))
assert_equal(%w(A B), m.markers)

assert_equal(data_file_read('marker_good_01.all.txt'),
m.text_without_markers)

m.markers.each do |marker|
text = data_file_read("marker_good_01.#{marker}.txt")
assert_equal(text, m.text_inside_marker(marker))
end
end

##############################################################################
def test_expected_failures
files = %w(marker_error_01.txt marker_error_02.txt)
assert(!files.empty?)

files.each do |file|
assert_raises(Edify::Marker::Error) do
Edify::Marker.new(data_file_path(file))
end
end
end
end

Loading…
Cancel
Save