gls_agent 0.1.1 → 0.2.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 +8 -8
- data/README.md +14 -0
- data/bin/gls_create_label +37 -31
- data/gls_agent.gemspec +1 -0
- data/lib/gls_agent/dotfile.rb +34 -0
- data/lib/gls_agent/gls_mech.rb +6 -1
- data/lib/gls_agent/version.rb +1 -1
- data/lib/gls_agent.rb +14 -0
- data/spec/gls_agent_spec.rb +41 -0
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ODI0NTc3YTlhN2NhZTcxMzcyM2QyY2NkZjg1YjY0OWUzNjI1NjgyNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTcyYmEyZWEyMjgwYTE1NjNjZGNiMjBmYzg3N2M1MThkMzUwYWJhMQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODYxMWExZGI3Y2RlZjljMDljZWZlNDIwN2Q5YWY3MjQwODM5MWNiOTQ0Y2Q2
|
10
|
+
NmM4NTUwNzIxOTE5OWE5ZTdmNDA2YWQ4YmZlNjM1ZWY2MzBjMzIyYWI0Y2Rm
|
11
|
+
ODNlNThiYTQ0OWVmNWU3YWQwZjhlYWYwYTM3ODQ2NDhhMTJlOGU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OWM3YzNmODIwMjNjYzcyMzhhM2Q5MDA5OWQwNDg0YTMxYzI4NWEwY2M1ZmUx
|
14
|
+
MDExYTI0YzUyYjMxNzczMmE2OTY2YjcxYWFiYzRmMmI4MjRiZmQzZjQwNjU3
|
15
|
+
ZDNjN2EzMDlkMTEyMzY1MDcwMWU5YzYzZWY5YTJmNzgwZTZiMjc=
|
data/README.md
CHANGED
@@ -20,6 +20,8 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
+
### Usage as standalone tool
|
24
|
+
|
23
25
|
There is a small standalone script:
|
24
26
|
|
25
27
|
$ gls_create_label -u glsuser -p glspass -d "John Doe,Home Street,1,1234,City,1" -o output.pdf
|
@@ -34,6 +36,18 @@ and
|
|
34
36
|
|
35
37
|
to play around.
|
36
38
|
|
39
|
+
### Usage as lib
|
40
|
+
|
41
|
+
To use gls_agent in your ruby project, install the gem and use something along these lines:
|
42
|
+
|
43
|
+
options = GLSAgent::Dotfile::get_opts
|
44
|
+
mech = GLSMech.new
|
45
|
+
mech.user = options[:user]
|
46
|
+
mech.pass = options[:pass]
|
47
|
+
|
48
|
+
GLSAgent::ParcelJob.new('Frank Sinatra','CloudStreet','1',1234,'HeavenCity','1')
|
49
|
+
saved_as = mech.save_parcel_label parcel,'gls_label_frank_sinatra.pdf'
|
50
|
+
|
37
51
|
## Configuration
|
38
52
|
|
39
53
|
You can invoke gls_agent without any configuration by specifying command line parameters.
|
data/bin/gls_create_label
CHANGED
@@ -2,34 +2,25 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'gls_agent'
|
5
|
-
require 'json'
|
6
5
|
|
7
6
|
options = {}
|
7
|
+
optparse = OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: gls_create_label [OPTIONS]"
|
9
|
+
|
10
|
+
opts.separator ""
|
11
|
+
opts.separator "GLS login options"
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
filecontent.gsub!(/(\w+)/, '"\1"')
|
15
|
-
filecontent.gsub!("\n", ",\n")
|
16
|
-
filecontent.chomp!("\n")
|
17
|
-
filecontent.chomp!(',')
|
18
|
-
filecontent = "{ #{filecontent} }"
|
19
|
-
begin
|
20
|
-
j_options = JSON.parse filecontent
|
21
|
-
j_options.each {|o,v| options[o.to_sym] = v}
|
22
|
-
puts "Info: read configuration parameters from ~/.gls_agent, may be overriden with cmd line options."
|
23
|
-
rescue
|
24
|
-
STDERR.puts "Error: configuration file in ~/.gls_agent found but could not be parsed."
|
25
|
-
STDERR.puts $!.inspect,$@
|
13
|
+
opts.on('-u', '--gls-user GLSUSER', 'username of GLS account.') do |u|
|
14
|
+
options[:user] = u
|
15
|
+
end
|
16
|
+
opts.on('-p', '--gls-password GLSPASSWORD', 'password of GLS account.') do |p|
|
17
|
+
options[:pass] = p
|
26
18
|
end
|
27
|
-
rescue
|
28
|
-
STDERR.puts "Info: No configuration file in ~/.gls_agent found, all options need to be specified on command line."
|
29
|
-
end
|
30
19
|
|
31
|
-
|
32
|
-
opts.
|
20
|
+
opts.separator ""
|
21
|
+
opts.separator "Label data definition"
|
22
|
+
|
23
|
+
opts.on('-l', '--label-data DATA', 'Label data, comma-separated.') do |l|
|
33
24
|
fields = l.split(',')
|
34
25
|
if fields.length != 6
|
35
26
|
STDERR.puts 'Error: label data has to be in format "John Doe,Home Street,1,1234,City,1".'
|
@@ -42,15 +33,21 @@ optparse = OptionParser.new do |opts|
|
|
42
33
|
options[:city] = fields.shift
|
43
34
|
options[:weight] = fields.shift
|
44
35
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
opts.on('-o', '--output-file FILE', 'Write output (pdf) to FILE') do |o|
|
36
|
+
|
37
|
+
opts.separator ""
|
38
|
+
opts.separator "Output options"
|
39
|
+
|
40
|
+
opts.on('-o', '--output-file FILE', 'Write output (pdf) to FILE, defaults to gls-label.pdf .') do |o|
|
52
41
|
options[:output_file] = o
|
53
42
|
end
|
43
|
+
|
44
|
+
opts.separator ""
|
45
|
+
opts.separator "General options"
|
46
|
+
|
47
|
+
opts.on_tail('--version', 'Show version.') do
|
48
|
+
puts "gls_create_label #{GLSAgent::VERSION}"
|
49
|
+
exit 0
|
50
|
+
end
|
54
51
|
opts.on('-h', '--help', 'Show help.') do
|
55
52
|
puts opts
|
56
53
|
exit 0
|
@@ -59,6 +56,9 @@ end
|
|
59
56
|
|
60
57
|
optparse.parse!
|
61
58
|
|
59
|
+
defaults = GLSAgent::Dotfile::get_opts
|
60
|
+
options = default.merge options
|
61
|
+
|
62
62
|
if !options[:user] || !options[:pass]
|
63
63
|
STDERR.puts 'Error: Need to specify user and pass in ~/.gls_agent or -u -p .'
|
64
64
|
exit 1
|
@@ -71,13 +71,19 @@ end
|
|
71
71
|
|
72
72
|
options[:output_file] ||= 'gls-label.pdf'
|
73
73
|
|
74
|
-
parcel = GLSAgent::
|
74
|
+
parcel = GLSAgent::job_from_hash(options)
|
75
75
|
|
76
76
|
mech = GLSMech.new
|
77
77
|
mech.user = options[:user]
|
78
78
|
mech.pass = options[:pass]
|
79
79
|
|
80
80
|
pdf_file_path = mech.save_parcel_label parcel, options[:output_file]
|
81
|
+
|
82
|
+
if !pdf_file_path
|
83
|
+
STDERR.puts "Error: Could not login or navigate GLS page."
|
84
|
+
exit 2
|
85
|
+
end
|
86
|
+
|
81
87
|
if pdf_file_path != options[:output_file]
|
82
88
|
STDERR.puts "Warning: #{options[:output_file]} already exists, saved to #{pdf_file_path} instead!."
|
83
89
|
else
|
data/gls_agent.gemspec
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
module GLSAgent
|
2
|
+
module Dotfile
|
3
|
+
# Get keys and values from file in ~/.gls_agent and put them in a hash.
|
4
|
+
# keys are symbols.
|
5
|
+
# The file should follow the syntax
|
6
|
+
# option=value
|
7
|
+
# option2=value2
|
8
|
+
# Meaningful keys are i.e. user and pass.
|
9
|
+
def self.get_opts
|
10
|
+
options = {}
|
11
|
+
# Get defaults from ~/.gls_agent
|
12
|
+
begin
|
13
|
+
filecontent = File.open("#{Dir.home}/.gls_agent").read
|
14
|
+
options = hash_from_text filecontent
|
15
|
+
puts "Info: read configuration parameters from ~/.gls_agent, may be overriden with cmd line options."
|
16
|
+
rescue
|
17
|
+
STDERR.puts "Info: No configuration file in ~/.gls_agent found, all options need to be specified on command line."
|
18
|
+
#STDERR.puts $!.inspect,$@
|
19
|
+
end
|
20
|
+
options
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.hash_from_text text
|
24
|
+
hash = {}
|
25
|
+
text.each_line do |line|
|
26
|
+
fields = line.split('=')
|
27
|
+
fields.each &:strip!
|
28
|
+
fields.each &:rstrip!
|
29
|
+
hash[fields[0].to_sym] = fields[1]
|
30
|
+
end
|
31
|
+
hash
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/gls_agent/gls_mech.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'mechanize'
|
2
2
|
require 'logger'
|
3
3
|
|
4
|
+
# Utilize mechanize to do stuff on GLS webpage.
|
4
5
|
class GLSMech
|
5
6
|
attr_accessor :mech
|
6
7
|
attr_accessor :user
|
@@ -19,8 +20,10 @@ class GLSMech
|
|
19
20
|
|
20
21
|
# Saves parcel label as pdf, does not overwrite file if exists,
|
21
22
|
# returns filename that label was saved to.
|
23
|
+
# returns nil if login or redirection failed.
|
22
24
|
def save_parcel_label parcel_job, filename
|
23
|
-
login! @user, @pass
|
25
|
+
return nil if !login! @user, @pass
|
26
|
+
|
24
27
|
form = @mech.page.forms.first
|
25
28
|
|
26
29
|
form.field_with(:name => 'txtName1').value = parcel_job.name
|
@@ -37,6 +40,7 @@ class GLSMech
|
|
37
40
|
private
|
38
41
|
|
39
42
|
# Login to GLS parcel creation web page using provided credentials.
|
43
|
+
# returns true if login and navigation afterwards succeeded.
|
40
44
|
def login! username, password
|
41
45
|
target_url = 'http://www.your-gls.eu/276-I-PORTAL-WEB/content/GLS/DE03/DE/15005.htm'
|
42
46
|
page = @mech.get target_url
|
@@ -46,5 +50,6 @@ class GLSMech
|
|
46
50
|
form.submit
|
47
51
|
# Move on to target page.
|
48
52
|
page = @mech.get target_url
|
53
|
+
page.uri.to_s == target_url
|
49
54
|
end
|
50
55
|
end
|
data/lib/gls_agent/version.rb
CHANGED
data/lib/gls_agent.rb
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
require "gls_agent/version"
|
2
2
|
require 'gls_agent/gls_mech'
|
3
|
+
require 'gls_agent/dotfile'
|
3
4
|
|
4
5
|
module GLSAgent
|
5
6
|
ParcelJob = Struct.new(:name, :street, :streetno, :zip, :city, :weight)
|
7
|
+
|
8
|
+
def self.job_from_csv string
|
9
|
+
fields = string.split(',')
|
10
|
+
if fields.length != 6
|
11
|
+
fail 'job_from_csv needs 6 fields'
|
12
|
+
return nil
|
13
|
+
end
|
14
|
+
ParcelJob.new(*fields)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.job_from_hash hash
|
18
|
+
ParcelJob.new(hash[:name], hash[:street], hash[:streetno], hash[:zip], hash[:city], hash[:weight])
|
19
|
+
end
|
6
20
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative '../lib/gls_agent'
|
2
|
+
|
3
|
+
describe 'GLSAgent Module helpers' do
|
4
|
+
it 'creates ParcelJob from csv string' do
|
5
|
+
job = GLSAgent::job_from_csv 'Name,Street,1,1234,City,1'
|
6
|
+
expect(job.name).to eq 'Name'
|
7
|
+
expect(job.street).to eq 'Street'
|
8
|
+
expect(job.streetno).to eq '1'
|
9
|
+
expect(job.zip).to eq '1234'
|
10
|
+
expect(job.city).to eq 'City'
|
11
|
+
expect(job.weight).to eq '1'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'creates ParcelJob from hash' do
|
15
|
+
hash = {:name => 'Name', :street => 'Street', :streetno => '1', :zip => '1234', :city => 'City', :weight => '1'}
|
16
|
+
job = GLSAgent::job_from_hash hash
|
17
|
+
expect(job.name).to eq 'Name'
|
18
|
+
expect(job.street).to eq 'Street'
|
19
|
+
expect(job.streetno).to eq '1'
|
20
|
+
expect(job.zip).to eq '1234'
|
21
|
+
expect(job.city).to eq 'City'
|
22
|
+
expect(job.weight).to eq '1'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'Dotfile-Parsing' do
|
27
|
+
it 'makes a hash from abc=def options' do
|
28
|
+
hash = GLSAgent::Dotfile::hash_from_text 'abc=def'
|
29
|
+
expect(hash[:abc]).to eq 'def'
|
30
|
+
end
|
31
|
+
it 'is tolerant about spaces' do
|
32
|
+
hash = GLSAgent::Dotfile::hash_from_text ' abc =def '
|
33
|
+
expect(hash[:abc]).to eq 'def'
|
34
|
+
end
|
35
|
+
it 'handles multiple options' do
|
36
|
+
hash = GLSAgent::Dotfile::hash_from_text " abc =def \nuser= 123\n pass = h"
|
37
|
+
expect(hash[:abc]).to eq 'def'
|
38
|
+
expect(hash[:user]).to eq '123'
|
39
|
+
expect(hash[:pass]).to eq 'h'
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gls_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Wolfsteller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mechanize
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Log into GLS site, create and save new parcel sticker for Germany.
|
56
70
|
email:
|
57
71
|
- felix.wolfsteller@gmail.com
|
@@ -69,8 +83,10 @@ files:
|
|
69
83
|
- bin/gls_create_label
|
70
84
|
- gls_agent.gemspec
|
71
85
|
- lib/gls_agent.rb
|
86
|
+
- lib/gls_agent/dotfile.rb
|
72
87
|
- lib/gls_agent/gls_mech.rb
|
73
88
|
- lib/gls_agent/version.rb
|
89
|
+
- spec/gls_agent_spec.rb
|
74
90
|
homepage: https://github.com/fwolfst/gls_agent
|
75
91
|
licenses:
|
76
92
|
- MIT
|
@@ -95,4 +111,5 @@ rubygems_version: 2.2.2
|
|
95
111
|
signing_key:
|
96
112
|
specification_version: 4
|
97
113
|
summary: Fetches german parcel labels from GLS webpage.
|
98
|
-
test_files:
|
114
|
+
test_files:
|
115
|
+
- spec/gls_agent_spec.rb
|