paramedic 0.1.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05384eaaef8a30563606ec636ebc18d4212436cb
4
- data.tar.gz: ab3c3df45ccf8d10d52b4da661da2453561dca25
3
+ metadata.gz: 1d62dc7b67b68ff1e498b57ed5d6e773406f8d1b
4
+ data.tar.gz: b22d3ad0db632998a533b53b8fe8f1e676610868
5
5
  SHA512:
6
- metadata.gz: ccb93be6473d3eab1579b454d2e25151ed31e67d057d5bc9341ac53617d038fb360f3f73ea3ab85810cbbba64ecf349e50b2f3689efedb88fcfbb4bdb01ffee2
7
- data.tar.gz: 32ef855bfaaf76f2a458c516657c6c3588af651abb7c69b00a31d30691e60dcdc6c2a3656032f7c26235ced501f68b22a1a0955f0436c283adc1ce51952963b3
6
+ metadata.gz: 4287bf0321aa006c052e599727c63f3fd0b554bafb9e2edfa7999b044ebae5f5a49e66befbf9d8f68c39e3ab998222b73445f980e12dea9d364a62533dea318e
7
+ data.tar.gz: 97fba8e3d5165e331cf7a06aeb9c5465b7a4b08e42e8f3b99cff9b56912b036112d9e3b8a2fc5a6a1a8376bbd0a74c3a3e80c88b6e944a87482cb7d2df99bd1e
data/README.md CHANGED
@@ -22,32 +22,34 @@ Or install it yourself as:
22
22
 
23
23
  Encoder takes a hash of params and their values, and makes them safe for older Microsoft services, like so:
24
24
 
25
- > params = { CMD: '/cmd?name=bill&id=3' }
26
- > Paramedic::Encoder.new(params).to_s
27
- => "CMD=%2Fcmd%3Fname%3Dbill%24id%3D3"
25
+ ```ruby
26
+ params = { CMD: '/cmd?name=bill&id=3' }
27
+ Paramedic::Encoder.new(params).to_s
28
+ # => "CMD=%2Fcmd%3Fname%3Dbill%24id%3D3"
29
+ ```
28
30
 
29
- ### XmlMasseuse
31
+ ### XMLMasseuse
30
32
 
31
33
  Let's say that you have an XML document assigned to a variable like so:
32
34
 
33
- > xml = """
34
- ...
35
- <superheroes>
36
- <superman>
37
- <name>Clark Kent</name>
38
- </superman>
39
- </superheroes>
40
- ...
41
- """
42
-
43
- If you want the <superheroes /> element's children to be treated like they're not part of the XML document,
44
- do the following:
35
+ ```xml
36
+ <!-- /superheroes.xml -->
37
+ <superheroes>
38
+ <superman>
39
+ <name>Clark Kent</name>
40
+ </superman>
41
+ </superheroes>
42
+ ```
45
43
 
46
- > Paramedic::XmlMasseuse.new(xml: xml, escape_tags: ['superheroes']).to_xml
44
+ If you want the `<superheroes />` element's children to be treated like they're not part of the XML document,
45
+ do the following:
47
46
 
48
- The result will be the following string:
47
+ ```ruby
48
+ xml = File.read('/superheroes.xml')
49
+ Paramedic::XMLMasseuse.new(xml, escape_tags: ['superheroes']).to_xml
49
50
 
50
- => <superheroes>&lt;superman&gt;&lt;name&gt;Clark Kent&lt;/name&gt;</superheroes>
51
+ # => "<superheroes>&lt;superman&gt;&lt;name&gt;Clark Kent&lt;/name&gt;</superheroes>"
52
+ ```
51
53
 
52
54
  ## Contributing
53
55
 
@@ -0,0 +1,15 @@
1
+ Feature: Encode a query string
2
+
3
+ Scenario:
4
+ Given a query string that requires encoding
5
+ And a value for REQUESTTYPE of SAVE
6
+ And a value for TABLE of undefined
7
+ And a value for GROUP of WEB_RMLEAS
8
+ And a value for PAGE of APPLY
9
+ And a value for ID of MRI_1
10
+ And a value for CMD in command.xml
11
+ And a value for DATA in data.xml
12
+ When the keys and values are encoded
13
+ Then they produce the string in expected_output.txt
14
+
15
+
@@ -0,0 +1,29 @@
1
+ Given(/^a query string that requires encoding$/) do
2
+ @params = {}
3
+ end
4
+
5
+ Given(/^a value for (\w+)? in (\w+.xml)$/) do |key, file|
6
+ @params[key] = Paramedic::XMLMasseuse.new(File.readlines("features/support/#{file}").join('')).to_xml
7
+ end
8
+
9
+ And(/^a value for (\w+)? of (\w+)?/) do |key, value|
10
+ @params[key] = value
11
+ end
12
+
13
+ When(/^the keys and values are encoded$/) do
14
+ @result = Paramedic::Encoder.new(@params).to_s
15
+ end
16
+
17
+ Then(/^they produce the string in (.+)?$/) do |output_file|
18
+ expected_output = File.readlines("features/support/#{output_file}").first
19
+
20
+ result_hash = produce_hash(@result)
21
+
22
+ expected_hash = produce_hash(expected_output)
23
+
24
+ result_hash.each_pair do |key, value|
25
+ expected_value = expected_hash[key]
26
+
27
+ expect(value.strip).to eq expected_value.strip
28
+ end
29
+ end
@@ -0,0 +1,53 @@
1
+ <?xml version="1.0"?>
2
+ <ViewCommand>
3
+ <GROUP>WEB_RMLEAS</GROUP>
4
+ <PAGE>APPLY</PAGE>
5
+ <COMMAND>SAVE</COMMAND>
6
+ <PARMS>~GROUP=WEB_RMLEAS~MODAL=Y~MENUNAME=WEB_RMHOME~MENUID=MRI_69~INHERITMENU=Y~WHERE=NAME.NAMEID=''~RMPROPID=0115~NAMEGROUP=~NAME.RESPROPID=0115~PATH=C:\Program Files (x86)\MriWeb\~URL=/mripage.asp~</PARMS>
7
+ <CURRENTKEY>~NAMEID=~</CURRENTKEY>
8
+ <CURRENTORDERFLDS>~NAMEID=''~</CURRENTORDERFLDS>
9
+ <ORDERBY></ORDERBY>
10
+ <WHERE>NAME.NAMEID=''</WHERE>
11
+ <USERQRY></USERQRY>
12
+ <GROUP>WEB_RMLEAS</GROUP>
13
+ <MENUNAME>WEB_RMHOME</MENUNAME>
14
+ <MENUID>MRI_69</MENUID>
15
+ <PARENTMENUNAME></PARENTMENUNAME>
16
+ <PARENTMENUID></PARENTMENUID>
17
+ <FILTERID></FILTERID>
18
+ <FORM>APPLY</FORM>
19
+ <CMDBTNS>
20
+ <BTNSAVE>CLNTCMD{SAVE,CLOSE,RETURN{CLNTCMD{RECALC}}}</BTNSAVE>
21
+ <BTNCANCEL1>CLNTCMD{CANCELCLOSE}</BTNCANCEL1>
22
+ </CMDBTNS>
23
+ <HIDE>
24
+ <UTILBILLLINK>HIDE</UTILBILLLINK>
25
+ <CHKOPTOUT>HIDE</CHKOPTOUT>
26
+ <L_CHKOPTOUT>HIDE</L_CHKOPTOUT>
27
+ </HIDE>
28
+ <UPDATEABLE>Y</UPDATEABLE>
29
+ <ABANDON></ABANDON>
30
+ <DELETECOOKIES>COOKIE_7;</DELETECOOKIES>
31
+ <CLIENTEXPR>
32
+ </CLIENTEXPR>
33
+ <BASECLIENTEXPR>
34
+ </BASECLIENTEXPR>
35
+ <HELPPAGE>RM\RM.htm</HELPPAGE>
36
+ <PATH>C:\Program Files (x86)\MriWeb\</PATH>
37
+ <URL>/mripage.asp</URL>
38
+ <COMMENT>
39
+ 27837.5: Start GetWebHtmlAndData
40
+ 27837.7 0 elapsed for BuildMenu
41
+ 27837.72 0.0156 elapsed for Build HTML
42
+ 27837.72 0 elapsed for CmdXml to Svr
43
+ 27837.73 0 elapsed for cleargroup
44
+ 27837.73 0 elapsed for GetData 1
45
+ 27837.75 0.0176 elapsed for BaseQry SQL
46
+ 27837.77 0.0137 elapsed for BaseQry Fetch
47
+ 27837.77 0.0312 elapsed for ExecuteQuery total
48
+ 27837.78 0 elapsed for Build DataXml (0 Rows)
49
+ 27837.78 0.0469 elapsed for GetData
50
+ Evaluate Count: 21
51
+ SQL Time: 0.3398438</COMMENT>
52
+ <APPLID></APPLID>
53
+ </ViewCommand>
@@ -0,0 +1,129 @@
1
+ <?xml version="1.0"?>
2
+ <TABLEDATA>
3
+ <FORM>
4
+ <PRE_ADDRLEN></PRE_ADDRLEN>
5
+ <CUR_ADDRLEN></CUR_ADDRLEN>
6
+ <MRIX_54>
7
+ <N>:: Application Details for William Brewer</N>
8
+ </MRIX_54>
9
+ <PRE_ADDRESS2>
10
+ <N></N>
11
+ </PRE_ADDRESS2>
12
+ <PRE_CITY>
13
+ <N></N>
14
+ </PRE_CITY>
15
+ <PRE_STATE>
16
+ <N></N>
17
+ </PRE_STATE>
18
+ <PRE_ZIP>
19
+ <N></N>
20
+ </PRE_ZIP>
21
+ <EMP_ADDRESS1>
22
+ <N></N>
23
+ </EMP_ADDRESS1>
24
+ <EMP_CITY>
25
+ <N></N>
26
+ </EMP_CITY>
27
+ <EMP_STATE>
28
+ <N></N>
29
+ </EMP_STATE>
30
+ <EMP_ZIP>
31
+ <N></N>
32
+ </EMP_ZIP>
33
+ <EMP_ADDRESS2>
34
+ <N></N>
35
+ </EMP_ADDRESS2>
36
+ <GET_ADDR></GET_ADDR>
37
+ <PRE_ADDRESS>
38
+ <N></N>
39
+ </PRE_ADDRESS>
40
+ <CUR_ADDRESS2>
41
+ <N></N>
42
+ </CUR_ADDRESS2>
43
+ <CUR_CITY>
44
+ <N>Mountain View</N>
45
+ </CUR_CITY>
46
+ <CUR_STATE>
47
+ <N>CA</N>
48
+ </CUR_STATE>
49
+ <CUR_ZIP>
50
+ <N>94040</N>
51
+ </CUR_ZIP>
52
+ <CUR_ADDRESS>
53
+ <N>123 Main Str.</N>
54
+ </CUR_ADDRESS>
55
+ <APPFEE>
56
+ <N>$.00</N>
57
+ </APPFEE>
58
+ <EMT_NAME>
59
+ <N></N>
60
+ </EMT_NAME>
61
+ <EMT_PHONE>
62
+ <N></N>
63
+ </EMT_PHONE>
64
+ <UTILBILLLINK>
65
+ <N>Utility Billing</N>
66
+ </UTILBILLLINK>
67
+ <PREVNAMEID></PREVNAMEID>
68
+ <NAME.BIRTHDAY>
69
+ <N>3/27/1963</N>
70
+ </NAME.BIRTHDAY>
71
+ <SSN>
72
+ <N>999999992</N>
73
+ </SSN>
74
+ <PROSPECT.MNLYINC>0<N>4000</N></PROSPECT.MNLYINC>
75
+ <NAMEGROUP></NAMEGROUP>
76
+ <TYPE>A</TYPE>
77
+ <NAMEID></NAMEID>
78
+ <RMPROPID>0115</RMPROPID>
79
+ <EMP_COMPANY>
80
+ <N></N>
81
+ </EMP_COMPANY>
82
+ <EMP_JOBTITLE>
83
+ <N></N>
84
+ </EMP_JOBTITLE>
85
+ <EMP_JOBYRS>
86
+ <N></N>
87
+ </EMP_JOBYRS>
88
+ <EMP_PHONE>4085551231</EMP_PHONE>
89
+ <FIRSTNAME>William</FIRSTNAME>
90
+ <LASTNAME>Brewer</LASTNAME>
91
+ <PROSPECT.APPLDATE>3/11/2014</PROSPECT.APPLDATE>
92
+ <PROSPECT.OCCDATE>4/12/2015</PROSPECT.OCCDATE>
93
+ <NAME.MVIREASN></NAME.MVIREASN>
94
+ <PROSPECT.CURRRENT>0.00</PROSPECT.CURRRENT>
95
+ <PROSPECT.PROPOSEDRENT>.00</PROSPECT.PROPOSEDRENT>
96
+ <PROSPECT.RMRENTID>41</PROSPECT.RMRENTID>
97
+ <NOSSN>N</NOSSN>
98
+ <NAME.LICENSE>
99
+ <N>B123456789</N>
100
+ </NAME.LICENSE>
101
+ <APPCODE>APP</APPCODE>
102
+ <NAME.RESPROPID>0115</NAME.RESPROPID>
103
+ <CHKOPTOUT></CHKOPTOUT>
104
+ <NAME.OCCUPATION></NAME.OCCUPATION>
105
+ <MRIX_49_URL>
106
+ <N>~LINK=LOADMODALPAGE{VEHICLE,WEB_RMSHR,,&MENUNAME=WEB_RMHOME&MENUID=MRI_69&INHERITMENU=Y&WHERE=VEHICLE.NAMEID='URLSAFE{CLNTVAL{NAMEID}}'&RETURNCOMMAND=C&PASSED_NAMEID=URLSAFE{CLNTVAL{NAMEID}}}~EXPR=</N>
107
+ </MRIX_49_URL>
108
+ <MRIX_51_URL>
109
+ <N>~LINK=LOADMODALPAGE{APCRED,WEB_RMLEAS,,&MENUNAME=WEB_RMHOME&MENUID=MRI_69&INHERITMENU=Y&WHERE=NAME.NAMEID='URLSAFE{CLNTVAL{NAMEID}}'&RETURNCOMMAND=C&PASSED_NAMEID=URLSAFE{CLNTVAL{NAMEID}}}~EXPR=</N>
110
+ </MRIX_51_URL>
111
+ <UTILBILLLINK_URL>
112
+ <N>~LINK=LOADMODALPAGE{UTILBILL,WEB_RMLEAS,,&MENUNAME=WEB_RMHOME&MENUID=MRI_69&INHERITMENU=Y&NAMEGROUP=URLSAFE{CLNTVAL{NAMEID}}&RMPROPID=URLSAFE{CLNTVAL{RMPROPID}}}~EXPR=</N>
113
+ </UTILBILLLINK_URL>
114
+ <NAME.LASTDATE>4/12/2015 7:43:34 AM</NAME.LASTDATE>
115
+ <NAME.USERID></NAME.USERID>
116
+ <NAME.WHO>SS</NAME.WHO>
117
+ <NAME.QUALIFY>N</NAME.QUALIFY>
118
+ <NAME.PREVRESIDENCE>R</NAME.PREVRESIDENCE>
119
+ <NAME.INCOME>@@</NAME.INCOME>
120
+ <NAME.GUARANTOR>N</NAME.GUARANTOR>
121
+ <NAME.LOCATION>C</NAME.LOCATION>
122
+ <NAME.MARRIED>N</NAME.MARRIED>
123
+ <NAME.USIZE>00</NAME.USIZE>
124
+ <NAME.BACKGRNDSTATUS>A</NAME.BACKGRNDSTATUS>
125
+ <NAME.WEBNOCHECKS>N</NAME.WEBNOCHECKS>
126
+ <NAME.AUTOSPREAD>N</NAME.AUTOSPREAD>
127
+ </FORM>
128
+ <GRIDS/>
129
+ </TABLEDATA>
@@ -0,0 +1,14 @@
1
+ require 'paramedic'
2
+
3
+ def produce_hash(string)
4
+ hash = {}
5
+
6
+ pieces = string.split('&')
7
+
8
+ pieces.each do |piece|
9
+ sub = piece.split('=')
10
+ hash[sub[0]] = sub[1]
11
+ end
12
+
13
+ hash
14
+ end
@@ -0,0 +1 @@
1
+ REQUESTTYPE=SAVE&TABLE=undefined&GROUP=WEB_RMLEAS&PAGE=APPLY&ID=MRI_1&CMD=%3C%3Fxml%20version%3D%221.0%22%3F%3E%0D%0A%3CViewCommand%3E%3CGROUP%3EWEB_RMLEAS%3C%2FGROUP%3E%3CPAGE%3EAPPLY%3C%2FPAGE%3E%3CCOMMAND%3ESAVE%3C%2FCOMMAND%3E%3CPARMS%3E~GROUP%3DWEB_RMLEAS~MODAL%3DY~MENUNAME%3DWEB_RMHOME~MENUID%3DMRI_69~INHERITMENU%3DY~WHERE%3DNAME.NAMEID%3D''~RMPROPID%3D0115~NAMEGROUP%3D~NAME.RESPROPID%3D0115~PATH%3DC%3A%5CProgram%20Files%20(x86)%5CMriWeb%5C~URL%3D%2Fmripage.asp~%3C%2FPARMS%3E%3CCURRENTKEY%3E~NAMEID%3D~%3C%2FCURRENTKEY%3E%3CCURRENTORDERFLDS%3E~NAMEID%3D''~%3C%2FCURRENTORDERFLDS%3E%3CORDERBY%3E%3C%2FORDERBY%3E%3CWHERE%3ENAME.NAMEID%3D''%3C%2FWHERE%3E%3CUSERQRY%3E%3C%2FUSERQRY%3E%3CGROUP%3EWEB_RMLEAS%3C%2FGROUP%3E%3CMENUNAME%3EWEB_RMHOME%3C%2FMENUNAME%3E%3CMENUID%3EMRI_69%3C%2FMENUID%3E%3CPARENTMENUNAME%3E%3C%2FPARENTMENUNAME%3E%3CPARENTMENUID%3E%3C%2FPARENTMENUID%3E%3CFILTERID%3E%3C%2FFILTERID%3E%3CFORM%3EAPPLY%3C%2FFORM%3E%3CCMDBTNS%3E%3CBTNSAVE%3ECLNTCMD%7BSAVE%2CCLOSE%2CRETURN%7BCLNTCMD%7BRECALC%7D%7D%7D%3C%2FBTNSAVE%3E%3CBTNCANCEL1%3ECLNTCMD%7BCANCELCLOSE%7D%3C%2FBTNCANCEL1%3E%3C%2FCMDBTNS%3E%3CHIDE%3E%3CUTILBILLLINK%3EHIDE%3C%2FUTILBILLLINK%3E%3CCHKOPTOUT%3EHIDE%3C%2FCHKOPTOUT%3E%3CL_CHKOPTOUT%3EHIDE%3C%2FL_CHKOPTOUT%3E%3C%2FHIDE%3E%3CUPDATEABLE%3EY%3C%2FUPDATEABLE%3E%3CABANDON%3E%3C%2FABANDON%3E%3CDELETECOOKIES%3ECOOKIE_7%3B%3C%2FDELETECOOKIES%3E%3CCLIENTEXPR%3E%0D%0A%20%20%3C%2FCLIENTEXPR%3E%3CBASECLIENTEXPR%3E%0D%0A%20%20%3C%2FBASECLIENTEXPR%3E%3CHELPPAGE%3ERM%5CRM.htm%3C%2FHELPPAGE%3E%3CPATH%3EC%3A%5CProgram%20Files%20(x86)%5CMriWeb%5C%3C%2FPATH%3E%3CURL%3E%2Fmripage.asp%3C%2FURL%3E%3CCOMMENT%3E%0D%0A27837.5%3A%20Start%20GetWebHtmlAndData%0D%0A27837.7%20%20%20%20%20%200%20elapsed%20for%20%20%20%20%20BuildMenu%0D%0A27837.72%20%20%20%20%20%200.0156%20elapsed%20for%20%20%20Build%20HTML%0D%0A27837.72%20%20%20%20%20%200%20elapsed%20for%20CmdXml%20to%20Svr%0D%0A27837.73%20%20%20%20%20%200%20elapsed%20for%20cleargroup%0D%0A27837.73%20%20%20%20%20%200%20elapsed%20for%20GetData%201%0D%0A27837.75%20%20%20%20%20%200.0176%20elapsed%20for%20BaseQry%20SQL%0D%0A27837.77%20%20%20%20%20%200.0137%20elapsed%20for%20BaseQry%20Fetch%0D%0A27837.77%20%20%20%20%20%200.0312%20elapsed%20for%20ExecuteQuery%20total%0D%0A27837.78%20%20%20%20%20%200%20elapsed%20for%20Build%20DataXml%20(0%20Rows)%0D%0A27837.78%20%20%20%20%20%200.0469%20elapsed%20for%20GetData%0D%0A%20%20Evaluate%20Count%3A%2021%0D%0A%20%20SQL%20Time%3A%200.3398438%3C%2FCOMMENT%3E%3CAPPLID%3E%3C%2FAPPLID%3E%3C%2FViewCommand%3E%0D%0A&DATA=%3C%3Fxml%20version%3D%221.0%22%3F%3E%0D%0A%3CTABLEDATA%3E%3CFORM%3E%3CPRE_ADDRLEN%3E%3C%2FPRE_ADDRLEN%3E%3CCUR_ADDRLEN%3E%3C%2FCUR_ADDRLEN%3E%3CMRIX_54%3E%3CN%3E%3A%3A%20Application%20Details%20for%20William%20Brewer%3C%2FN%3E%3C%2FMRIX_54%3E%3CPRE_ADDRESS2%3E%3CN%3E%3C%2FN%3E%3C%2FPRE_ADDRESS2%3E%3CPRE_CITY%3E%3CN%3E%3C%2FN%3E%3C%2FPRE_CITY%3E%3CPRE_STATE%3E%3CN%3E%3C%2FN%3E%3C%2FPRE_STATE%3E%3CPRE_ZIP%3E%3CN%3E%3C%2FN%3E%3C%2FPRE_ZIP%3E%3CEMP_ADDRESS1%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_ADDRESS1%3E%3CEMP_CITY%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_CITY%3E%3CEMP_STATE%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_STATE%3E%3CEMP_ZIP%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_ZIP%3E%3CEMP_ADDRESS2%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_ADDRESS2%3E%3CGET_ADDR%3E%3C%2FGET_ADDR%3E%3CPRE_ADDRESS%3E%3CN%3E%3C%2FN%3E%3C%2FPRE_ADDRESS%3E%3CCUR_ADDRESS2%3E%3CN%3E%3C%2FN%3E%3C%2FCUR_ADDRESS2%3E%3CCUR_CITY%3E%3CN%3EMountain%20View%3C%2FN%3E%3C%2FCUR_CITY%3E%3CCUR_STATE%3E%3CN%3ECA%3C%2FN%3E%3C%2FCUR_STATE%3E%3CCUR_ZIP%3E%3CN%3E94040%3C%2FN%3E%3C%2FCUR_ZIP%3E%3CCUR_ADDRESS%3E%3CN%3E123%20Main%20Str.%3C%2FN%3E%3C%2FCUR_ADDRESS%3E%3CAPPFEE%3E%3CN%3E%24.00%3C%2FN%3E%3C%2FAPPFEE%3E%3CEMT_NAME%3E%3CN%3E%3C%2FN%3E%3C%2FEMT_NAME%3E%3CEMT_PHONE%3E%3CN%3E%3C%2FN%3E%3C%2FEMT_PHONE%3E%3CUTILBILLLINK%3E%3CN%3EUtility%20Billing%3C%2FN%3E%3C%2FUTILBILLLINK%3E%3CPREVNAMEID%3E%3C%2FPREVNAMEID%3E%3CNAME.BIRTHDAY%3E%3CN%3E3%2F27%2F1963%3C%2FN%3E%3C%2FNAME.BIRTHDAY%3E%3CSSN%3E%3CN%3E999999992%3C%2FN%3E%3C%2FSSN%3E%3CPROSPECT.MNLYINC%3E0%3CN%3E4000%3C%2FN%3E%3C%2FPROSPECT.MNLYINC%3E%3CNAMEGROUP%3E%3C%2FNAMEGROUP%3E%3CTYPE%3EA%3C%2FTYPE%3E%3CNAMEID%3E%3C%2FNAMEID%3E%3CRMPROPID%3E0115%3C%2FRMPROPID%3E%3CEMP_COMPANY%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_COMPANY%3E%3CEMP_JOBTITLE%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_JOBTITLE%3E%3CEMP_JOBYRS%3E%3CN%3E%3C%2FN%3E%3C%2FEMP_JOBYRS%3E%3CEMP_PHONE%3E4085551231%3C%2FEMP_PHONE%3E%3CFIRSTNAME%3EWilliam%3C%2FFIRSTNAME%3E%3CLASTNAME%3EBrewer%3C%2FLASTNAME%3E%3CPROSPECT.APPLDATE%3E3%2F11%2F2014%3C%2FPROSPECT.APPLDATE%3E%3CPROSPECT.OCCDATE%3E4%2F12%2F2015%3C%2FPROSPECT.OCCDATE%3E%3CNAME.MVIREASN%3E%3C%2FNAME.MVIREASN%3E%3CPROSPECT.CURRRENT%3E0.00%3C%2FPROSPECT.CURRRENT%3E%3CPROSPECT.PROPOSEDRENT%3E.00%3C%2FPROSPECT.PROPOSEDRENT%3E%3CPROSPECT.RMRENTID%3E41%3C%2FPROSPECT.RMRENTID%3E%3CNOSSN%3EN%3C%2FNOSSN%3E%3CNAME.LICENSE%3E%3CN%3EB123456789%3C%2FN%3E%3C%2FNAME.LICENSE%3E%3CAPPCODE%3EAPP%3C%2FAPPCODE%3E%3CNAME.RESPROPID%3E0115%3C%2FNAME.RESPROPID%3E%3CCHKOPTOUT%3E%3C%2FCHKOPTOUT%3E%3CNAME.OCCUPATION%3E%3C%2FNAME.OCCUPATION%3E%3CMRIX_49_URL%3E%3CN%3E~LINK%3DLOADMODALPAGE%7BVEHICLE%2CWEB_RMSHR%2C%2C%26amp%3BMENUNAME%3DWEB_RMHOME%26amp%3BMENUID%3DMRI_69%26amp%3BINHERITMENU%3DY%26amp%3BWHERE%3DVEHICLE.NAMEID%3D'URLSAFE%7BCLNTVAL%7BNAMEID%7D%7D'%26amp%3BRETURNCOMMAND%3DC%26amp%3BPASSED_NAMEID%3DURLSAFE%7BCLNTVAL%7BNAMEID%7D%7D%7D~EXPR%3D%3C%2FN%3E%3C%2FMRIX_49_URL%3E%3CMRIX_51_URL%3E%3CN%3E~LINK%3DLOADMODALPAGE%7BAPCRED%2CWEB_RMLEAS%2C%2C%26amp%3BMENUNAME%3DWEB_RMHOME%26amp%3BMENUID%3DMRI_69%26amp%3BINHERITMENU%3DY%26amp%3BWHERE%3DNAME.NAMEID%3D'URLSAFE%7BCLNTVAL%7BNAMEID%7D%7D'%26amp%3BRETURNCOMMAND%3DC%26amp%3BPASSED_NAMEID%3DURLSAFE%7BCLNTVAL%7BNAMEID%7D%7D%7D~EXPR%3D%3C%2FN%3E%3C%2FMRIX_51_URL%3E%3CUTILBILLLINK_URL%3E%3CN%3E~LINK%3DLOADMODALPAGE%7BUTILBILL%2CWEB_RMLEAS%2C%2C%26amp%3BMENUNAME%3DWEB_RMHOME%26amp%3BMENUID%3DMRI_69%26amp%3BINHERITMENU%3DY%26amp%3BNAMEGROUP%3DURLSAFE%7BCLNTVAL%7BNAMEID%7D%7D%26amp%3BRMPROPID%3DURLSAFE%7BCLNTVAL%7BRMPROPID%7D%7D%7D~EXPR%3D%3C%2FN%3E%3C%2FUTILBILLLINK_URL%3E%3CNAME.LASTDATE%3E4%2F12%2F2015%207%3A43%3A34%20AM%3C%2FNAME.LASTDATE%3E%3CNAME.USERID%3E%3C%2FNAME.USERID%3E%3CNAME.WHO%3ESS%3C%2FNAME.WHO%3E%3CNAME.QUALIFY%3EN%3C%2FNAME.QUALIFY%3E%3CNAME.PREVRESIDENCE%3ER%3C%2FNAME.PREVRESIDENCE%3E%3CNAME.INCOME%3E%40%40%3C%2FNAME.INCOME%3E%3CNAME.GUARANTOR%3EN%3C%2FNAME.GUARANTOR%3E%3CNAME.LOCATION%3EC%3C%2FNAME.LOCATION%3E%3CNAME.MARRIED%3EN%3C%2FNAME.MARRIED%3E%3CNAME.USIZE%3E00%3C%2FNAME.USIZE%3E%3CNAME.BACKGRNDSTATUS%3EA%3C%2FNAME.BACKGRNDSTATUS%3E%3CNAME.WEBNOCHECKS%3EN%3C%2FNAME.WEBNOCHECKS%3E%3CNAME.AUTOSPREAD%3EN%3C%2FNAME.AUTOSPREAD%3E%3C%2FFORM%3E%3CGRIDS%3E%3C%2FGRIDS%3E%3C%2FTABLEDATA%3E%0D%0A
@@ -29,11 +29,11 @@ module Paramedic
29
29
  ',' => '%2C',
30
30
  ';' => '%3B',
31
31
  '#' => '%23',
32
- '&' => '%24',
32
+ '&' => '%26',
33
33
  '@' => '%40',
34
34
  #'%' => '%25', # Surprisingly, this one doesn't appear to be replaced. We'll need to confirm.
35
35
  '+' => '%2B',
36
- '$' => '%26',
36
+ '$' => '%24',
37
37
  '<' => '%3C',
38
38
  '>' => '%3E',
39
39
  #'~' => '%25', # Tilde too.
@@ -1,3 +1,3 @@
1
1
  module Paramedic
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -9,21 +9,34 @@ module Paramedic
9
9
  end
10
10
 
11
11
  def to_xml
12
- xml_document = Nokogiri::XML(xml, &:noblanks)
12
+ strip_tag_spacing(
13
+ escape_specified_tags(
14
+ Nokogiri::XML(remove_naked_ampersands(xml), &:noblanks)
15
+ )
16
+ )
17
+ end
18
+
19
+ private
20
+
21
+ def remove_naked_ampersands(text)
22
+ text.gsub('&', '&amp;')
23
+ end
24
+
25
+ def escape_specified_tags(xml_document)
13
26
  escape_tags.each do |escape_tag|
14
27
  xml_document.css(escape_tag).each do |element|
15
28
  strip_tag_spacing(element)
16
29
  element.inner_html = CGI.escape_html(element.inner_html)
17
30
  end
18
31
  end
19
- strip_tag_spacing(xml_document)
20
- end
21
32
 
22
- private
33
+ xml_document
34
+ end
23
35
 
24
- def strip_tag_spacing(xml)
25
- xml.to_xml(
26
- save_with: Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS
36
+ def strip_tag_spacing(xml_document)
37
+ xml_document.to_xml(
38
+ save_with: Nokogiri::XML::Node::SaveOptions::AS_XML |
39
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS
27
40
  )
28
41
  end
29
42
 
data/paramedic.gemspec CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'nokogiri'
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.6'
24
- spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'cucumber'
25
25
  spec.add_development_dependency 'guard'
26
26
  spec.add_development_dependency 'guard-rspec'
27
27
  spec.add_development_dependency 'pry'
28
+ spec.add_development_dependency 'rake'
28
29
  spec.add_development_dependency 'rspec'
29
30
  end
@@ -5,6 +5,39 @@ module Paramedic
5
5
  describe '#to_s' do
6
6
  subject { described_class.new(args).to_s }
7
7
 
8
+ context 'with single characters' do
9
+ let(:args) {
10
+ {
11
+ 'char' => char
12
+ }
13
+ }
14
+
15
+
16
+ context 'with a $' do
17
+ let(:char) { '$' }
18
+
19
+ it 'correctly encodes the character' do
20
+ expect(subject).to eq 'char=%24'
21
+ end
22
+ end
23
+
24
+ context 'with a %' do
25
+ let(:char) { '%' }
26
+
27
+ it 'correctly encodes the character' do
28
+ expect(subject).to eq 'char=%25'
29
+ end
30
+ end
31
+
32
+ context 'with a &' do
33
+ let(:char) { '&' }
34
+
35
+ it 'correctly encodes the character' do
36
+ expect(subject).to eq 'char=%26'
37
+ end
38
+ end
39
+ end
40
+
8
41
  context 'with a single parameter' do
9
42
  let(:args) {
10
43
  {
@@ -8,8 +8,54 @@ module Paramedic
8
8
  context 'with no escape tags specified' do
9
9
  let(:escape_tags) { [] }
10
10
 
11
- let(:xml) {
12
- <<-end_of_xml
11
+ context 'with a space between tags' do
12
+ let(:xml) {
13
+ <<-end_of_xml
14
+ <root>
15
+ <a>value1</a>
16
+ <b>value2</b>
17
+ </root>
18
+ end_of_xml
19
+ }
20
+
21
+ it 'strips the spaces between tags' do
22
+ expect(subject).to eq "<?xml version=\"1.0\"?>\n<root><a>value1</a><b>value2</b></root>\n"
23
+ end
24
+
25
+ it 'has a newline after the declaration' do
26
+ expect(subject).to include("<?xml version=\"1.0\"?>\n")
27
+ end
28
+
29
+ it 'has a newline at the end of the document' do
30
+ expect(subject[-1]).to eq "\n"
31
+ end
32
+ end
33
+
34
+ context 'when there are ampersands within the content' do
35
+ let(:expected_result) { <<-end_of_xml
36
+ <?xml version="1.0"?>
37
+ <root><MRIX_49_URL><N>~LINK=LOADMODALPAGE{VEHICLE,WEB_RMSHR,,&amp;MENUNAME=WEB_RMHOME&amp;MENUID=MRI_69&amp;INHERITMENU=Y&amp;WHERE=VEHICLE.NAMEID='URLSAFE{CLNTVAL{NAMEID}}'&amp;RETURNCOMMAND=C&amp;PASSED_NAMEID=URLSAFE{CLNTVAL{NAMEID}}}~EXPR=</N></MRIX_49_URL></root>
38
+ end_of_xml
39
+ }
40
+
41
+ let(:xml) {
42
+ <<-end_of_xml
43
+ <root>
44
+ <MRIX_49_URL>
45
+ <N>~LINK=LOADMODALPAGE{VEHICLE,WEB_RMSHR,,&MENUNAME=WEB_RMHOME&MENUID=MRI_69&INHERITMENU=Y&WHERE=VEHICLE.NAMEID='URLSAFE{CLNTVAL{NAMEID}}'&RETURNCOMMAND=C&PASSED_NAMEID=URLSAFE{CLNTVAL{NAMEID}}}~EXPR=</N>
46
+ </MRIX_49_URL>
47
+ </root>
48
+ end_of_xml
49
+ }
50
+
51
+ it 'incorporates the ampersands' do
52
+ expect(subject).to eq expected_result
53
+ end
54
+ end
55
+
56
+ context 'with complex xml' do
57
+ let(:xml) {
58
+ <<-end_of_xml
13
59
  <?xml version="1.0"?>
14
60
  <ViewCommand><GROUP>WEB_RMLEAS</GROUP><PAGE>OCCP</PAGE><COMMAND>SAVE</COMMAND><PARMS>~GROUP=WEB_RMLEAS~MENU=NONE~WHERE=NAME.NAMEID='{{id}}'~INFRAME=Y~PARENTMENUNAME=WEB_RMHOME~PARENTMENUID=MRI_69~PARENTSAVE=Y~PATH=C:\\Program Files (x86)\\MriWeb\\~URL=/mripage.asp~</PARMS>
15
61
  <CURRENTKEY>~NAMEID={{id}}~</CURRENTKEY>
@@ -64,29 +110,51 @@ module Paramedic
64
110
  </COMMENT>
65
111
  <APPLID></APPLID>
66
112
  </ViewCommand>
67
- end_of_xml
68
- }
113
+ end_of_xml
114
+ }
69
115
 
70
- it 'removes all but the first newline in between elements' do
71
- expect(subject.scan(/>\n</).count).to be 1
72
- end
73
-
74
- it 'does not collapse elements' do
75
- expect(subject.scan(/<USERQRY><\/USERQRY>/).count).to be 1
116
+ it 'does not collapse elements' do
117
+ expect(subject.scan(/<USERQRY><\/USERQRY>/).count).to be 1
118
+ end
76
119
  end
77
120
  end
78
121
 
79
122
  context 'with double encode tags specified' do
80
123
  let(:escape_tags) { ['COMMENT'] }
81
124
 
82
- let(:expected_result) { <<-end_of_xml
125
+ context 'when the encode tag content is text' do
126
+ let(:expected_result) { <<-end_of_xml
127
+ <?xml version="1.0"?>
128
+ <ViewCommand><COMMENT>\n a\nb\n </COMMENT></ViewCommand>
129
+ end_of_xml
130
+ }
131
+
132
+ let(:xml) {
133
+ <<-end_of_xml
134
+ <?xml version="1.0"?>
135
+ <ViewCommand>
136
+ <COMMENT>
137
+ a
138
+ b
139
+ </COMMENT>
140
+ </ViewCommand>
141
+ end_of_xml
142
+ }
143
+
144
+ it 'html escapes specified elements' do
145
+ expect(subject).to eq expected_result
146
+ end
147
+ end
148
+
149
+ context 'when the encode tag content is markup' do
150
+ let(:expected_result) { <<-end_of_xml
83
151
  <?xml version="1.0"?>
84
152
  <ViewCommand><COMMENT>&lt;html&gt;&lt;body&gt;&lt;p&gt;None&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</COMMENT></ViewCommand>
85
- end_of_xml
86
- }
153
+ end_of_xml
154
+ }
87
155
 
88
- let(:xml) {
89
- <<-end_of_xml
156
+ let(:xml) {
157
+ <<-end_of_xml
90
158
  <?xml version="1.0"?>
91
159
  <ViewCommand>
92
160
  <COMMENT>
@@ -97,14 +165,16 @@ end_of_xml
97
165
  </html>
98
166
  </COMMENT>
99
167
  </ViewCommand>
100
- end_of_xml
101
- }
168
+ end_of_xml
169
+ }
102
170
 
103
- it 'html escapes specified elements' do
104
- expect(subject).to eq expected_result
105
- puts subject
171
+ it 'html escapes specified elements' do
172
+ expect(subject).to eq expected_result
173
+ end
106
174
  end
107
175
  end
108
176
  end
109
177
  end
110
178
  end
179
+
180
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paramedic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Jaber
@@ -9,104 +9,118 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-09 00:00:00.000000000 Z
12
+ date: 2015-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - '>='
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">="
25
+ - - '>='
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bundler
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ~>
33
33
  - !ruby/object:Gem::Version
34
34
  version: '1.6'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ~>
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1.6'
42
42
  - !ruby/object:Gem::Dependency
43
- name: rake
43
+ name: cucumber
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - '>='
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ">="
53
+ - - '>='
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: guard
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - '>='
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - '>='
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: guard-rspec
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
74
+ - - '>='
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ">="
81
+ - - '>='
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: pry
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ">="
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
89
103
  - !ruby/object:Gem::Version
90
104
  version: '0'
91
105
  type: :development
92
106
  prerelease: false
93
107
  version_requirements: !ruby/object:Gem::Requirement
94
108
  requirements:
95
- - - ">="
109
+ - - '>='
96
110
  - !ruby/object:Gem::Version
97
111
  version: '0'
98
112
  - !ruby/object:Gem::Dependency
99
113
  name: rspec
100
114
  requirement: !ruby/object:Gem::Requirement
101
115
  requirements:
102
- - - ">="
116
+ - - '>='
103
117
  - !ruby/object:Gem::Version
104
118
  version: '0'
105
119
  type: :development
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
108
122
  requirements:
109
- - - ">="
123
+ - - '>='
110
124
  - !ruby/object:Gem::Version
111
125
  version: '0'
112
126
  description: Parameter handler
@@ -117,13 +131,19 @@ executables: []
117
131
  extensions: []
118
132
  extra_rdoc_files: []
119
133
  files:
120
- - ".gitignore"
121
- - ".rspec"
134
+ - .gitignore
135
+ - .rspec
122
136
  - Gemfile
123
137
  - Guardfile
124
138
  - LICENSE.txt
125
139
  - README.md
126
140
  - Rakefile
141
+ - features/encode_a_request.feature
142
+ - features/step_definitions/steps.rb
143
+ - features/support/command.xml
144
+ - features/support/data.xml
145
+ - features/support/env.rb
146
+ - features/support/expected_output.txt
127
147
  - lib/paramedic.rb
128
148
  - lib/paramedic/encoder.rb
129
149
  - lib/paramedic/version.rb
@@ -142,21 +162,27 @@ require_paths:
142
162
  - lib
143
163
  required_ruby_version: !ruby/object:Gem::Requirement
144
164
  requirements:
145
- - - ">="
165
+ - - '>='
146
166
  - !ruby/object:Gem::Version
147
167
  version: '0'
148
168
  required_rubygems_version: !ruby/object:Gem::Requirement
149
169
  requirements:
150
- - - ">="
170
+ - - '>='
151
171
  - !ruby/object:Gem::Version
152
172
  version: '0'
153
173
  requirements: []
154
174
  rubyforge_project:
155
- rubygems_version: 2.4.5
175
+ rubygems_version: 2.0.14
156
176
  signing_key:
157
177
  specification_version: 4
158
178
  summary: Parameter handler
159
179
  test_files:
180
+ - features/encode_a_request.feature
181
+ - features/step_definitions/steps.rb
182
+ - features/support/command.xml
183
+ - features/support/data.xml
184
+ - features/support/env.rb
185
+ - features/support/expected_output.txt
160
186
  - spec/paramedic/encoder_spec.rb
161
187
  - spec/paramedic/xml_masseuse_spec.rb
162
188
  - spec/spec_helper.rb