wagon 0.10.5 → 1.0.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.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/wagon +145 -145
- data/gui/Rakefile +5 -0
- data/gui/build.xml +74 -0
- data/gui/build/classes/.netbeans_automatic_build +0 -0
- data/gui/build/classes/org/rubyforge/rawr/Main.class +0 -0
- data/gui/build_configuration.rb +31 -0
- data/gui/icons/monkeybars.icns +0 -0
- data/gui/icons/monkeybars.ico +0 -0
- data/gui/lib/java/jruby-complete.jar +0 -0
- data/gui/lib/java/monkeybars-1.0.4.jar +0 -0
- data/gui/lib/ruby/README.txt +1 -0
- data/gui/manifest.mf +3 -0
- data/gui/nbproject/build-impl.xml +794 -0
- data/gui/nbproject/genfiles.properties +8 -0
- data/gui/nbproject/private/private.properties +3 -0
- data/gui/nbproject/project.properties +67 -0
- data/gui/nbproject/project.xml +13 -0
- data/gui/src/application_controller.rb +4 -0
- data/gui/src/application_view.rb +3 -0
- data/gui/src/main.rb +52 -0
- data/gui/src/manifest.rb +58 -0
- data/gui/src/org/rubyforge/rawr/Main.java +67 -0
- data/gui/src/resolver.rb +33 -0
- data/gui/tasks/monkeybars.rake +89 -0
- data/lib/wagon.rb +12 -10
- data/lib/wagon/address.rb +39 -39
- data/lib/wagon/connection.rb +73 -107
- data/lib/wagon/directory.rb +78 -78
- data/lib/wagon/household.rb +59 -74
- data/lib/wagon/member.rb +10 -10
- data/lib/wagon/page.rb +30 -31
- data/lib/wagon/phone_number.rb +22 -22
- data/lib/wagon/ward.rb +28 -28
- data/spec/wagon/directory_spec.rb +22 -22
- data/spec/wagon/ward_spec.rb +18 -18
- metadata +35 -2
@@ -0,0 +1,8 @@
|
|
1
|
+
build.xml.data.CRC32=47afb14d
|
2
|
+
build.xml.script.CRC32=21ac335f
|
3
|
+
build.xml.stylesheet.CRC32=958a1d3e@1.32.1.45
|
4
|
+
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
5
|
+
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
6
|
+
nbproject/build-impl.xml.data.CRC32=47afb14d
|
7
|
+
nbproject/build-impl.xml.script.CRC32=3d0a5dd7
|
8
|
+
nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45
|
@@ -0,0 +1,67 @@
|
|
1
|
+
build.classes.dir=${build.dir}/classes
|
2
|
+
build.classes.excludes=**/*.java,**/*.form
|
3
|
+
# This directory is removed when the project is cleaned:
|
4
|
+
build.dir=build
|
5
|
+
build.generated.dir=${build.dir}/generated
|
6
|
+
build.generated.sources.dir=${build.dir}/generated-sources
|
7
|
+
# Only compile against the classpath explicitly listed here:
|
8
|
+
build.sysclasspath=ignore
|
9
|
+
build.test.classes.dir=${build.dir}/test/classes
|
10
|
+
build.test.results.dir=${build.dir}/test/results
|
11
|
+
# Uncomment to specify the preferred debugger connection transport:
|
12
|
+
#debug.transport=dt_socket
|
13
|
+
debug.classpath=\
|
14
|
+
${run.classpath}
|
15
|
+
debug.test.classpath=\
|
16
|
+
${run.test.classpath}
|
17
|
+
# This directory is removed when the project is cleaned:
|
18
|
+
dist.dir=dist
|
19
|
+
dist.jar=${dist.dir}/Wagon.jar
|
20
|
+
dist.javadoc.dir=${dist.dir}/javadoc
|
21
|
+
excludes=
|
22
|
+
file.reference.gui-src=src
|
23
|
+
file.reference.jruby-complete.jar=lib\\java\\jruby-complete.jar
|
24
|
+
file.reference.monkeybars-1.0.4.jar=lib\\java\\monkeybars-1.0.4.jar
|
25
|
+
includes=**
|
26
|
+
jar.compress=false
|
27
|
+
javac.classpath=\
|
28
|
+
${file.reference.jruby-complete.jar}:\
|
29
|
+
${file.reference.monkeybars-1.0.4.jar}
|
30
|
+
# Space-separated list of extra javac options
|
31
|
+
javac.compilerargs=
|
32
|
+
javac.deprecation=false
|
33
|
+
javac.source=1.5
|
34
|
+
javac.target=1.5
|
35
|
+
javac.test.classpath=\
|
36
|
+
${javac.classpath}:\
|
37
|
+
${build.classes.dir}:\
|
38
|
+
${libs.junit.classpath}:\
|
39
|
+
${libs.junit_4.classpath}
|
40
|
+
javadoc.additionalparam=
|
41
|
+
javadoc.author=false
|
42
|
+
javadoc.encoding=${source.encoding}
|
43
|
+
javadoc.noindex=false
|
44
|
+
javadoc.nonavbar=false
|
45
|
+
javadoc.notree=false
|
46
|
+
javadoc.private=false
|
47
|
+
javadoc.splitindex=true
|
48
|
+
javadoc.use=true
|
49
|
+
javadoc.version=false
|
50
|
+
javadoc.windowtitle=
|
51
|
+
jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api"
|
52
|
+
main.class=org.rubyforge.rawr.Main
|
53
|
+
manifest.file=manifest.mf
|
54
|
+
meta.inf.dir=${src.dir}/META-INF
|
55
|
+
platform.active=default_platform
|
56
|
+
run.classpath=\
|
57
|
+
${javac.classpath}:\
|
58
|
+
${build.classes.dir}
|
59
|
+
# Space-separated list of JVM arguments used when running the project
|
60
|
+
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
61
|
+
# or test-sys-prop.name=value to set system properties for unit tests):
|
62
|
+
run.jvmargs=
|
63
|
+
run.test.classpath=\
|
64
|
+
${javac.test.classpath}:\
|
65
|
+
${build.test.classes.dir}
|
66
|
+
source.encoding=UTF-8
|
67
|
+
src.dir=${file.reference.gui-src}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project xmlns="http://www.netbeans.org/ns/project/1">
|
3
|
+
<type>org.netbeans.modules.java.j2seproject</type>
|
4
|
+
<configuration>
|
5
|
+
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
6
|
+
<name>Wagon</name>
|
7
|
+
<source-roots>
|
8
|
+
<root id="src.dir"/>
|
9
|
+
</source-roots>
|
10
|
+
<test-roots/>
|
11
|
+
</data>
|
12
|
+
</configuration>
|
13
|
+
</project>
|
data/gui/src/main.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#===============================================================================
|
2
|
+
# Much of the platform specific code should be called before Swing is touched.
|
3
|
+
# The useScreenMenuBar is an example of this.
|
4
|
+
require 'rbconfig'
|
5
|
+
require 'java'
|
6
|
+
|
7
|
+
#===============================================================================
|
8
|
+
# Platform specific operations, feel free to remove or override any of these
|
9
|
+
# that don't work for your platform/application
|
10
|
+
|
11
|
+
case Config::CONFIG["host_os"]
|
12
|
+
when /darwin/i # OSX specific code
|
13
|
+
java.lang.System.set_property("apple.laf.useScreenMenuBar", "true")
|
14
|
+
when /^win|mswin/i # Windows specific code
|
15
|
+
when /linux/i # Linux specific code
|
16
|
+
end
|
17
|
+
|
18
|
+
# End of platform specific code
|
19
|
+
#===============================================================================
|
20
|
+
$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
|
21
|
+
require 'manifest'
|
22
|
+
|
23
|
+
# Set up global error handling so that it is consistantly logged or outputed
|
24
|
+
# You will probably want to replace the puts with your application's logger
|
25
|
+
def show_error_dialog_and_exit(exception, thread=nil)
|
26
|
+
puts "Error in application"
|
27
|
+
puts "#{exception.class} - #{exception}"
|
28
|
+
if exception.kind_of? Exception
|
29
|
+
puts exception.backtrace.join("\n")
|
30
|
+
else
|
31
|
+
# Workaround for JRuby issue #2673, getStackTrace returning an empty array
|
32
|
+
output_stream = java.io.ByteArrayOutputStream.new
|
33
|
+
exception.printStackTrace(java.io.PrintStream.new(output_stream))
|
34
|
+
puts output_stream.to_string
|
35
|
+
end
|
36
|
+
|
37
|
+
# Your error handling code goes here
|
38
|
+
|
39
|
+
# Show error dialog informing the user that there was an error
|
40
|
+
title = "Application Error"
|
41
|
+
message = "The application has encountered an error and must shut down."
|
42
|
+
|
43
|
+
javax.swing.JOptionPane.show_message_dialog(nil, message, title, javax.swing.JOptionPane::DEFAULT_OPTION)
|
44
|
+
java.lang.System.exit(0)
|
45
|
+
end
|
46
|
+
GlobalErrorHandler.on_error {|exception, thread| show_error_dialog_and_exit(exception, thread) }
|
47
|
+
|
48
|
+
begin
|
49
|
+
# Your application code goes here
|
50
|
+
rescue => e
|
51
|
+
show_error_dialog_and_exit(e)
|
52
|
+
end
|
data/gui/src/manifest.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
$LOAD_PATH.clear #ensure load path is cleared so system gems and libraries are not used (only project gems/libs)
|
2
|
+
# Load current and subdirectories in src onto the load path
|
3
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
4
|
+
Dir.glob(File.expand_path(File.dirname(__FILE__) + "/**/*").gsub('%20', ' ')).each do |directory|
|
5
|
+
# File.directory? is broken in current JRuby for dirs inside jars
|
6
|
+
# http://jira.codehaus.org/browse/JRUBY-2289
|
7
|
+
$LOAD_PATH << directory unless directory =~ /\.\w+$/
|
8
|
+
end
|
9
|
+
# Some JRuby $LOAD_PATH path bugs to check if you're having trouble:
|
10
|
+
# http://jira.codehaus.org/browse/JRUBY-2518 - Dir.glob and Dir[] doesn't work
|
11
|
+
# for starting in a dir in a jar
|
12
|
+
# (such as Active-Record migrations)
|
13
|
+
# http://jira.codehaus.org/browse/JRUBY-3247 - Compiled Ruby classes produce
|
14
|
+
# word substitutes for characters
|
15
|
+
# like - and . (to minus and dot).
|
16
|
+
# This is problematic with gems
|
17
|
+
# like ActiveSupport and Prawn
|
18
|
+
|
19
|
+
#===============================================================================
|
20
|
+
# Monkeybars requires, this pulls in the requisite libraries needed for
|
21
|
+
# Monkeybars to operate.
|
22
|
+
|
23
|
+
require 'resolver'
|
24
|
+
|
25
|
+
case Monkeybars::Resolver.run_location
|
26
|
+
when Monkeybars::Resolver::IN_FILE_SYSTEM
|
27
|
+
add_to_classpath '../lib/java/monkeybars-1.0.2.jar'
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'monkeybars'
|
31
|
+
require 'application_controller'
|
32
|
+
require 'application_view'
|
33
|
+
|
34
|
+
# End of Monkeybars requires
|
35
|
+
#===============================================================================
|
36
|
+
#
|
37
|
+
# Add your own application-wide libraries below. To include jars, append to
|
38
|
+
# $CLASSPATH, or use add_to_classpath, for example:
|
39
|
+
#
|
40
|
+
# $CLASSPATH << File.expand_path(File.dirname(__FILE__) + "/../lib/java/swing-layout-1.0.3.jar")
|
41
|
+
#
|
42
|
+
# is equivalent to
|
43
|
+
#
|
44
|
+
# add_to_classpath "../lib/java/swing-layout-1.0.3.jar"
|
45
|
+
#
|
46
|
+
# There is also a helper for adding to your load path and avoiding issues with file: being
|
47
|
+
# appended to the load path (useful for JRuby libs that need your jar directory on
|
48
|
+
# the load path).
|
49
|
+
#
|
50
|
+
# add_to_load_path "../lib/java"
|
51
|
+
#
|
52
|
+
|
53
|
+
case Monkeybars::Resolver.run_location
|
54
|
+
when Monkeybars::Resolver::IN_FILE_SYSTEM
|
55
|
+
# Files to be added only when running from the file system go here
|
56
|
+
when Monkeybars::Resolver::IN_JAR_FILE
|
57
|
+
# Files to be added only when run from inside a jar file
|
58
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
package org.rubyforge.rawr;
|
2
|
+
|
3
|
+
import java.io.BufferedReader;
|
4
|
+
import java.io.InputStreamReader;
|
5
|
+
import java.io.InputStream;
|
6
|
+
import java.io.IOException;
|
7
|
+
import java.net.URL;
|
8
|
+
|
9
|
+
|
10
|
+
import java.util.ArrayList;
|
11
|
+
import org.jruby.Ruby;
|
12
|
+
import org.jruby.RubyInstanceConfig;
|
13
|
+
import org.jruby.javasupport.JavaEmbedUtils;
|
14
|
+
|
15
|
+
public class Main
|
16
|
+
{
|
17
|
+
public static void main(String[] args) throws Exception
|
18
|
+
{
|
19
|
+
RubyInstanceConfig config = new RubyInstanceConfig();
|
20
|
+
config.setArgv(args);
|
21
|
+
Ruby runtime = JavaEmbedUtils.initialize(new ArrayList(0), config);
|
22
|
+
String mainRubyFile = "main";
|
23
|
+
|
24
|
+
ArrayList<String> config_data = new ArrayList<String>();
|
25
|
+
try{
|
26
|
+
java.io.InputStream ins = Main.class.getClassLoader().getResourceAsStream("run_configuration");
|
27
|
+
if (ins == null ) {
|
28
|
+
System.err.println("Did not find configuration file 'run_configuration', using defaults.");
|
29
|
+
} else {
|
30
|
+
config_data = getConfigFileContents(ins);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
catch(IOException ioe)
|
34
|
+
{
|
35
|
+
System.err.println("Error loading run configuration file 'run_configuration', using defaults: " + ioe);
|
36
|
+
}
|
37
|
+
catch(java.lang.NullPointerException npe)
|
38
|
+
{
|
39
|
+
System.err.println("Error loading run configuration file 'run_configuration', using defaults: " + npe );
|
40
|
+
}
|
41
|
+
|
42
|
+
for(String line : config_data) {
|
43
|
+
String[] parts = line.split(":");
|
44
|
+
if("main_ruby_file".equals(parts[0].replaceAll(" ", ""))) {
|
45
|
+
mainRubyFile = parts[1].replaceAll(" ", "");
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
runtime.evalScriptlet("require '" + mainRubyFile + "'");
|
50
|
+
}
|
51
|
+
|
52
|
+
public static URL getResource(String path) {
|
53
|
+
return Main.class.getClassLoader().getResource(path);
|
54
|
+
}
|
55
|
+
|
56
|
+
private static ArrayList<String> getConfigFileContents(InputStream input) throws IOException, java.lang.NullPointerException {
|
57
|
+
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
|
58
|
+
String line;
|
59
|
+
ArrayList<String> contents = new ArrayList<String>();
|
60
|
+
|
61
|
+
while ((line = reader.readLine()) != null) {
|
62
|
+
contents.add(line);
|
63
|
+
}
|
64
|
+
reader.close();
|
65
|
+
return(contents);
|
66
|
+
}
|
67
|
+
}
|
data/gui/src/resolver.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Monkeybars
|
2
|
+
class Resolver
|
3
|
+
IN_FILE_SYSTEM = :in_file_system
|
4
|
+
IN_JAR_FILE = :in_jar_file
|
5
|
+
|
6
|
+
# Returns a const value indicating if the currently executing code is being run from the file system or from within a jar file.
|
7
|
+
def self.run_location
|
8
|
+
if File.expand_path(__FILE__) =~ /\.jar\!/
|
9
|
+
IN_JAR_FILE
|
10
|
+
else
|
11
|
+
IN_FILE_SYSTEM
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Object
|
18
|
+
def add_to_classpath(path)
|
19
|
+
$CLASSPATH << get_expanded_path(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_to_load_path(path)
|
23
|
+
$LOAD_PATH << get_expanded_path(path)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def get_expanded_path(path)
|
28
|
+
resolved_path = File.expand_path(File.dirname(__FILE__) + "/" + path.gsub("\\", "/"))
|
29
|
+
resolved_path.gsub!("file:", "") unless resolved_path.index(".jar!")
|
30
|
+
resolved_path.gsub!("%20", ' ')
|
31
|
+
resolved_path
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
desc "ALL, CONTROLLER, VIEW, MODEL are valid options."
|
4
|
+
task 'generate'
|
5
|
+
rule(/^generate/) do |t|
|
6
|
+
ARGV[1..-1].each do |generator_command|
|
7
|
+
command, argument = generator_command.split("=")
|
8
|
+
case command
|
9
|
+
when "ALL"
|
10
|
+
generate_tuple(argument)
|
11
|
+
when "VIEW"
|
12
|
+
generate_view(argument)
|
13
|
+
when "CONTROLLER"
|
14
|
+
generate_controller(argument)
|
15
|
+
when "MODEL"
|
16
|
+
generate_model(argument)
|
17
|
+
else
|
18
|
+
$stdout << "Unknown generate target #{argument}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate_tuple(path)
|
24
|
+
pwd = FileUtils.pwd
|
25
|
+
generate_controller(path)
|
26
|
+
FileUtils.cd(pwd)
|
27
|
+
generate_model(path)
|
28
|
+
FileUtils.cd(pwd)
|
29
|
+
generate_view(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_controller(path)
|
33
|
+
name = setup_directory(path)
|
34
|
+
file_name = "#{name}_controller.rb"
|
35
|
+
name = camelize(name)
|
36
|
+
$stdout << "Generating controller #{name}Controller in file #{file_name}\n"
|
37
|
+
File.open(file_name, "w") do |controller_file|
|
38
|
+
controller_file << <<-ENDL
|
39
|
+
class #{name}Controller < ApplicationController
|
40
|
+
set_model '#{name}Model'
|
41
|
+
set_view '#{name}View'
|
42
|
+
set_close_action :exit
|
43
|
+
end
|
44
|
+
ENDL
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_model(path)
|
49
|
+
name = setup_directory(path)
|
50
|
+
file_name = "#{name}_model.rb"
|
51
|
+
name = camelize(name)
|
52
|
+
$stdout << "Generating model #{name}Model in file #{file_name}\n"
|
53
|
+
File.open(file_name, "w") do |model_file|
|
54
|
+
model_file << <<-ENDL
|
55
|
+
class #{name}Model
|
56
|
+
|
57
|
+
end
|
58
|
+
ENDL
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def generate_view(path)
|
63
|
+
name = setup_directory(path)
|
64
|
+
file_name = "#{name}_view.rb"
|
65
|
+
name = camelize(name)
|
66
|
+
$stdout << "Generating view #{name}View in file #{file_name}\n"
|
67
|
+
File.open(file_name, "w") do |view_file|
|
68
|
+
view_file << <<-ENDL
|
69
|
+
class #{name}View < ApplicationView
|
70
|
+
set_java_class ''
|
71
|
+
end
|
72
|
+
ENDL
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def setup_directory(path)
|
77
|
+
FileUtils.mkdir_p path.gsub("\\", "/")
|
78
|
+
FileUtils.cd(path)
|
79
|
+
path.split("/").last
|
80
|
+
end
|
81
|
+
|
82
|
+
def camelize(name, first_letter_in_uppercase = true)
|
83
|
+
name = name.to_s
|
84
|
+
if first_letter_in_uppercase
|
85
|
+
name.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
|
86
|
+
else
|
87
|
+
name[0..0] + camelize(name[1..-1])
|
88
|
+
end
|
89
|
+
end
|
data/lib/wagon.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
require 'queue_to_the_future'
|
2
|
+
|
3
|
+
module Wagon
|
4
|
+
BASE_PATH = File.join(File.dirname(__FILE__), '..')
|
5
|
+
VERSION = open(File.join(BASE_PATH, 'VERSION')).read()
|
6
|
+
|
7
|
+
def self.connect(username, password)
|
8
|
+
Connection.new(username, password)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'wagon/page'
|
11
13
|
require 'wagon/connection'
|
data/lib/wagon/address.rb
CHANGED
@@ -1,40 +1,40 @@
|
|
1
|
-
module Wagon
|
2
|
-
class Address
|
3
|
-
CITY_STATE_ZIP = %r/^(\D+), (\D+)?\s*(\d+(-\d+)?)?$/
|
4
|
-
|
5
|
-
attr_reader :city, :state, :zip, :country
|
6
|
-
|
7
|
-
def self.extract_from_string(string)
|
8
|
-
parts = string.split("\n").collect(&:strip).delete_if(&:empty?)
|
9
|
-
street = city = state = zip = country = nil
|
10
|
-
|
11
|
-
parts.delete_if do |part|
|
12
|
-
next unless part =~ CITY_STATE_ZIP
|
13
|
-
city, state, zip = $1, ($2 || '').strip(), $3; true
|
14
|
-
end
|
15
|
-
|
16
|
-
self.new(parts.shift, city, state, zip, parts.shift)
|
17
|
-
end
|
18
|
-
|
19
|
-
def initialize(street, city, state, zip, country)
|
20
|
-
@street, @city, @state, @zip, @country = street, city, state, zip, country
|
21
|
-
end
|
22
|
-
|
23
|
-
def street
|
24
|
-
#601 N. Monterey Drive Apartment K
|
25
|
-
@street.to_s.gsub(/apartment/i, 'Apt.').gsub(/drive/i, 'Dr.')
|
26
|
-
end
|
27
|
-
|
28
|
-
def to_s
|
29
|
-
[street, [[city, state].compact.join(", "), zip, country.to_s.empty? ? nil : "(#{country})"].compact.join(" ")].compact.join("\n")
|
30
|
-
end
|
31
|
-
|
32
|
-
def ==(other)
|
33
|
-
street == other.street &&
|
34
|
-
city == other.city &&
|
35
|
-
state == other.state &&
|
36
|
-
zip == other.zip &&
|
37
|
-
country == other.country
|
38
|
-
end
|
39
|
-
end
|
1
|
+
module Wagon
|
2
|
+
class Address
|
3
|
+
CITY_STATE_ZIP = %r/^(\D+), (\D+)?\s*(\d+(-\d+)?)?$/
|
4
|
+
|
5
|
+
attr_reader :city, :state, :zip, :country
|
6
|
+
|
7
|
+
def self.extract_from_string(string)
|
8
|
+
parts = string.split("\n").collect(&:strip).delete_if(&:empty?)
|
9
|
+
street = city = state = zip = country = nil
|
10
|
+
|
11
|
+
parts.delete_if do |part|
|
12
|
+
next unless part =~ CITY_STATE_ZIP
|
13
|
+
city, state, zip = $1, ($2 || '').strip(), $3; true
|
14
|
+
end
|
15
|
+
|
16
|
+
self.new(parts.shift, city, state, zip, parts.shift)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(street, city, state, zip, country)
|
20
|
+
@street, @city, @state, @zip, @country = street, city, state, zip, country
|
21
|
+
end
|
22
|
+
|
23
|
+
def street
|
24
|
+
#601 N. Monterey Drive Apartment K
|
25
|
+
@street.to_s.gsub(/apartment/i, 'Apt.').gsub(/drive/i, 'Dr.')
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
[street, [[city, state].compact.join(", "), zip, country.to_s.empty? ? nil : "(#{country})"].compact.join(" ")].compact.join("\n")
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(other)
|
33
|
+
street == other.street &&
|
34
|
+
city == other.city &&
|
35
|
+
state == other.state &&
|
36
|
+
zip == other.zip &&
|
37
|
+
country == other.country
|
38
|
+
end
|
39
|
+
end
|
40
40
|
end
|