Browse Source
- Trabalhando no servidor falso de SOAP/WSDL
- Trabalhando no servidor falso de SOAP/WSDL
- Adicionando codigo de geracao de codigos de barras Code128tags/0.1
5 changed files with 367 additions and 34 deletions
-
11README
-
301pynfe/utils/bar_code_128.py
-
36run_fake_soap_server.py
-
40tests/01-basico.txt
-
13tests/04-servidor-soap.txt
@ -0,0 +1,301 @@ |
|||||
|
""" |
||||
|
Source: http://barcode128.blogspot.com/2007/03/code128py.html |
||||
|
|
||||
|
This class generate code 128 (http://en.wikipedia.org/wiki/Code_128) bar code, |
||||
|
it requires PIL (python imaging library) installed. |
||||
|
|
||||
|
This program is based on EanBarCode.py found on |
||||
|
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/426069 submitted by Remi Inconnu. |
||||
|
|
||||
|
Code 128 is variable lenght and a 103 module checksum is added automatically. |
||||
|
|
||||
|
Create bar code sample : |
||||
|
from Code128 import Code128 |
||||
|
bar = Code128() |
||||
|
bar.getImage("9782212110708",50,"gif") |
||||
|
""" |
||||
|
|
||||
|
# courbB08.pil PIL Font file uuencoded |
||||
|
courB08_pil ="""eJztl91rFkcUxp+Zt7vGFYzVtiJKICgYlLRWkaBBVGgDraFGCH5gsQp+QMBqabAVRYJYAlakCkoh |
||||
|
CpYgxaLkIu1NvLBeSAStglpqL6xQAsVe2AuL5u2buH3mzGaYPf9AKWTl8d3nl7MzZ2bnazvea9+9 |
||||
|
7+PurFWut5e0Zu+s7VybYfKavP7LK3X/5TlM4Q3/OWbyf1ARD/6mgb2SjwtPhbpnq0iKZ6ahrmCj |
||||
|
wqbxdgamRnHOA69jimN5zvIS8cDcUEeVdYzRAw1FHcJYXgPvG4s6Jlgj7xeEequS3wLeNvGvnrEO |
||||
|
tq+Jt82szT+b86+WHlgS2jHGuHF6YHnog1zaupxqCcy3t4X3rVG9iXhgjW+bsFQ80BaxRDywTrF1 |
||||
|
VId6toPaqOI2UlsV20ptV2w7tUuxXVSXYl3UvoIZ9kFFPPBJ6D/HLD3QXbwjyDjI6YHPiz5FXiN7 |
||||
|
SQ8cDu/N9/1h3veEOP/Oe6gvQnmuvYYe+NL3qYyNVDxw2seF8XKa+jrKJREPnFdx56l+xfqpS4pd |
||||
|
ogZUeQPU91FcKh64GveBeOCaKu8adUM9e4O6reJuU/cUu0c9VM8+pB6r/B5TI+rZEerPUpyhB/6K |
||||
|
5lsqHniuyntO1VR5Nb5CU86FHqZOsTqqXrF66o2ojlQ8zDwVN4+aX86FHqYpXg9YLeevWRzPc7LF |
||||
|
ZG+V1wN6mKXxvMzH6GFaJua5zGNLD7MqmtNcc+hh1oT1oCb5cf6aNj92mbPMGXqY9jCPasLaqQ1h |
||||
|
jMv8pYfZpOI2UR9GcYl4mB1RnMtvB9me8N583B5qb3mNoIf5NGJc1+hhPvPrrjybioc5op49Qh0L |
||||
|
dfj8jlHHQ3s9O059Fc3zRDzMmVKcpYfpU+3oI/umxJyH+TYqLxUPc0X13xVqMMovFQ8zpPIbon6M |
||||
|
WCoeZljVMUz9VIqz9DAP1Dt6QP0a9gpZ7+lhHhXjysreaOhhfiv1vaGH+T2Mv5rbU+hh/uAaOnlN |
||||
|
Xv+Hy4/7mtv3OW5hnpTODIYe5mm0xqbiYf4OcbLv08NU1ZyuuqKLOEvm6sjhJkd8TjRustgkrO3u |
||||
|
vFGjh60r1uyiPHrY6eH84tb7l/SwM8vrAT3snHgNY9wcsoby+Y8edn5UxxTxsIuitrlcFpG9GcVx |
||||
|
/6CHXRrKk72MHrYl3stYB/ceu7I4X02wlWSrCmaF1ehhV7NrovWKHrattI4betj20Fc8r7E87kf2 |
||||
|
g+gcy32BHnZDfKZmHPco2xnl4vqlk2yz6r/N1EfRPpiKh90d7VGpeNi9inGPst2lNdbSwx4McS8k |
||||
|
7iDVE/Ytz3qoXsV6qZOKnaTOBDYqjPuRPRfOkz7uHNUf4uQMQg/7XekMYulhB6JnE/GwP0T1JuJh |
||||
|
ryrGM6G9HuWSiIcdDnPmhTs70sPeCuPes1vUXcXuUvcDGxV2n/olOisn4mEfhfOVby/3KDsSlZeI |
||||
|
h32iGOe0faoY57R9ptgzajTKJREPOx7aJnOfHhUbxov0Mz0qU8v50aMyo/wu6VGZrdhsqqH8fnll |
||||
|
HEEz4zj6DNMxK+4X+gyv8cszyoU+4zfmjNAO9zuXrNGXF1gj2ULFFpI1K9ZMtiww//22jGwFXg39 |
||||
|
535XkK0O+cl5gz7Du6iP5wd9hvfDs9LP9BnWR/U6tp6sU7FOsi1RLo5tIdsWled+t5HtVO3YSdal |
||||
|
WBfZftW2/WQHVH4HyA6F9+GfPUR2VOV3lKxXsV6yE4qdIDul2Cmys6ptZ8n6Qi7+m7OP7ELoU/8t |
||||
|
dIHsoo8L+V0ku6xyvkw2qNgg2VBgvg+GyK6XyrP0GW5ydE3EuXd5k+xOeOdVibtD9jNm/Qv15O4i""" |
||||
|
|
||||
|
# courbB08.pbm font file uuencoded |
||||
|
courB08_pbm ="""eJxNkntM01cUx8+P2/1apUAZEpECq4KRjKhF0E55FYEp4yG6mglz2Q8Q1BhERhhls/zKI+CID4wb |
||||
|
IAPKpk4GAzqZPKKMX2GIUwGJG+ImtKwKjIzXcGuBtncV0Hn+uLnn5Nzv55xv7mdRkbusVjquBACr |
||||
|
0N3B+wCQi/m+ijAf4LGl/wgAiwkNDpRIyyABSjGkBQ/fa3c1bfLs4U8ulDcYUs/502rTpIlO9pyc |
||||
|
Kp/Buql6f3rmZ1NqvpO2SZXf0duY3j0563zjoZpW8AvHRmVeZ/Co36mFR8bERzlsxOMJ+oJshsS5 |
||||
|
7rlfzFzmnZFEFnIEZjTGizgLsLzjl4QtrNprBRu10e+u9GgePHjG63bPDw/H87uix0Vtsvkqg9qO |
||||
|
lUimPLiOM4z69YfqIu5Pa2Sr/io6n9Xmf9e+57W1Iapo4lLQBdLSWc/z3KOSlgznDXTW/Flh21kX |
||||
|
IeUIX8FZVL9dwP4NBH5jglYxkBNFmWgMcfsAxM/9gEL5TTwYpnfElR8qQ+WiCgeTHOAfb2bW/cQC |
||||
|
/FozFOOQzAebtjRvQLI7HBtXvaZe25a3Q/1vZpPa+kd1XXKuflr5Cm48YUsUcjMXjsm/sf+22s6z |
||||
|
QAbGZ8mEXMzSE4y9AHhRpltwB1N9ynz5H2MOi0MEi4E5O1ov9ogrFU5cMWAcdgQb3xHFtFK+0pkh |
||||
|
VnYWxltx92j69p6jJ9OnHr+Cq5x5X6Mz70JcX2tEG5LIShM4EHIGoLIRsHzcvEuGwMYA4DZPn7gP |
||||
|
MA1QIgltnt82cTu7j5n76mmz3TU5Bh3PFRTHku52aBgaTnJD7m1c0a3hNjbWWjBtMsP/OFac/LYA |
||||
|
NAAWepdYodB58NBFIuOjNSQ4cgXplqP2RyOe8fd999T8weqBRwLwNFdQobHgA1/YTV8PH+TwV59v |
||||
|
Bo7Y1J4rmHFv3T9e8rmmXdGSuPpSbBnhYJ7V8ICz6AfGcdTpRkpCUU8WcOT8wb+dSHIb6QZapx0M |
||||
|
Y2DO4i7jYV2AUNkkErpQFHVYmFRmYD7OJhDyQSiow4IkrS3TbpQqFA9slE4jnj6peXMTC+N8buJ2 |
||||
|
0Uv5eOothuGIiluyCDtff3miBzJHjncOIC3bPT8FLabRPd0TCWy346Mmn9Rz23WyNMJcsnqhQani |
||||
|
3CMFOZuYU7c20zTNVqNbGPNxALWnybeLEcTvXWpc10leI5ae/CI9qBqI686cnO6P6F33e2vAp0nz |
||||
|
9+hnbNeueh/261UJK5aVeSf73ZSXA7dOBXvkXODEb9hVww4KtPNAbPvaZbi0q9kICCl+CiBJSzLv |
||||
|
a8TlntYlC4UHvCRTlaXOy13VAbN0eae2v3hNesWXLsWPkjfOPq7e6zd1fOfc1TckDaylrvleinnT |
||||
|
8Ui87ScLMVhhEx7SUJ8U2zKrRR2Z1dEqZlkr7kDTuhFjpkvse9ZXN0R9H+DlYA4TXVm6/kXDQMyT |
||||
|
eGnJFXlLlSgva5iLUEcbiyDzNqf4Wr9kKYVUIcY40DrnsW4E4zW9QxnHVYx+bo64mIskDWjZgCrq |
||||
|
eVQFrS7Sh/uFLftIidKWbgj6Oq652d4c3v88Dw2JDK7bSWX/ByuaLZI=""" |
||||
|
|
||||
|
class Code128: |
||||
|
CharSetA = { |
||||
|
' ':0, '!':1, '"':2, '#':3, '$':4, '%':5, '&':6, "'":7, |
||||
|
'(':8, ')':9, '*':10, '+':11, ',':12, '-':13, '.':14, '/':15, |
||||
|
'0':16, '1':17, '2':18, '3':19, '4':20, '5':21, '6':22, '7':23, |
||||
|
'8':24, '9':25, ':':26, ';':27, '<':28, '=':29, '>':30, '?':31, |
||||
|
'@':32, 'A':33, 'B':34, 'C':35, 'D':36, 'E':37, 'F':38, 'G':39, |
||||
|
'H':40, 'I':41, 'J':42, 'K':43, 'L':44, 'M':45, 'N':46, 'O':47, |
||||
|
'P':48, 'Q':49, 'R':50, 'S':51, 'T':52, 'U':53, 'V':54, 'W':55, |
||||
|
'X':56, 'Y':57, 'Z':58, '[':59, '\\':60, ']':61, '^':62, '_':63, |
||||
|
'\x00':64, '\x01':65, '\x02':66, '\x03':67, '\x04':68, '\x05':69, '\x06':70, '\x07':71, |
||||
|
'\x08':72, '\x09':73, '\x0A':74, '\x0B':75, '\x0C':76, '\x0D':77, '\x0E':78, '\x0F':79, |
||||
|
'\x10':80, '\x11':81, '\x12':82, '\x13':83, '\x14':84, '\x15':85, '\x16':86, '\x17':87, |
||||
|
'\x18':88, '\x19':89, '\x1A':90, '\x1B':91, '\x1C':92, '\x1D':93, '\x1E':94, '\x1F':95, |
||||
|
'FNC3':96, 'FNC2':97, 'SHIFT':98, 'Code C':99, 'Code B':100, 'FNC4':101, 'FNC1':102, 'START A':103, |
||||
|
'START B':104, 'START C':105, 'STOP':106 |
||||
|
} |
||||
|
|
||||
|
CharSetB = { |
||||
|
' ':0, '!':1, '"':2, '#':3, '$':4, '%':5, '&':6, "'":7, |
||||
|
'(':8, ')':9, '*':10, '+':11, ',':12, '-':13, '.':14, '/':15, |
||||
|
'0':16, '1':17, '2':18, '3':19, '4':20, '5':21, '6':22, '7':23, |
||||
|
'8':24, '9':25, ':':26, ';':27, '<':28, '=':29, '>':30, '?':31, |
||||
|
'@':32, 'A':33, 'B':34, 'C':35, 'D':36, 'E':37, 'F':38, 'G':39, |
||||
|
'H':40, 'I':41, 'J':42, 'K':43, 'L':44, 'M':45, 'N':46, 'O':47, |
||||
|
'P':48, 'Q':49, 'R':50, 'S':51, 'T':52, 'U':53, 'V':54, 'W':55, |
||||
|
'X':56, 'Y':57, 'Z':58, '[':59, '\\':60, ']':61, '^':62, '_':63, |
||||
|
'' :64, 'a':65, 'b':66, 'c':67, 'd':68, 'e':69, 'f':70, 'g':71, |
||||
|
'h':72, 'i':73, 'j':74, 'k':75, 'l':76, 'm':77, 'n':78, 'o':79, |
||||
|
'p':80, 'q':81, 'r':82, 's':83, 't':84, 'u':85, 'v':86, 'w':87, |
||||
|
'x':88, 'y':89, 'z':90, '{':91, '|':92, '}':93, '~':94, '\x7F':95, |
||||
|
'FNC3':96, 'FNC2':97, 'SHIFT':98, 'Code C':99, 'FNC4':100, 'Code A':101, 'FNC1':102, 'START A':103, |
||||
|
'START B':104, 'START C':105, 'STOP':106 |
||||
|
} |
||||
|
|
||||
|
CharSetC = { |
||||
|
'00':0, '01':1, '02':2, '03':3, '04':4, '05':5, '06':6, '07':7, |
||||
|
'08':8, '09':9, '10':10, '11':11, '12':12, '13':13, '14':14, '15':15, |
||||
|
'16':16, '17':17, '18':18, '19':19, '20':20, '21':21, '22':22, '23':23, |
||||
|
'24':24, '25':25, '26':26, '27':27, '28':28, '29':29, '30':30, '31':31, |
||||
|
'32':32, '33':33, '34':34, '35':35, '36':36, '37':37, '38':38, '39':39, |
||||
|
'40':40, '41':41, '42':42, '43':43, '44':44, '45':45, '46':46, '47':47, |
||||
|
'48':48, '49':49, '50':50, '51':51, '52':52, '53':53, '54':54, '55':55, |
||||
|
'56':56, '57':57, '58':58, '59':59, '60':60, '61':61, '62':62, '63':63, |
||||
|
'64':64, '65':65, '66':66, '67':67, '68':68, '69':69, '70':70, '71':71, |
||||
|
'72':72, '73':73, '74':74, '75':75, '76':76, '77':77, '78':78, '79':79, |
||||
|
'80':80, '81':81, '82':82, '83':83, '84':84, '85':85, '86':86, '87':87, |
||||
|
'88':88, '89':89, '90':90, '91':91, '92':92, '93':93, '94':94, '95':95, |
||||
|
'96':96, '97':97, '98':98, '99':99, 'Code B':100, 'Code A':101, 'FNC1':102, 'START A':103, |
||||
|
'START B':104, 'START C':105, 'STOP':106 |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ValueEncodings = { 0:'11011001100', 1:'11001101100', 2:'11001100110', |
||||
|
3:'10010011000', 4:'10010001100', 5:'10001001100', |
||||
|
6:'10011001000', 7:'10011000100', 8:'10001100100', |
||||
|
9:'11001001000', 10:'11001000100', 11:'11000100100', |
||||
|
12:'10110011100', 13:'10011011100', 14:'10011001110', |
||||
|
15:'10111001100', 16:'10011101100', 17:'10011100110', |
||||
|
18:'11001110010', 19:'11001011100', 20:'11001001110', |
||||
|
21:'11011100100', 22:'11001110100', 23:'11101101110', |
||||
|
24:'11101001100', 25:'11100101100', 26:'11100100110', |
||||
|
27:'11101100100', 28:'11100110100', 29:'11100110010', |
||||
|
30:'11011011000', 31:'11011000110', 32:'11000110110', |
||||
|
33:'10100011000', 34:'10001011000', 35:'10001000110', |
||||
|
36:'10110001000', 37:'10001101000', 38:'10001100010', |
||||
|
39:'11010001000', 40:'11000101000', 41:'11000100010', |
||||
|
42:'10110111000', 43:'10110001110', 44:'10001101110', |
||||
|
45:'10111011000', 46:'10111000110', 47:'10001110110', |
||||
|
48:'11101110110', 49:'11010001110', 50:'11000101110', |
||||
|
51:'11011101000', 52:'11011100010', 53:'11011101110', |
||||
|
54:'11101011000', 55:'11101000110', 56:'11100010110', |
||||
|
57:'11101101000', 58:'11101100010', 59:'11100011010', |
||||
|
60:'11101111010', 61:'11001000010', 62:'11110001010', |
||||
|
63:'10100110000', 64:'10100001100', 65:'10010110000', |
||||
|
66:'10010000110', 67:'10000101100', 68:'10000100110', |
||||
|
69:'10110010000', 70:'10110000100', 71:'10011010000', |
||||
|
72:'10011000010', 73:'10000110100', 74:'10000110010', |
||||
|
75:'11000010010', 76:'11001010000', 77:'11110111010', |
||||
|
78:'11000010100', 79:'10001111010', 80:'10100111100', |
||||
|
81:'10010111100', 82:'10010011110', 83:'10111100100', |
||||
|
84:'10011110100', 85:'10011110010', 86:'11110100100', |
||||
|
87:'11110010100', 88:'11110010010', 89:'11011011110', |
||||
|
90:'11011110110', 91:'11110110110', 92:'10101111000', |
||||
|
93:'10100011110', 94:'10001011110', 95:'10111101000', |
||||
|
96:'10111100010', 97:'11110101000', 98:'11110100010', |
||||
|
99:'10111011110',100:'10111101110',101:'11101011110', |
||||
|
102:'11110101110',103:'11010000100',104:'11010010000', |
||||
|
105:'11010011100',106:'11000111010' |
||||
|
} |
||||
|
|
||||
|
def makeCode(self, code): |
||||
|
""" Create the binary code |
||||
|
return a string which contains "0" for white bar, "1" for black bar """ |
||||
|
|
||||
|
current_charset = None |
||||
|
pos=sum=0 |
||||
|
skip=False |
||||
|
for c in range(len(code)): |
||||
|
if skip: |
||||
|
skip=False |
||||
|
continue |
||||
|
|
||||
|
#Only switch to char set C if next four chars are digits |
||||
|
if len(code[c:]) >=4 and code[c:c+4].isdigit() and current_charset!=self.CharSetC or \ |
||||
|
len(code[c:]) >=2 and code[c:c+2].isdigit() and current_charset==self.CharSetC: |
||||
|
#If char set C = current and next two chars ar digits, keep C |
||||
|
if current_charset!=self.CharSetC: |
||||
|
#Switching to Character set C |
||||
|
if pos: |
||||
|
strCode += self.ValueEncodings[current_charset['Code C']] |
||||
|
sum += pos * current_charset['Code C'] |
||||
|
else: |
||||
|
strCode= self.ValueEncodings[self.CharSetC['START C']] |
||||
|
sum = self.CharSetC['START C'] |
||||
|
current_charset= self.CharSetC |
||||
|
pos+=1 |
||||
|
elif self.CharSetB.has_key(code[c]) and current_charset!=self.CharSetB and \ |
||||
|
not(self.CharSetA.has_key(code[c]) and current_charset==self.CharSetA): |
||||
|
#If char in chrset A = current, then just keep that |
||||
|
# Switching to Character set B |
||||
|
if pos: |
||||
|
strCode += self.ValueEncodings[current_charset['Code B']] |
||||
|
sum += pos * current_charset['Code B'] |
||||
|
else: |
||||
|
strCode= self.ValueEncodings[self.CharSetB['START B']] |
||||
|
sum = self.CharSetB['START B'] |
||||
|
current_charset= self.CharSetB |
||||
|
pos+=1 |
||||
|
elif self.CharSetA.has_key(code[c]) and current_charset!=self.CharSetA and \ |
||||
|
not(self.CharSetB.has_key(code[c]) and current_charset==self.CharSetB): |
||||
|
# if char in chrset B== current, then just keep that |
||||
|
# Switching to Character set A |
||||
|
if pos: |
||||
|
strCode += self.ValueEncodings[current_charset['Code A']] |
||||
|
sum += pos * current_charset['Code A'] |
||||
|
else: |
||||
|
strCode += self.ValueEncodings[self.CharSetA['START A']] |
||||
|
sum = self.CharSetA['START A'] |
||||
|
current_charset= self.CharSetA |
||||
|
pos+=1 |
||||
|
|
||||
|
if current_charset==self.CharSetC: |
||||
|
val= self.CharSetC[code[c:c+2]] |
||||
|
skip=True |
||||
|
else: |
||||
|
val=current_charset[code[c]] |
||||
|
|
||||
|
sum += pos * val |
||||
|
strCode += self.ValueEncodings[val] |
||||
|
pos+=1 |
||||
|
|
||||
|
#Checksum |
||||
|
checksum= sum % 103 |
||||
|
|
||||
|
strCode += self.ValueEncodings[checksum] |
||||
|
|
||||
|
#The stop character |
||||
|
strCode += self.ValueEncodings[current_charset['STOP']] |
||||
|
|
||||
|
#Termination bar |
||||
|
strCode += "11" |
||||
|
|
||||
|
return strCode |
||||
|
|
||||
|
def getImage(self, value, height = 50, extension = "PNG"): |
||||
|
""" Get an image with PIL library |
||||
|
value code barre value |
||||
|
height height in pixel of the bar code |
||||
|
extension image file extension""" |
||||
|
import Image, ImageFont, ImageDraw |
||||
|
from string import lower, upper |
||||
|
|
||||
|
# Create a missing font file |
||||
|
decodeFontFile(courB08_pil ,"courB08.pil") |
||||
|
decodeFontFile(courB08_pbm ,"courB08.pbm") |
||||
|
|
||||
|
# Get the bar code list |
||||
|
bits = self.makeCode(value) |
||||
|
|
||||
|
# Create a new image |
||||
|
position = 8 |
||||
|
im = Image.new("1",(len(bits)+position,height)) |
||||
|
|
||||
|
# Load font |
||||
|
font = ImageFont.load("courB08.pil") |
||||
|
|
||||
|
# Create drawer |
||||
|
draw = ImageDraw.Draw(im) |
||||
|
|
||||
|
# Erase image |
||||
|
draw.rectangle(((0,0),(im.size[0],im.size[1])),fill=256) |
||||
|
|
||||
|
# Draw text |
||||
|
draw.text((0, height-9), value, font=font, fill=0) |
||||
|
|
||||
|
# Draw the bar codes |
||||
|
for bit in range(len(bits)): |
||||
|
if bits[bit] == '1': |
||||
|
draw.rectangle(((bit+position,0),(bit+position,height-10)),fill=0) |
||||
|
|
||||
|
# Save the result image |
||||
|
im.save(value+"."+lower(extension), upper(extension)) |
||||
|
|
||||
|
|
||||
|
def decodeFontFile(data, file): |
||||
|
""" Decode font file embedded in this script and create file """ |
||||
|
from zlib import decompress |
||||
|
from base64 import decodestring |
||||
|
from os.path import exists |
||||
|
|
||||
|
# If the font file is missing |
||||
|
if not exists(file): |
||||
|
# Write font file |
||||
|
open (file, "wb").write(decompress(decodestring(data))) |
||||
|
|
||||
|
def testWithChecksum(): |
||||
|
""" Test bar code with checksum """ |
||||
|
bar = Code128() |
||||
|
assert(bar.makeCode('HI345678')=='11010010000110001010001100010001010111011110100010110001110001011011000010100100001001101100011101011') |
||||
|
|
||||
|
def testImage(): |
||||
|
""" Test images generation with PIL """ |
||||
|
bar = Code128() |
||||
|
bar.getImage("9782212110708",50,"gif") |
||||
|
bar.getImage("978221211070",50,"png") |
||||
|
|
||||
|
def test(): |
||||
|
""" Execute all tests """ |
||||
|
testWithChecksum() |
||||
|
testImage() |
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
test() |
||||
|
|
||||
@ -1,22 +1,30 @@ |
|||||
from soaplib.wsgi_soap import SimpleWSGISoapApp |
from soaplib.wsgi_soap import SimpleWSGISoapApp |
||||
from soaplib.service import soapmethod |
from soaplib.service import soapmethod |
||||
from soaplib.serializers.primitive import String, Integer, Array |
|
||||
|
|
||||
import tornado.httpserver |
|
||||
import tornado.ioloop |
|
||||
|
|
||||
class ServidorNFEFalso(SimpleWSGISoapApp): |
class ServidorNFEFalso(SimpleWSGISoapApp): |
||||
@soapmethod(String,Integer,_returns=Array(String)) |
|
||||
def ping(self,name,times): |
|
||||
results = [] |
|
||||
for i in range(0,times): |
|
||||
results.append('Hello, %s'%name) |
|
||||
return results |
|
||||
|
from soaplib.serializers.primitive import String, Integer, Array, Null |
||||
|
|
||||
|
@soapmethod(_returns=Null) |
||||
|
def finalizar(self): |
||||
|
import sys |
||||
|
sys.exit(0) |
||||
|
|
||||
|
@soapmethod(_returns=String) |
||||
|
def ping(self): |
||||
|
return 'eu estou aqui' |
||||
|
|
||||
if __name__ == '__main__': |
if __name__ == '__main__': |
||||
porta = 8080 |
|
||||
|
porta = 8081 |
||||
|
|
||||
|
# Via Tornado |
||||
|
#import tornado.httpserver |
||||
|
#import tornado.ioloop |
||||
|
#http_server = tornado.httpserver.HTTPServer(ServidorNFEFalso()) |
||||
|
#http_server.listen(porta) |
||||
|
#tornado.ioloop.IOLoop.instance().start() |
||||
|
|
||||
http_server = tornado.httpserver.HTTPServer(ServidorNFEFalso()) |
|
||||
http_server.listen(porta) |
|
||||
tornado.ioloop.IOLoop.instance().start() |
|
||||
|
# Via CherryPy |
||||
|
from cherrypy.wsgiserver import CherryPyWSGIServer |
||||
|
server = CherryPyWSGIServer(('localhost', porta), ServidorNFEFalso()) |
||||
|
server.start() |
||||
|
|
||||
@ -0,0 +1,13 @@ |
|||||
|
SERVIDOR SOAP FALSO PARA TESTES |
||||
|
=============================== |
||||
|
|
||||
|
Este teste vai verificar um servidor, executado atraves do comando |
||||
|
'run_fake_soap_server.py', para enviar requisicoes SOAP e esperar as |
||||
|
responstas em formato WSDL, de forma a simular o servidor da SEFAZ. |
||||
|
|
||||
|
>>> from suds.client import Client |
||||
|
>>> url = 'http://localhost:8080/ServidorNFEFalso?wsdl' |
||||
|
>>> #client = Client(url) |
||||
|
>>> #print client |
||||
|
>>> #print client.service.ping('mario', 5) |
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue