From 71192e479277f7ba6ce3ee9aa5f4d46949adadd4 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Thu, 9 May 2013 13:35:58 -0400 Subject: [PATCH 01/70] Add gemspec. --- rubypress.gemspec | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 rubypress.gemspec diff --git a/rubypress.gemspec b/rubypress.gemspec new file mode 100644 index 0000000..173afc8 --- /dev/null +++ b/rubypress.gemspec @@ -0,0 +1,14 @@ +$LOAD_PATH.push File.expand_path("../lib", __FILE__) + +Gem::Specification.new do |s| + s.name = "rubypress" + s.version = "0.0.2" + s.platform = Gem::Platform::RUBY + s.author = "Daniel Collis-Puro" + s.email = ["djcp@thoughtbot.com"] + s.homepage = "https://github.com/djcp/ruby-wordpress-api" + s.summary = "Easily access WordPress installations." + s.description = "Easily push to WordPress installations through the WordPress XML-RPC API." + + s.required_ruby_version = ">= 1.9.2" +end \ No newline at end of file From dc16140378d0f33ecaabbf3783dd5e0290a2aa26 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Thu, 9 May 2013 14:34:41 -0400 Subject: [PATCH 02/70] Modified gemspec, removed unnecessary files, using env variables for testing --- rubypress.gemspec | 5 +++++ rubypress.rb | 9 --------- spec/spec_helper.rb | 2 +- wordpress.yml.example => spec/wordpress.yml.example | 12 ++++++------ 4 files changed, 12 insertions(+), 16 deletions(-) delete mode 100644 rubypress.rb rename wordpress.yml.example => spec/wordpress.yml.example (55%) diff --git a/rubypress.gemspec b/rubypress.gemspec index 173afc8..7e9f3a0 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -11,4 +11,9 @@ Gem::Specification.new do |s| s.description = "Easily push to WordPress installations through the WordPress XML-RPC API." s.required_ruby_version = ">= 1.9.2" + + s.files = [ + "lib/rubypress.rb", + "lib/rubypress/client.rb" + ] end \ No newline at end of file diff --git a/rubypress.rb b/rubypress.rb deleted file mode 100644 index 36055a9..0000000 --- a/rubypress.rb +++ /dev/null @@ -1,9 +0,0 @@ -# encoding: UTF-8 - -$LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__)) - -require 'lib/rubypress' - -cl = Rubypress::Client.new(:host => 'wordpress-trunk', :path => '/xmlrpc.php', :port => 80, :username => 'admin', :password => 'foobar', :use_ssl => false) - -puts cl.recent_posts(:number => 1) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8ffcd2b..08ca2db 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -13,7 +13,7 @@ end def load_config - YAML.load_file((File.exists?('./wordpress.yml')) ? './wordpress.yml' : './wordpress.yml.example') + YAML.load_file((File.exists?('./wordpress.yml')) ? './wordpress.yml' : 'wordpress.yml.example') end def init_wp_admin_connection diff --git a/wordpress.yml.example b/spec/wordpress.yml.example similarity index 55% rename from wordpress.yml.example rename to spec/wordpress.yml.example index 8dfc2c9..e62f995 100644 --- a/wordpress.yml.example +++ b/spec/wordpress.yml.example @@ -1,16 +1,16 @@ :wordpress_admin: - :host: blog.example.com + :host: ENV['WORDPRESS_HOST'] :path: /xmlrpc.php :port: 80 - :username: admin - :password: foobar + :username: ENV['WORDPRESS_ADMIN_USER'] + :password: ENV['WORDPRESS_ADMIN_PASS'] :use_ssl: false :wordpress_editor: - :host: blog.example.com + :host: ENV['WORDPRESS_HOST'] :path: /xmlrpc.php :port: 80 - :username: foo - :password: foobar + :username: ENV['WORDPRESS_EDITOR_USER'] + :password: ENV['WORDPRESS_EDITOR_PASS'] :use_ssl: false :wordpress_invalid: :host: blog.example.com From 545b371625ec12fddf9808b3f1727543d37af35b Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Thu, 9 May 2013 17:52:02 -0400 Subject: [PATCH 03/70] Testing passes, test for posts added, erb in YAML file for ENV vars. --- README.rdoc | 4 +++- lib/rubypress/client.rb | 2 +- rubypress-0.0.2.gem | Bin 0 -> 4096 bytes spec/rubypress_spec.rb | 8 +++++++- spec/spec_helper.rb | 3 ++- spec/wordpress.yml.example | 21 --------------------- 6 files changed, 13 insertions(+), 25 deletions(-) create mode 100644 rubypress-0.0.2.gem delete mode 100644 spec/wordpress.yml.example diff --git a/README.rdoc b/README.rdoc index 2132b5f..a32e9ca 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,7 +1,9 @@ -= rubypress +sd= rubypress This implements the WordPress xmlrpc api as released in version 3.4. +WARNING: SSL is NOT enabled by default for ease of testing for those running mac systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client. + == Contributing to rubypress * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 42af9fa..2f3edf6 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -9,7 +9,7 @@ class Client def initialize(options = {}) opts = { :port => 80, - :use_ssl => true, + :use_ssl => false, :host => nil, :path => '/xmlrpc.php', :username => nil, diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..501ac96269bec527706349bf414a27d1741d19bc GIT binary patch literal 4096 zcmYdEEJ@TWNi5P!uVSDTFaQEG6B7my4Fu@4p@|V(4kB-8Y;0t}pkP2N2O*nVS`73( z&`ISPsi`^05@>8f@?ftac@9ncVCBkpb1*z%?+IjJeiN3RecM3f?(;uf7kTG2JXcfZ zRlShAH2UU(#Y;;JG!FhKoXa6{b8^b2yf6Fx_4iL%^0vL~uAAPLP3Lw_diU5v_uxl6 z?Z>m57@sqC$J;dWF7-W@Z0l8g{Ne16j(^vFyjWo)wb$YBa*ktLCv|t6d>qcrP}F|E zcF*iP_DTAJ7gYQW=lWl~zWVa@_PzI3Z~pw4|KZV(SC=nXQqyRB(f%k)lZdgD?n3#t z<@3+mwLMH|@bX%c6Ohfij8ikXVtcOV`r{9(J0%s~AD^^A>83vio7Nt-^-m*$&&MwL zf5YSVzuQgr-;4{+|CQ(GcRTmjeuj_Q?%)5_a}NKFf0pUV5F57Y#a96@50&>nJEyhJ zQ4--i=)@Mt#p649PLK!7xy-|^o=VrBP0}q=t1*dv62t4NB37hf`C_@F@|^WW)1*wE z%sH`MWYY>2C7ma$3=TU4$+A05a+s0SsN7WVWUqf^qm1mr`0dPZ8zvkvNmzcOrJ?WM zqQeXCH+(Z_O&5H4VNu8$uH`ef1c>f(+FSd%g!Sm654)sa%`sbRqPfmk`csJC^?6J- z_k|Bki|OmUlDTh-+`Th-1=2c=XJ2cDus(3ubl}OF?!vX)2HBg{oKLUvY&V@5mi=_e zVYAApey)OVD~i^AH*DBFJ=1CP)LG>I?UrC6C>;@4R7tMu=mWf673#qp*){$4&8%-H;u(c7Z-)?%fbxXkS8DHzR z%;CLZwdk_cCUSFdPO8;JLJ|wF(^Fn0W(#Bco6Zi#` ze{(8cs`=~jXnAF4q2C1tsgxxlT+`>QTG7S(IcnKl?zCm8MLx~k8`GNhPZM+eti9aS zZKG`S>D77%`URbzWnC*d{rjbC+PLbNhdA~+_@o~(oj8P zHvjvhU%z#|s@+-}ZeSo(s<&!)=s(q|9+E3dR|cFj*uiY7cJoy;*ADN5&F&oSXKy;9ua)E_ zdP({63Xe01;qQ~O_@0`#DF{o?-m>%LHpy~}#m7#Y$b`zN?^b(%$>yTfb>j;Yaz5$L zQCjpU=0fqY@ag(tB2PZ7ymvbJW@ciX{IN1x4ceWQD8-%q~krlY^Zf3&FH$mrquz4Y?Zpq-`vFTP;) oc357Yb?`ng4S)(f`CDhi4OvhV#3*kx1V%$(Gz3ONU_^uf0KrANzW@LL literal 0 HcmV?d00001 diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index 36954f1..ad53143 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -12,6 +12,12 @@ init_wp_editor_connection.get_options.class.should == Hash - expect { init_wp_invalid_connection.get_options }.should raise_error(XMLRPC::FaultException) + expect { init_wp_invalid_connection.get_options }.to raise_error end + + it 'can pull the latest posts' do + init_wp_editor_connection.recent_posts(:number => 1).class.should == Array + end + + end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 08ca2db..784206c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,6 +3,7 @@ require 'rspec' require 'yaml' require 'rubypress' +require 'erb' # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. @@ -13,7 +14,7 @@ end def load_config - YAML.load_file((File.exists?('./wordpress.yml')) ? './wordpress.yml' : 'wordpress.yml.example') + YAML.load(ERB.new(File.read('./spec/wordpress.yml')).result) end def init_wp_admin_connection diff --git a/spec/wordpress.yml.example b/spec/wordpress.yml.example deleted file mode 100644 index e62f995..0000000 --- a/spec/wordpress.yml.example +++ /dev/null @@ -1,21 +0,0 @@ -:wordpress_admin: - :host: ENV['WORDPRESS_HOST'] - :path: /xmlrpc.php - :port: 80 - :username: ENV['WORDPRESS_ADMIN_USER'] - :password: ENV['WORDPRESS_ADMIN_PASS'] - :use_ssl: false -:wordpress_editor: - :host: ENV['WORDPRESS_HOST'] - :path: /xmlrpc.php - :port: 80 - :username: ENV['WORDPRESS_EDITOR_USER'] - :password: ENV['WORDPRESS_EDITOR_PASS'] - :use_ssl: false -:wordpress_invalid: - :host: blog.example.com - :path: /xmlrpc.php - :port: 80 - :username: fasddfasdoo - :password: foobar - :use_ssl: false From 7be6cfd18384234de5bc840279e72b74e140ee01 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Fri, 10 May 2013 15:05:11 -0400 Subject: [PATCH 04/70] Add deep_merge, test_client method, and newPost method. --- lib/rubypress.rb | 16 ++++++++++ lib/rubypress/client.rb | 63 ++++++++++++++++++++++++++++++++++++---- rubypress-0.0.2.gem | Bin 4096 -> 4608 bytes spec/rubypress_spec.rb | 15 ++++++---- 4 files changed, 84 insertions(+), 10 deletions(-) diff --git a/lib/rubypress.rb b/lib/rubypress.rb index d3a5f3a..0d595a3 100644 --- a/lib/rubypress.rb +++ b/lib/rubypress.rb @@ -4,3 +4,19 @@ require 'xmlrpc/client' require 'rubypress/client' + +class Hash + + def deep_merge!(other_hash) + other_hash.each_pair do |k,v| + tv = self[k] + self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v + end + self + end + + def deep_merge(other_hash) + dup.deep_merge!(other_hash) + end + +end \ No newline at end of file diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 2f3edf6..8ab3685 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -1,4 +1,5 @@ -# encoding: UTF-8 +require 'yaml' +require 'erb' module Rubypress @@ -31,7 +32,15 @@ def connect @connection = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,nil,nil,self.use_ssl,nil) end - def get_options(options = {}) + def self.config + YAML.load(ERB.new(File.read('./spec/wordpress.yml')).result) + end + + def self.testClient + @client = self.new(config[:wordpress_admin]) + end + + def getOptions(options = {}) opts = { :blog_id => 0, :username => self.username, @@ -47,7 +56,26 @@ def get_options(options = {}) ) end - def recent_posts(options = {}) + def getPost(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :post_type => 'post', + :post_status => 'publish', + :fields => self.default_post_fields + }.merge(options) + self.connection.call( + "wp.getPost", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id], + opts[:fields] + ) + end + + def getPosts(options = {}) opts = { :blog_id => 0, :username => self.username, @@ -58,7 +86,7 @@ def recent_posts(options = {}) :offset => 0, :orderby => 'post_date', :order => 'asc', - :default_post_fields => self.default_post_fields + :fields => self.default_post_fields }.merge(options) self.connection.call( "wp.getPosts", @@ -73,10 +101,35 @@ def recent_posts(options = {}) :orderby => opts[:orderby], :order => opts[:order] }, - opts[:default_post_fields] + opts[:fields] ) end + def newPost(options = {}) + opts = { + :username => self.username, + :password => self.password, + :content => { + :post_type => "post", + :post_status => "publish", + :post_date => Time.now, + :post_format => "post", + :comment_status => "hold", + :ping_status => "closed" + } + }.deep_merge(options) + self.connection.call( + "wp.newPost", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:content] + ) + end + + + + end end diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 501ac96269bec527706349bf414a27d1741d19bc..13293e9174bf1dbcec8cc45af858766e8f751dd5 100644 GIT binary patch delta 1682 zcmV;D25tF(Ab=#0gBmh0HZ%Y*FfcGMFfcGMFfafxF*7qVF#sSilVJg5vjG7E0e>$) zjZpvt>{okl+cpsI-})4sH&hnj$qwSCg@HE9x&|GPqCt=WD}q3vCE6lNJw{UYyfxo_ z$A=|Kw$m1^+YB%PTjt&I-oK;8=yb@d>8j*Jh>%Yo?O}~zos7r&39I`Yojf_Ne{1^D zcziT|ghu;trn@R3F$eR@ln{20+<(XT-QfNw>qkWLxJYO|pP)ak&wqaAc|TpeJ^L-X zJiC4!R=G&&O!m(yBVj^$jx*AaqVwM`UPVz5pekq3Hpn?a^O#i$Io)-{^EmmdqMRWA z?~L&>9>$E4T>1^YZpWJC#SDX)*I1;UhfqRh@F8WC5k4nB^b4619;LtyfPafnvkwW5 z)2PIhqohC|-VYWZv;;zOfu18l*zD&0ttHtV(B&eeBEqMAWiddHAEP$mR7o@*^cMk| zpoLaL^2A#!^UQX`;|+(Cstk7rq;c zHR@J4V-5%jp91c(BB>ZbSAXjUQN3)i_)>R@?p`b&MJ6dsizdP-=D5X*umh8hXM;1_@gS4>7FoQh_YutfV|P(^bpDQ5H^ zKvk*C3c&BbcY(z;&@{nrk#PY%e}SHj1`W{~Q}h{Tf;cSYtD@(WIe%2;x}y3+GsVI( zE&aAa9n-dxCd5t7mN=Erjjss)z?Xz)0-iCnY>`zHdjhS1eziqNQ1`If$p&2P8poD=!hwB09yaLS5#L^TFRJ5bYVuO0YlHGh{QQ#%3Z`4oIKWe#J^ zSijcPTb5xHTyKDCj%hg?$L$8AhQXl2s5`&Quzs!G-Ja!3XtjrtVhu96Dzzdzp*mc+ zSY;&)znU^CQdguIaJzv06$+>Fwb!a?cj+d*J$`l<^ML^7i>sMe*%YpS;2ydD6|zeMhD#loc|BEm9qs+gjl6v!MZ(&%>E>&@574j4$q~U9Z%0=AMG}EM~R{speNA z*EAzxUMx2yW(Ci%++ip#vJ4z_ZKVZEI)>o=-j#@1AvQ?TYl>9E#(hiuT$)jZpvt#8X|1)G!o%&#%Zn%~RUWEP@sk zWfc(=h80v4DQSAAy=%TqQr-FY-lX%f>bkF{h4v=ro}7DfBZS}=Vea>}>u*4%_BEKc zeeXfx4wX#kEVI%;%QMIah>`t(5NW=>C-K9w#5gBt01YxyDut(d_7uT25c4Af!%B5{dZBS2oB*h)uJ; z6wM>CZg|tQ<*l0I;Gfw59_#>CA;cvOq6+9!(f3M5)O+sdIPv88M;C@|u9~BbNorjz zi9Aig%_Bi3xP$rh?yb1qUQxX-wtsIb21cUJMGZH~Kc^BYBlRv-${7Z?pynideNX|n z32gT06b9La!KrSCN6hj^gc|$$bRbpe|D39oMzATbOwNFpBN;QLb*QpJFTlH)Nq_zXG!%=>IlD!8o|W>A#ByG?w7T2 z7e|STuE|KA23H6<`&;t5dR%QTS;Wzz9lLL^Cs@3Dh0j=m&Bn;EKXtlPD!1-G8ogo( c==9Gm_zM64|NjF3m?}pBF|z^+{sjU60B3tCP5=M^ delta 1390 zcmV-!1(EuIB!D20gBme3GBf}%FfcGMFfcGMFfafxF*7qVFaRJhlVJg5vjG7E0e|EN zj8Oms>{e@Q+b|T}=llxM4V-}ICL;|c&~2q#*`TAPbTBBv_;H;G6xowxvTpRhPcOfe zr0s`x-9|37vd+1Z?&C-;!SOyT0(wwUUd7$>UcG0CI=leY~68KYwB`5zr)0F`ZA**Q?XlhrQmbv-9H*;l=UQr=X;K zfiuxR#RP&BGa4k&iy}_OeVYg|0it2{a@y3Nq+!cR;uXr z5K2fS@A-+Ahnyl53Bf`JQ3?!AlbljW1kP#0MM)yp=8`RPCVVtqfvZy2?Eaa*%!$49U2SSoSm|}q=f`39kFVwLd9id;h1MPs2#57>1 z$b^87-lD^y-+=Zog=Z1r(0`&-tO}=?v``hgLcM+SbOptt@VXo7oHngADXudc@>EXO zo&r4I6Tp^Sj)~N1zO)|R%x-WSEP>7IDpUpFK(fH(tc!823ovW5CPT}rNryF=R%_*? z!!~(Zj|y=1sB*6NF@U?5X+pD=nsVNvYZ`3SL`S#`P z^5SGVHPR0#ton8R{H9obQ*&Q6xc$@4QvrkZ2<9L{+rtMcIwtu%#9C0pEfVbXYKs^< zooe~iK}ab+L~KpXf+QlOU+=WHDgv3^xmmO4qna`Ovw6(ch+0#=L)0>I2^&`x?uIfm zNMsYWR{oMYYuSpMLVs^$@4UmxzfYp%hA(4+`J(MY%VjK|V9Ac!@#R^@LAX)Nvw_7o z^;uyW3GiG8O-DTO?tiAXUC&2Q%!O*w6X~VtuiJv^wX{(CnDu_NoDJAIqSG4VXy#p? zrcYMGdhYl%U9(OG*x=>(%xZ^Qw<>qMo1KfJ2leZ@|54f5&J=dGvz2=v$z86L(pQ{F z$=b8y+3{Kk!Oz0j?n~F+f=cyUFm?UWgTfsunb28grGc7fkPi?e`w1b^eEmq`r+JBS zPS5}vWTaFImz=7oiVgExrk#HaW~OCwOoI!tW`e(#7D4kXr!_{g9fQlOF2IiwL*{DH zb{J|-U#1|WMhy~)`0F>;$wY`vwLTZsGf`des;Z~AsE&hwVI6p|9ax1B=QM~apih&& zH!`B$b3ev`C&xd#&~0&cSH(-7R)6J&sUn41sp#r5`z>V1E;eOE9r5_K-B zyH)-rl}H(>b*WI!Ft`IXCfVwP3b;#Pvqwu9WD`24njIc7^B)mvY|G_9iqJlsDwRgC zDX$F9fR{ZPGo<8WU6wtjVQjOAG7Fos#4jphN)^&0)2K+yVOQ^BY7XT$h9DCgo3y#f zwi$OgqsGfL9914CyC#3{(mc^R*E7(NZ1OLhBBJ74&~wIDmoHWnRkeCt*33OQN>p@Bdh#^5iIB6uC9jL;#pawv>@C{9`3`%6 w#rs$IgeBN$j12pw)1^|mb^p=m1xrAue`>+s00030{{sLY+ROnLv;PbK1@VleIRF3v diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index ad53143..3342c04 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -10,14 +10,19 @@ init_wp_admin_connection.class.should == Rubypress::Client init_wp_admin_connection.connection.class.should == XMLRPC::Client - init_wp_editor_connection.get_options.class.should == Hash + init_wp_admin_connection.getOptions.class.should == Hash - expect { init_wp_invalid_connection.get_options }.to raise_error + expect { init_wp_invalid_connection.getOptions }.to raise_error end - it 'can pull the latest posts' do - init_wp_editor_connection.recent_posts(:number => 1).class.should == Array + it 'can use getPosts and getPost' do + client = init_wp_editor_connection + posts = client.getPosts(:number => 1) + posts.class.should == Array + + id = posts[0]["post_id"] + client.getPost(:post_id => id).class.should == Hash end - + end From 24a706c69482a1691323861440ae1e1b668e9628 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Fri, 10 May 2013 15:37:36 -0400 Subject: [PATCH 05/70] NewPost and getUsersBlogs tests integrated --- lib/rubypress/client.rb | 12 +++++++++++- rubypress-0.0.2.gem | Bin 4608 -> 4608 bytes spec/rubypress_spec.rb | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 8ab3685..54f3c32 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -127,7 +127,17 @@ def newPost(options = {}) ) end - + def getUsersBlogs(options = {}) + opts = { + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getUsersBlogs", + opts[:username], + opts[:password] + ) + end end diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 13293e9174bf1dbcec8cc45af858766e8f751dd5..9643a0a50dfd9375723c2616411c0c85b55a6a57 100644 GIT binary patch delta 1161 zcmV;41a|v?B!DE4gc&h0HUKa%FfcGMFfcGMFaR(yGcz$a03a}vVF6^b0RaO6e?Lf# zQ2+z%SbJ~VHW2UM`V^cuR2HDgHs&UUfi_FK1}%`HL68C)f7cBptD+>F2j%q19@Y@n!Fa5mu)5FT!L#4$?}|Pe zk4NJtXt)n&x~t*>mtcOG5W;Sdf4hy}4eke7KO>Swc}%nU1bw_X`SrQu{Bru?_>b`H z_~LC)WjvuX(LbS#1Tif$oRWSRp1eDK6Na9Ls*FL~AnOFpB38xZXx9GzQld$eXBmkE&9jDwqX^FC zz%BAp_-K;kTs{gc5_nXcs41Z+oGMcM`Q;w5@M^c$ivCh0TGII&pLS4qz(f3v94bxCyxdWr=_ zQn+n}DyD5Gb%>jsEpbYrOIH$H-xZ`xIXok1**rB8?s|G%2WGbDEO^#X3v|pX8J8*n z_Q(r#goZ0OEv}AqeHJz?ZWE`GSQ9!r)-l(5G@+|Y7okxl_br*NIWqEFc&)RhH7!y- zvFmnf%lzJSGg$fafBotC+3U$fw|d2Gv#TvS=R|zaZFffyPFX$=slvc;2WndFwF5t`f9A4eY9|0acfm(f<{-k1 z^=nPNWf3&N^?X!wbjz7It~MAo4EzqG?))yp__cO-dzR0j)xM7uE0Bp*p%j@3)#1X$ zDk`q|)s#`5*don<+Xd_gD4fjKUaO|urJMBj_}N{|?*uSkUCpdYr*QoPcVzpQ&t{y6 zuGe52eqO9UHW2UM`V^cuR2JaL4&tVTfi}y!1|5*1L689}fc6 zd^CQ9M*DE4yDA|u2lLC65O$B;f5-UU;QlA;M?~_tNN7Hvpg*q9e}3k9KV7^%`z^XW zyM7&3xk%|u_RlFJVM2M1Gt!Tu^WQICMNtr-Dre9($T>mtm{kcm-F3wCIQgrhoFM=2 zjPWua#*C6&`VGBq$C~BE41<~1SfrkZP(o(#A!U>iJ|{o)3z-rgrN9kqN>d##K+k}7ZG4K)mpBx{LI{1Hb@^o~-|F>8* z>Q*>o4hRXK0`9URsTe_5f9nQOy=<`fQg@2(UMwY#IKc_wXc8BBPGU)myy4+EhO-55 z%Yw@RnxutLj}pri9+e<^N@$7@%Yr9{8VSMR7k~#>OhzS~ie{9sMEhY-MRO`CX7nFG zRjJGh!0*3zfyFe?G{J6>aREJlfu4;94bd7?^ciM?I4tF>qUV%3e^lkVqWVKK#lkWz z{kB3K)3%c)#7)kYIF-+${4ym5l zbvw0XerdWHto-@rf8y%$n4KleZwIVyAI$XF| zWhD&1nldUowShzZa|8e^!)WN&K#WW@8b5m!{bl)|--cv+nehBDrQZOW+6_qGO^}4I^mwZJDMt zcK+ynN2V#16*7b^QXQGwTHx-pp#hiA!P~1 zY-u0QbKaG`@BLnNSci33hxO3ce*ypi0RR63025WIj{q360SwLovIqnM0xv(a1`7HI DU2rAb diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index 3342c04..9f8c0ef 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -24,5 +24,13 @@ client.getPost(:post_id => id).class.should == Hash end + it 'can use newPost method (with getUsersBlogs) to create a new post' do + + client = init_wp_editor_connection + user_blogs = client.getUsersBlogs + blog_id = user_blogs[0]["blogid"] + init_wp_editor_connection.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String + + end end From 378c1aceca50c38a0662817184894c3936d2e385 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Fri, 10 May 2013 17:10:20 -0400 Subject: [PATCH 06/70] Added ALL THE METHODS and NONE OF THE TESTS --- lib/rubypress/client.rb | 460 ++++++++++++++++++++++++++++++++++++++++ rubypress-0.0.2.gem | Bin 4608 -> 5120 bytes 2 files changed, 460 insertions(+) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 54f3c32..73767fb 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -107,6 +107,7 @@ def getPosts(options = {}) def newPost(options = {}) opts = { + :blog_id => 0, :username => self.username, :password => self.password, :content => { @@ -127,13 +128,472 @@ def newPost(options = {}) ) end + def editPost(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.editPost", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id], + opts[:content] + ) + end + + def deletePost(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.deletePost", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id] + ) + end + + def getPostTypes(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :filter => {}, + :fields => [] + }.deep_merge(options) + self.connection.call( + "wp.getPostTypes", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id], + :filter => {}, + :fields => [] + ) + end + + def getPostFormats(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :filter => {} + }.deep_merge(options) + self.connection.call( + "wp.getPostFormats", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id], + :filter => {} + ) + end + + def getPostStatusList(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getPostStatusList", + opts[:blog_id], + opts[:username], + opts[:password] + ) + end + + def getTaxonomy(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :taxonomy => "categories" + }.deep_merge(options) + self.connection.call( + "wp.getTaxonomy", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:taxonomy] + ) + end + + def getTaxonomies(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getTaxonomies", + opts[:blog_id], + opts[:username], + opts[:password] + ) + end + + def getTerm(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :taxonomy => "categories" + }.deep_merge(options) + self.connection.call( + "wp.getTerm", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:taxonomy], + opts[:term_id] + ) + end + + def getTerms(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :taxonomy => "categories" + }.deep_merge(options) + self.connection.call( + "wp.getTerms", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:taxonomy], + opts[:filter] + ) + end + + def newTerm(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.newTerm", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:content] + ) + end + + def editTerm(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.editTerm", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:term_id], + opts[:content] + ) + end + + def deleteTerm(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :taxonomy => "categories" + }.deep_merge(options) + self.connection.call( + "wp.deleteTerm", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:taxonomy], + opts[:term_id] + ) + end + + def getMediaItem(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getMediaItem", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:attachment_id] + ) + end + + def getMediaLibrary(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getMediaItem", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:filter] + ) + end + + def uploadFile(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getMediaItem", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:data] + ) + end + + def getCommentCount(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getCommentCount", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id] + ) + end + + def getComment(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getComment", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:comment_id] + ) + end + + def getComments(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :filter => {} + }.deep_merge(options) + self.connection.call( + "wp.getComments", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:filter] + ) + end + + def newComment(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.newComment", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:post_id], + opts[:comment] + ) + end + + def editComment(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getCommentCount", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:comment_id], + opts[:comment] + ) + end + + def deleteComment(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.deleteComment", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:comment_id] + ) + end + + def getCommentStatusList(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getCommentStatusList", + opts[:blog_id], + opts[:username], + opts[:password] + ) + end + + def getOptions(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :options => [] + }.deep_merge(options) + self.connection.call( + "wp.getOptions", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:options] + ) + end + + def setOptions(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :options => [] + }.deep_merge(options) + self.connection.call( + "wp.setOptions", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:options] + ) + end + def getUsersBlogs(options = {}) opts = { + :blog_id => 0, :username => self.username, :password => self.password }.deep_merge(options) self.connection.call( "wp.getUsersBlogs", + opts[:blog_id], + opts[:username], + opts[:password] + ) + end + + def getUser(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :fields => [] + }.deep_merge(options) + self.connection.call( + "wp.getUser", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:user_id], + opts[:fields] + ) + end + + def getUsers(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :filter => {} + }.deep_merge(options) + self.connection.call( + "wp.getUsers", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:filter] + ) + end + + def getProfile(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :fields => [] + }.deep_merge(options) + self.connection.call( + "wp.getProfile", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:user_id], + opts[:fields] + ) + end + + def editProfile(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password, + :content => {} + }.deep_merge(options) + self.connection.call( + "wp.editProfile", + opts[:blog_id], + opts[:username], + opts[:password], + opts[:content] + ) + end + + def getAuthors(options = {}) + opts = { + :blog_id => 0, + :username => self.username, + :password => self.password + }.deep_merge(options) + self.connection.call( + "wp.getAuthors", + opts[:blog_id], opts[:username], opts[:password] ) diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 9643a0a50dfd9375723c2616411c0c85b55a6a57..00a36c5cdf042d4b6e65609046e4d78f439568cc 100644 GIT binary patch delta 1632 zcmV-m2A}zWB!DQ8gBmk1Gd2J)FfcGMFfcGMFfafxF*7qVF#sSilVJg5vjG7E0e=W$ zjZpvt>|1+J+&B>L-}@@=ZFwWW;1L`;7bAb&)b$gSd6jk_o9SAZgq`Z&56gHNYNzd!Hwemg!n z_|yGxaQfCsBNpH(9~@zV93LkU4AH=KkKP@>aoyn%q!AHe1FSo6m}&l z6ekGuzl0=-y={+R6!CsR&%-fi^*jQ_G;bjbdOZMqG!;K6c0-h0pkD@*2Y)DW1Hl~% zE&xT}LC_1_7~%x@6ny(Uy8Naj0N|J41z?Cw&pw|UlIaOLzjQEj;j4k1aR?qi24%u4 zDN$%JxEz8pxKzWS$nRx?^>lYe;~9nhG2>K`iV~<7= z@;IhZ!GoSB?xlho(}a(}IG{{kV#ot=Nf}aALQxpIqKU7mE@MReC6WiGguAi0%bj9G ze5HrZDjZ>sA;JHNtcvBdOyuv^o1w{RK~n_N1zH90;w5;#Gb)H?GJi>*Lc);6lDbNI zgo#C!s!M8rTURkB4&r`!KxNasJGF_koH=$%p|idu^hbS;l8}k3CqkBnMxvipuN%kI z7LCHtDr%0lS%Gn;0I*A*qb)RC*(q_grP;lrQ{onO8i|Zh86&efA4e0aV`(Q8L&<(g zW-dlXeh#m6uL(_ylz&(3Jee%1(yjd z7LCsl<5mVsOI6RTiE0w9!`V0=+J%0Iqw_gqULby=!|s+zIDaAZ!o?~Fb{1q!DZCcs zPbs)8nOq5xJ-5k^!p)8c2^r)gZC%AqVcgaT4XSMS)wC*fls#;?=0vl)8A9UM@e2o!OCu z`C)HHX*dzfzklHF+WOJylp$W#TFfoB7uWe*t`9ltR|OOsGOv}OX)4zXmsU}?;z^S1 zX=Ytu32UM?MadglQ1{C+g=Wc;V2`d33H?>GUvI#&7D(2EI!?-b0S!{S{Pq0 z@!eLe>dX>{ZJC^zBP4@gik#vQIT5{@m6*~bgnYq79)Ar(p`bliK#5(^?SeMAsPn*elS$y%UZxhFUk zRiz{Qf+;3k*Y>YBbC+Rjd;KFWuq|J6yx+mb#V$Ki6}p2?tJ6Ei$Tt16(h+~DHSQSS z|Ee@&P=BqsF9q@xexVT!ue%Y>+-RdWE@HEEK@%*>L|rIn);1c~nGv@F9=BTlYsMAV zT+x>Uh?4LpiCSUldLnj)A!c5=kCEziWI0@iCz@Rp7rH_(jmwYHEvG~+C>t|6aIoA2 zG&4JzjagGAzV~4HlT`A;*bW!-_ab88JC5#sSLm9D0FzE_W+%kMSgdNt+w) z`-Shyg)fce3sd=?^a0abV(LQg7rF!uvIbcj=A2ZZwTroW4ctOH|pX2 zjDJn*dkT8e{crJp5Zseae2~XB9%|MVsD;lziDB7mG3h3}94U<1s)Er}RghD5BTk$6 zd_Y=PCzMr&yyJU6^iWlJblUFIo~FN#(FS%h#?_~4U2=f^ z)n+|$ZkgDm3s%1#5utF9@_@ElQR)h6VQ3jhEB e|NjF3xp&~907A0?4CDc_2m}HG2x7Aa3i=20T?_aC delta 1164 zcmV;71atd{xqm+cpsI-})4sH&hm&$u{ODg@HCpy9OqJp0K*l;lZ=t>hFp^ z8jnZgCuq12XS%E60+(QZnGnKmkbk?4-wo~uSwAC^MR`oK`2>BuIQjLtxdoQPpC^A_{OaS)2h3_hd?Q&P^!PyJjZqzn__dVj!0sM!Yu zM@d*O-u|O{nCv0~4>B^AI4(MVLP#)r=zO?9}r%zFva3m!f5Bdua zP0&KAAzAFKl{tF5;qivUaa9Dn15!HR&tB@!Z2X&qKlB*51^)+!qr(pVpB)ZIkNE#T zR*kw9PMHNlQceMPX&zUMpnvmqgUDXiSbVKIMRhM0q6|xdV^X3?lxG=<1kJOChocD2 z=D;oTQut_+OgTIwXxTh967G6>T?b~i=qz~FPz!X-DjAn5 z0rtoXbcBX0H!ZG?bbS^!Ep8L1kysNtI@U4QdNiS{OBbP0CHF0vtvNFCTX?OrrZp{6 zJ+bR{YRmlIbTe4_^MC#6`Pu8qM7MsBk!8QmpWh_QZ*uO-0^1)uPD$`KJy^RsqjTfM zU&rrH1D4~s|K|LaGOO-ZiMYNS40u7JflQ|U3AX|mdmeB(52?bya0hBy?X?3xt$*gSWNIe>J$J!JQ|2JT zjP+|xy=4(J!S#Gpb9Bp@IIcDrH4OX?qwf4J!}zs!cYBu4pw+&Q6f2O4RiPA_3Dx1k z#VRVU`PGzBp4cMIfZGM^2PmA(*Iuip+@+iJ_W0Rd%*pL@)?hk^ifg-|!(%NvT+E7U-_p)x%Kjx9p6 z%caN#O-YdD%T0+{UZz;=Fcjr!3J%(~lAOgIL+~PROHf2C=Opem)u{1dzmDD)B&I@p zovfxFH;>Sdpq9S^qj#O7U)3!SlDn4Iy>8UE=V>z^*1rgxZ~Z#?xE|Nz`hnJe0ssI2 e|NjF3jWTew02s3&2($sR3IqZIKS;9%4EhJCI43~> From dce062a4ebe395ad0417473bf5ad6167b3a4b8c5 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Mon, 13 May 2013 09:57:21 -0400 Subject: [PATCH 07/70] Fix readme --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index a32e9ca..7d7565b 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,4 +1,4 @@ -sd= rubypress += rubypress This implements the WordPress xmlrpc api as released in version 3.4. From b73f249db451a54b46a0ff3a435960a91df1cf2d Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 15 May 2013 10:58:00 -0400 Subject: [PATCH 08/70] Add VCR, README updates. --- Gemfile | 4 +- Gemfile.lock | 8 + README.rdoc | 43 +++++- lib/rubypress/client.rb | 8 +- rubypress-0.0.2.gem | Bin 5120 -> 5120 bytes spec/cassettes/getOptions.yml | 244 +++++++++++++++++++++++++++++++ spec/cassettes/getPosts.yml | 165 +++++++++++++++++++++ spec/cassettes/getUsersBlogs.yml | 99 +++++++++++++ spec/rubypress_spec.rb | 44 +++--- spec/spec_helper.rb | 1 + spec/vcr_setup.rb | 24 +++ 11 files changed, 610 insertions(+), 30 deletions(-) create mode 100644 spec/cassettes/getOptions.yml create mode 100644 spec/cassettes/getPosts.yml create mode 100644 spec/cassettes/getUsersBlogs.yml create mode 100644 spec/vcr_setup.rb diff --git a/Gemfile b/Gemfile index bf9029f..8ff466f 100644 --- a/Gemfile +++ b/Gemfile @@ -6,4 +6,6 @@ group :development do gem "bundler" gem "jeweler" gem "simplecov" -end + gem "webmock" + gem "vcr" +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index f1ed0bb..4d9fc4c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,8 @@ GEM remote: http://rubygems.org/ specs: + addressable (2.3.4) + crack (0.3.2) diff-lcs (1.1.3) git (1.2.5) jeweler (1.8.3) @@ -25,6 +27,10 @@ GEM multi_json (~> 1.0.3) simplecov-html (~> 0.5.3) simplecov-html (0.5.3) + vcr (2.4.0) + webmock (1.11.0) + addressable (>= 2.2.7) + crack (>= 0.3.2) PLATFORMS ruby @@ -35,3 +41,5 @@ DEPENDENCIES rdoc rspec simplecov + vcr + webmock diff --git a/README.rdoc b/README.rdoc index 7d7565b..0727bd9 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,10 +1,45 @@ = rubypress -This implements the WordPress xmlrpc api as released in version 3.4. +This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. + +WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. + + +== Getting Started + +1. Install the gem using specific_install + +A. To your system + +`gem install specific_install` +`gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` + +B. Or using Bundler + +Inside your Gemfile: + +`gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` + +2. Create a new client + +`>wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword")` + +3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) + +`>wp.getOptions +=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} +(just a small excerpt of actual options for the sake of the whole brevity thing)` + +`>wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) +=> "24" +(returns a post ID if post was successful) + +To make further requests, check out the documentation - this blog should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). -WARNING: SSL is NOT enabled by default for ease of testing for those running mac systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client. == Contributing to rubypress + +We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. @@ -12,11 +47,13 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running mac * Start a feature/bugfix branch. * Commit and push until you are happy with your contribution. * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. -* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it. + == Credits * Dan Collis-Puro (dan@collispuro.com) +* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) + == Copyright and License diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 73767fb..0cc7033 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -44,15 +44,14 @@ def getOptions(options = {}) opts = { :blog_id => 0, :username => self.username, - :password => self.password, - :options => [] - }.merge(options) + :password => self.password + }.deep_merge(options) self.connection.call( "wp.getOptions", opts[:blog_id], opts[:username], opts[:password], - opts[:options] + opts[:options] = nil ) end @@ -513,7 +512,6 @@ def getUsersBlogs(options = {}) }.deep_merge(options) self.connection.call( "wp.getUsersBlogs", - opts[:blog_id], opts[:username], opts[:password] ) diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 00a36c5cdf042d4b6e65609046e4d78f439568cc..a6753c8356ace69adcf32a8c07b55af17baf63fd 100644 GIT binary patch delta 2185 zcmV;42zK{?D1a!Cg%~w505C8xFfcGMFfcGM05CB#Gch*+ATX0*0c5iQ0RsVlx1f_z z00Zn>dr#ar5bxjnDSX_iyDRMl5R|J{YB|akwGs%#QRz+yMc%|qtU8a29VplG-OsNi zPO=Z^C7ZCt5(Ljo?3v#@Y$t)>$!45P?xGk`YQ>Wm4YV!Z_I7vWmACSBYwy)g_P3;O z@9u8zz5rWIC{u0;WiaN`-+Bmtkp*(g_+{gsNc$O}zzJO(T#v!0i=$s(_j|o=aR7ZZuI0Q*Rc-R2r4jecnanb&~TY9}1{gdDr zf&Let#F4Y<5R3xW&*@n>W~`n=AfM&~q+YKFfQzR52Sv7z;%oHNAY>kYifxZ`hnx#Q z-nS5RJUfCo25tzxeIDI>lM(>18}J5DM5dRYuQW;bIGx>CnA&iEAZ8qbmoGt)urDNX z4F)$uFa|er7!?V;l-yk^#|J8{9iJAWz@Vd*u;{4y)+1cJM<^QX_ zz2Bbme-$mux;y9-BMDJ|JmGoghi*a;I8Osa#Inl8Lm4SDdLd)69V6(X7>u1T2#~{Y z800+YIQ-s_bE7b3BQW+tDlQRZ9={|M$toc!l-`E1tEe`mg#X2p2PTBs5x>ixVnkf2 zhsr7(V1^;V|MIMg#I%&>@7MdG&S_4Q1l*V~K6*p>GA~c97vW%E21tn2&^m%^%ZF zK^RswNL8KUYpuoK2PelC386c9fBsHRE7w+$af80KNh9QJ3NY0c?vAJNaLBooV=-@h zhA1;KSXe51dQFs*C><`x+0Zt0eH>iP81ovjQx$d(Ou`9&39oG|b6{&u))c~PPW}{v zE6W3Op`DQoxlb(z5;Dk!-nfmd+>(tE$T%v#w9;1 zTnpbW@ZClv>&ya&ZRnhtAtZudh+JSFSwVPPm6(Qqu@BjtiJZ{)xq{|gUP#>1MEpo^ zN;o8>$lb`DRLgp)9oJ~V)&5uzKFGywuamW)ncC6H`n4Qp7ZJqJIslzpvJ$A5?g=h< zRq4pSV2TM-wf*b;%w_oUsumZRmajP8A7SHsmmSFp-9e|-=^brkoBmnqh(F~TcZ{EY zRjL?&R4eWafxLiU!XWhTx)IJyYoj(Ue6w^N#+a9hx=>E7Z8WY^BOU}iZngZ^j4Q6W zqAvyz#r_WxwcOIxL~Mn@XI{FG5$bhhIb4M&nq3sX`L-kNSYCa5;U>%OvraA3D`P16053UXG*8B%mSFKA& zjv`GwnM*Bfx8Cv{`kDlAZb?foUgX?Mjv;G;^(u?7Q86Bmx!R_$3F-x7x>Tjt>fwEV z#irFg1wC#3^E>lfo>YlCUlyLO@Uy)6P}8-CnsxnoYJRVfxiBOhBU89?3W%g#4GVQoVNQ=r|HjNl!2X$ zars4BmmFYzoLNtt8zwgCg5_^Pcqkk&B+Lt2ttfQ`wYH>AM61a4@_&x(wf&ED&+WNA zx99f6+J6E7009600|4iR&Z7WAvmprB0g?)a7c~GdFfcGMFfcGMFfafxF*7qaH2@$m zlVJg5vjG7E0e`oklTiQz#8X{w)G!cy_pflD?#W5+s!9-v3RDn60_jvFs6Z%koV{d= zzpx$X{d?BQU9ObUSDZ-6+Oy-?@mdJM&%)U5OV{3lO7&YXb^XzU!W}A^&{<}sftqKK z4-g~!2_e#a{Yc`cd5LjO&;S}_q*Mx*oT{jb4f9&2oqr2vre$(WgA1`{g1?p)LGvr8 zHAb-=gUhQfz>g6_=4#P)7-~*mrXZw74HAj?>o?ZPM2JnbJ{Q%6SYPm}s;9T8j)Q+; z9eA)EScMShG>9soPm{hkGNRsdKgNM4$3MH!ZFAKeZA?<@$&$#^5Zu@kWPp2^n-A~B z_4bPDeSfumS1>RVbuOyARsJQFNExYhsZh=^xC1pN+3JG|xJzKOM@txF6FR4w9Ud|B z9}#M7%jH0d&_0|hl}4~BuMEzBmpvIXq~v2=mOZ9nY_o_m3!AdUFDhb671ATqs7TCV zSMOqK4&^t7AQKy#w7JQ)8Fx6N#>+GuRURk1CV%hJJkdJWGtiK1@-LhsqT*c8bH-Pf zFIE)f@TuO*W7%n4Jg0`^+&W9DcTz|AQ&bNo{tscRYW29RnR{}SsOXyXdr#ar5bxjnDSX_iyDRMl5cHvy+8*VKT8WCPN2NO<6nPUbvFgOR*nx5_-~Ieb z;$&aYCY!Lu5(Ljo?3v#@Y$t)>$##-XuHytT<|LCx4YVE6p6>6ft7z5h&eJD*`QM7Z zyT8A?{|M|fp-i=%B#FIkk6;w>enHQ}F=zEW0>w0MAq#pv0DLqRKPYxXlw6=+29yVXC~*V99SSZ0 zMc+Zt3)~pu1o#wu`#ie*rX&F1m*53ph)mBupBs|t2|B-YFmvInft+y&9zOkH9#fOkQHh193?iQdL4x7`vj0ucNuNT(kj0X^N_vEe zMU|>cYJXc-F((e6pH;6L$J7>$ z!q6&ej<#8Wai##UOP-@GG+fy!akZt{y`od%7Iqqmj8GXPvpF9}6RKlrClo`;eo1C7 zMn--PuXL{oO^cL&SL{5T$})cx(JW^9`~C694~OHi4t*y=SA!hCQ32MdzZCY1P^)Gj7m#wpon4Z3(8{!d;6r9u5VU2`m4abw*dj%NTa?%}I8Nf#sMnObc$Qu+KZ~8&k%akS zZ$@c25zD`S;O^S`(dm>SUe#L6Ew&fe`CP6KIqFvh6dN+Hm7r-V*9(_cQMckrlI&?_ zU0?}oqBTXy8(L8J%QA&)O#M;)icH}sBcus)q$)D!xxmexQ$s91-KldTSh!jkUoP?8 zR;=pG5{GS>oS7pegI|iA;t)9zy_%Jn(jP=@@i z!by4B*r(LH=8kb(qXpOaV@dcRAGf_u)`DhcM=R^sYM6aQ5J#H;bYaO_pkBErI2Bc; zBm06WCS2F{uQzj-VQYK+BQCHlUvs?Q!N$cdJ5m+8gHEf{JI2U1{j<^$f2lR@7~lV@ zG-FVIt++1*@)Uld5e=`q5zgFbqc<*MvvffdEXqV(C}-9-8rPW-w*nrwTK;Rs71vzR zmjj5B@F$5{Vd;7zc7`ElUb&Bv>UCr}T!$x`T@)9(LNATWkJ2rtL@g*AGdggv+ypc; zJDQDIQzgFlVEL0&^1|2-7xVWbV&FTD?tSEc+qN`{H{=|8fqE`?D{znTB!Nkr8}9ps z@5+TQjpYkd`JVIv(_3QdLk^dR>Y;wrd`Q!16OPxmIqg6BGumtpt_|Lp{kRHZlS;r)z% zP3wCKdeZ%G@qQ58lTLh)$2J~n))lCQ&p(M_*=sTBCcGRejM=J!(NtBCQ+6XxoA`V{ zT308ORffFddq4D4&h85I^`AhLc}-%!^7J9!l_zxC?$e&8zmL%db~47*r)phtfc@2G zJ#lWC*rW?qza9~xaFFtVwpvl@3Tk5{NwaHUulN_rUfcg}_s|~NLwjhQY5xlV00960 z0|2>q;GqCQvk?yD0g?)a7c&4bFfcGMFfcGMFfafxF*7qaGXNkklVJg5vjG7E0e=W$ zjZpvt#8X|1)G!o%&#%Zn%~RUWEP@skWfc(=h80v4DQSAAy=%TqQr-FY-lX%f>bkF{ zh4v=ro}7DfBZS}=Vea>}>u*4%_BEKceeXfx4wX#kEVI%;%QMIah>`t(5NW=>C-K9w z#5gBt01YxyDut(d_7uT25c4Af!%B5{dZBS2oB*h)uJ;6wM>CZg|tQ<*l0I;Gfw59_#>CA;cvOq6+9! z(f3M5)O+sdIPv88M;C@|u9~BbNorjzi9Aig%_Bi3xP$rh?yb1qUQxX-wtsIb21cUJ zMGZH~Kc^BYBlRv-${7Z?pynideNX|n32gT06b9La!KrSCN6hj^gc|$$bRbpe|D39o zMzATbOwNFpBN;QLb*QpJFTlH z)Nq_zXG!%=>IlD!8o|W>A#ByG?w7T27e|STuE|KA23H6<`&;t5dR%QTS;Wzz9lLL^ zCs@3Dh0j=m&Bn;EKXtlPD!1-G8ogo(==9Gm_zM64|NjF3m?}pBF|z^={sjU60Iq`$ A=>Px# diff --git a/spec/cassettes/getOptions.yml b/spec/cassettes/getOptions.yml new file mode 100644 index 0000000..935adc5 --- /dev/null +++ b/spec/cassettes/getOptions.yml @@ -0,0 +1,244 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getOptions0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '315' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 15 May 2013 14:42:57 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '8887' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv + ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 + ZT4KICAgICAgPHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPnNvZnR3YXJlX25h + bWU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNj + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPlNvZnR3YXJlIE5hbWU8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25h + bWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5n + PldvcmRQcmVzczwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0 + PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zb2Z0d2FyZV92 + ZXJzaW9uPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ + ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Tb2Z0d2FyZSBWZXJzaW9uPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv + bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ + PHN0cmluZz4zLjYtYmV0YTM8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8 + L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Ymxv + Z191cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5k + ZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPldvcmRQcmVzcyBBZGRyZXNzIChV + UkwpPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 + dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1Q8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+aG9tZV91cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlNp + dGUgQWRkcmVzcyAoVVJMKTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+ + MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19I + T1NUPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmltYWdlX2RlZmF1bHRfbGlu + a190eXBlPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ + ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5JbWFnZSBkZWZhdWx0IGxpbmsg + dHlwZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+ + PHZhbHVlPjxzdHJpbmc+ZmlsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5p + bWFnZV9kZWZhdWx0X3NpemU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l + bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkltYWdlIGRl + ZmF1bHQgc2l6ZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + cj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9v + bGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8 + L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PmltYWdlX2RlZmF1bHRfYWxpZ248L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAg + PG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkltYWdl + IGRlZmF1bHQgYWxpZ248L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8 + L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZh + bHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT50ZW1wbGF0ZTwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVy + PjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVtcGxhdGU8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9u + bHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48 + c3RyaW5nPnB1Yi9idWVubzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwv + c3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zdHls + ZXNoZWV0PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ + ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5TdHlsZXNoZWV0PC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9u + YW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmlu + Zz5wdWIvYnVlbm88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj + dD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVt + Ym5haWw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5k + ZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlBvc3QgVGh1bWJuYWlsPC9zdHJp + bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5 + PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJv + b2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGltZV96b25lPC9u + YW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFt + ZT48dmFsdWU+PHN0cmluZz5UaW1lIFpvbmU8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVl + Pjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+YmxvZ190aXRsZTwvbmFtZT48dmFsdWU+PHN0 + cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp + bmc+U2l0ZSBUaXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwv + Ym9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFs + dWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y3RoaXNpc2F0ZXN0PC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPmJsb2dfdGFnbGluZTwvbmFtZT48dmFsdWU+PHN0 + cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp + bmc+U2l0ZSBUYWdsaW5lPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4w + PC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52 + YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5TbWlsZSEgWW914oCZcmUgYXQg + dGhlIGJlc3QgV29yZFByZXNzLmNvbSBzaXRlIGV2ZXI8L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+ZGF0ZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkRh + dGUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + PjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29s + ZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwv + bmFtZT48dmFsdWU+PHN0cmluZz5GIGosIFk8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+dGltZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l + bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlRpbWUgRm9y + bWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 + dmFsdWU+PHN0cmluZz5nOmkgYTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT51 + c2Vyc19jYW5fcmVnaXN0ZXI8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l + bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFsbG93IG5l + dyB1c2VycyB0byBzaWduIHVwPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVh + bj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3Zh + bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfdzwvbmFtZT48dmFsdWU+PHN0 + cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp + bmc+VGh1bWJuYWlsIFdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVh + bj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4xNTA8L2ludD48L3ZhbHVlPjwv + bWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+dGh1bWJuYWlsX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0cnVjdD4K + ICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGh1 + bWJuYWlsIEhlaWdodDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwv + Ym9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFs + dWU8L25hbWU+PHZhbHVlPjxpbnQ+MTUwPC9pbnQ+PC92YWx1ZT48L21lbWJl + cj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnRodW1ibmFpbF9jcm9wPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1i + ZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Dcm9wIHRodW1i + bmFpbCB0byBleGFjdCBkaW1lbnNpb25zPC9zdHJpbmc+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48 + Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+PC92YWx1 + ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPm1lZGl1bV9zaXplX3c8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPk1l + ZGl1bSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9v + bGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+bWVkaXVtX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0 + cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp + bmc+TWVkaXVtIHNpemUgaW1hZ2UgaGVpZ2h0PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1 + ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+bGFyZ2Vfc2l6ZV93PC9uYW1lPjx2YWx1 + ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+ + PHN0cmluZz5MYXJnZSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2 + YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4xMDI0 + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxhcmdlX3NpemVfaDwvbmFtZT48 + dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZh + bHVlPjxzdHJpbmc+TGFyZ2Ugc2l6ZSBpbWFnZSBoZWlnaHQ8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25h + bWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5n + PjEwMjQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVmYXVsdF9jb21tZW50 + X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1l + PmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+QWxsb3cgcGVvcGxlIHRvIHBv + c3QgY29tbWVudHMgb24gbmV3IGFydGljbGVzPC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1 + ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5vcGVuPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlZmF1bHRfcGluZ19zdGF0dXM8L25h + bWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1l + Pjx2YWx1ZT48c3RyaW5nPkFsbG93IGxpbmsgbm90aWZpY2F0aW9ucyBmcm9t + IG90aGVyIGJsb2dzIChwaW5nYmFja3MgYW5kIHRyYWNrYmFja3MpPC9zdHJp + bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5 + PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0 + cmluZz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2dfcHVibGlj + PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwv + bmFtZT48dmFsdWU+PHN0cmluZz5Qcml2YWN5IGFjY2Vzczwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFt + ZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT53b3JkcHJlc3MuY29tPC9uYW1l + Pjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48 + dmFsdWU+PHN0cmluZz5UaGlzIGlzIGEgd29yZHByZXNzLmNvbSBibG9nPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv + bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ + PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj + dD48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD4KICAgICAgPC92YWx1ZT4K + ICAgIDwvcGFyYW0+CiAgPC9wYXJhbXM+CjwvbWV0aG9kUmVzcG9uc2U+Cg== + http_version: + recorded_at: Wed, 15 May 2013 14:42:57 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getPosts.yml b/spec/cassettes/getPosts.yml new file mode 100644 index 0000000..75bd19a --- /dev/null +++ b/spec/cassettes/getPosts.yml @@ -0,0 +1,165 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPosts0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASSpost_typepostpost_statuspublishnumber1offset0orderbypost_dateorderascposttermscustom_fields + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '909' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 15 May 2013 14:42:57 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '3605' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n post_id3\n + \ post_titleRob as PM\n + \ post_date20130416T18:13:18\n + \ post_date_gmt20130416T18:13:18\n + \ post_modified20130416T18:13:19\n + \ post_modified_gmt20130416T18:13:19\n + \ post_statuspublish\n + \ post_typepost\n + \ post_namerob-as-pm\n + \ post_author46917508\n + \ post_password\n + \ post_excerpt\n + \ post_content<p><i>By Cindy + Bokma</i></p><p>Rob as PM is amazballs!!</p><div + id="summary"><p><br></p></div>\n + \ post_parent0\n + \ post_mime_type\n + \ linkhttp://WORDPRESS_HOST/2013/04/16/rob-as-pm/\n + \ guidhttp://WORDPRESS_HOST/?p=3\n + \ menu_order0\n comment_statusopen\n + \ ping_statusopen\n + \ sticky0\n + \ post_thumbnail\n\n + \ post_formatstandard\n + \ terms\n \n term_id1\n + \ nameUncategorized\n + \ sluguncategorized\n + \ term_group0\n + \ term_taxonomy_id1\n + \ taxonomycategory\n + \ description\n + \ parent0\n + \ count11\n\n\n + \ custom_fields\n \n + \ id3\n keyjabber_published\n + \ value1366135999\n\n\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 15 May 2013 14:42:57 GMT +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPost0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS3posttermscustom_fields + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '484' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 15 May 2013 14:42:58 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '3558' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n post_id3\n + \ post_titleRob as PM\n + \ post_date20130416T18:13:18\n + \ post_date_gmt20130416T18:13:18\n + \ post_modified20130416T18:13:19\n + \ post_modified_gmt20130416T18:13:19\n + \ post_statuspublish\n + \ post_typepost\n + \ post_namerob-as-pm\n + \ post_author46917508\n + \ post_password\n + \ post_excerpt\n + \ post_content<p><i>By Cindy + Bokma</i></p><p>Rob as PM is amazballs!!</p><div + id="summary"><p><br></p></div>\n + \ post_parent0\n + \ post_mime_type\n + \ linkhttp://WORDPRESS_HOST/2013/04/16/rob-as-pm/\n + \ guidhttp://WORDPRESS_HOST/?p=3\n + \ menu_order0\n comment_statusopen\n + \ ping_statusopen\n + \ sticky0\n + \ post_thumbnail\n\n + \ post_formatstandard\n + \ terms\n \n term_id1\n + \ nameUncategorized\n + \ sluguncategorized\n + \ term_group0\n + \ term_taxonomy_id1\n + \ taxonomycategory\n + \ description\n + \ parent0\n + \ count11\n\n\n + \ custom_fields\n \n + \ id3\n keyjabber_published\n + \ value1366135999\n\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 15 May 2013 14:42:58 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getUsersBlogs.yml b/spec/cassettes/getUsersBlogs.yml new file mode 100644 index 0000000..ac2e0ba --- /dev/null +++ b/spec/cassettes/getUsersBlogs.yml @@ -0,0 +1,99 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getUsersBlogsWORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '226' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 15 May 2013 14:42:59 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '680' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n isAdmin1\n + \ urlhttp://WORDPRESS_HOST/\n + \ blogid47989391\n + \ blogNamecthisisatest\n + \ xmlrpchttps://WORDPRESS_HOST/xmlrpc.php\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 15 May 2013 14:42:59 GMT +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.newPost47989391WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASSpost_typepostpost_statuspublishpost_date20130515T10:42:59post_formatpostcomment_statusholdping_statusclosedpost_titleTest + postpost_contentThis + a great test. + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '994' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 15 May 2013 14:43:00 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '177' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 39\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 15 May 2013 14:43:00 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index 9f8c0ef..3d30d29 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -2,35 +2,37 @@ describe "Rubypress" do - it 'can instantiate' do + it '#initialize' do init_wp_admin_connection.class.should == Rubypress::Client end - it 'can connect' do - init_wp_admin_connection.class.should == Rubypress::Client - init_wp_admin_connection.connection.class.should == XMLRPC::Client - - init_wp_admin_connection.getOptions.class.should == Hash - - expect { init_wp_invalid_connection.getOptions }.to raise_error + it '#getOptions' do + VCR.use_cassette("getOptions", :record => :new_episodes) do + init_wp_admin_connection.class.should == Rubypress::Client + init_wp_admin_connection.connection.class.should == XMLRPC::Client + init_wp_admin_connection.getOptions.class.should == Hash + expect { init_wp_invalid_connection.getOptions }.to raise_error + end end - it 'can use getPosts and getPost' do - client = init_wp_editor_connection - posts = client.getPosts(:number => 1) - posts.class.should == Array + it '#getPosts #getPost' do + VCR.use_cassette("getPosts", :record => :new_episodes) do + client = init_wp_admin_connection + posts = client.getPosts(:number => 1) + posts.class.should == Array - id = posts[0]["post_id"] - client.getPost(:post_id => id).class.should == Hash + id = posts[0]["post_id"] + client.getPost(:post_id => id).class.should == Hash + end end - it 'can use newPost method (with getUsersBlogs) to create a new post' do - - client = init_wp_editor_connection - user_blogs = client.getUsersBlogs - blog_id = user_blogs[0]["blogid"] - init_wp_editor_connection.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String - + it '#newPost #getUsersBlogs' do + VCR.use_cassette("getUsersBlogs", :record => :new_episodes) do + client = init_wp_admin_connection + user_blogs = client.getUsersBlogs + blog_id = user_blogs[0]["blogid"] + init_wp_admin_connection.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String + end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 784206c..e4fc270 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -4,6 +4,7 @@ require 'yaml' require 'rubypress' require 'erb' +require_relative 'vcr_setup' # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb new file mode 100644 index 0000000..bfcad2f --- /dev/null +++ b/spec/vcr_setup.rb @@ -0,0 +1,24 @@ +require 'vcr' + +VCR.configure do |c| + c.cassette_library_dir = 'spec/cassettes' + c.hook_into :webmock + c.filter_sensitive_data("WORDPRESS_ADMIN_USER") do + ENV['WORDPRESS_ADMIN_USER'] + end + + c.filter_sensitive_data("WORDPRESS_ADMIN_PASS") do + ENV['WORDPRESS_ADMIN_PASS'] + end + c.filter_sensitive_data("WORDPRESS_EDITOR_USER") do + ENV['WORDPRESS_EDITOR_USER'] + end + c.filter_sensitive_data("WORDPRESS_EDITOR_PASS") do + ENV['WORDPRESS_EDITOR_PASS'] + end + c.filter_sensitive_data("WORDPRESS_HOST") do + ENV['WORDPRESS_HOST'] + end + + +end \ No newline at end of file From 6c27aae5001ba39823fb5e3c9c0e971ac8f0b6dc Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 15 May 2013 11:00:08 -0400 Subject: [PATCH 09/70] Update README format. --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.rdoc | 61 --------------------------------------------- 2 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 README.md delete mode 100644 README.rdoc diff --git a/README.md b/README.md new file mode 100644 index 0000000..f8830d5 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# rubypress + +This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. + +WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. + + +## Getting Started + +1. Install the gem using specific_install or Bundler + + A. To your system + + `gem install specific_install` + + `gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` + + B. Or using Bundler + + Inside your Gemfile: + + `gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` + +2. Create a new client + + ```ruby + >wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") + ``` + +3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) + + ```ruby + >wp.getOptions + + => {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} + ``` + + (just a small excerpt of actual options for the sake of the whole brevity thing)` + + ```ruby + >wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) + + => "24" + ``` + + (returns a post ID if post was successful) + +To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). + + +## Contributing to rubypress + +We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. + +* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. +* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. +* Fork the project. +* Start a feature/bugfix branch. +* Commit and push until you are happy with your contribution. +* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. + + +## Credits + +* Dan Collis-Puro (dan@collispuro.com) +* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) + + +### Copyright and License + +Copyright (c) 2012 Dan Collis-Puro +Licensed under the same terms as WordPress itself - GPLv2. diff --git a/README.rdoc b/README.rdoc deleted file mode 100644 index 0727bd9..0000000 --- a/README.rdoc +++ /dev/null @@ -1,61 +0,0 @@ -= rubypress - -This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. - -WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. - - -== Getting Started - -1. Install the gem using specific_install - -A. To your system - -`gem install specific_install` -`gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` - -B. Or using Bundler - -Inside your Gemfile: - -`gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` - -2. Create a new client - -`>wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword")` - -3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) - -`>wp.getOptions -=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} -(just a small excerpt of actual options for the sake of the whole brevity thing)` - -`>wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) -=> "24" -(returns a post ID if post was successful) - -To make further requests, check out the documentation - this blog should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). - - -== Contributing to rubypress - -We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. - -* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. -* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. -* Fork the project. -* Start a feature/bugfix branch. -* Commit and push until you are happy with your contribution. -* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. - - -== Credits - -* Dan Collis-Puro (dan@collispuro.com) -* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) - - -== Copyright and License - -Copyright (c) 2012 Dan Collis-Puro -Licensed under the same terms as WordPress itself - GPLv2. From 3931bb758e19866c6f660aa7bd683bb891d02880 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 21 May 2013 11:55:38 -0400 Subject: [PATCH 10/70] Term fixes. --- lib/rubypress/client.rb | 56 +++++++++++++++++++--------------------- rubypress-0.0.2.gem | Bin 5120 -> 5120 bytes 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 0cc7033..5cb3cd6 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -51,7 +51,7 @@ def getOptions(options = {}) opts[:blog_id], opts[:username], opts[:password], - opts[:options] = nil + (opts[:options] if !opts[:options].nil?) ) end @@ -70,7 +70,7 @@ def getPost(options = {}) opts[:username], opts[:password], opts[:post_id], - opts[:fields] + (opts[:fields] if !opts[:fields].nil?) ) end @@ -79,28 +79,20 @@ def getPosts(options = {}) :blog_id => 0, :username => self.username, :password => self.password, - :post_type => 'post', - :post_status => 'publish', - :number => 10, - :offset => 0, - :orderby => 'post_date', - :order => 'asc', - :fields => self.default_post_fields - }.merge(options) + :filter => { + :post_type => 'post', + :orderby => 'post_date', + :order => 'asc', + :fields => self.default_post_fields + } + }.deep_merge(options) self.connection.call( "wp.getPosts", opts[:blog_id], opts[:username], opts[:password], - { - :post_type => opts[:post_type], - :post_status => opts[:post_status], - :number => opts[:number], - :offset => opts[:offset], - :orderby => opts[:orderby], - :order => opts[:order] - }, - opts[:fields] + (opts[:filter] if !opts[:filter].nil?), + (opts[:fields] if !opts[:fields].nil?) ) end @@ -242,16 +234,18 @@ def getTerm(options = {}) opts = { :blog_id => 0, :username => self.username, - :password => self.password, - :taxonomy => "categories" + :password => self.password }.deep_merge(options) - self.connection.call( - "wp.getTerm", - opts[:blog_id], + args = [opts[:blog_id], opts[:username], opts[:password], opts[:taxonomy], opts[:term_id] + ] + args.push(opts[:filter]) if !opts[:filter].nil? + self.connection.call( + "wp.getTerm", + args ) end @@ -262,13 +256,15 @@ def getTerms(options = {}) :password => self.password, :taxonomy => "categories" }.deep_merge(options) + args = [opts[:blog_id], + opts[:username], + opts[:password], + opts[:taxonomy] + ] + args.push(opts[:filter]) if !opts[:filter].nil? self.connection.call( - "wp.getTerms", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:taxonomy], - opts[:filter] + "wp.getTerms", + args ) end diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index a6753c8356ace69adcf32a8c07b55af17baf63fd..79233c2c1918474127daebda1312b149b0bc8afe 100644 GIT binary patch delta 2212 zcmV;V2wV4nD1a!Cgc&g~GypI#FfcGMFfcGMFaR(yGcz$Y03a}vVF6^b0RaO6f76zm zQ2+z%TWxRKHW2P-{|Yu6Y8&vBbV-B4K$oRigBD1UqDz4dfg#WmZ4sqjCQ?bWHUE8l zlSJ8)?XHrgcoC2&x}(Uu=bk%~l0xuwKTf81QH&_H;^~tHjst!iA05dvKNimi$1e`E zzoq>7(b4mxC*Yt7V-}BuG8psWe{Vg6$clFB^o!0tkmCn{0w;8FFdu_YSLZ*y?Dc-U zxIF#M{&0Hr)=C2E;Tap8V}dLf#{u-wz_!odUA(dF;SeMN;j{t99XN1E;-ZtPTY9}1 z{gvPtf&Let#F4Y_5R3xW&*d2%GgZ$akPq_~Qm@woz(q6ugCg5U@fa6i<2H`JtN-1U{w&5nNWecqW-5*$Wwq?HEB9#bE4& zL4X{F!ywl|$Km&eTpNWk8-cMGQgMnP^Y|&DNLC3cq4YM4T_v?CCHya*JTM{5j`&^n z3?t%7J5*NT05c2;{+nl2B!;CtfB(53>YU~>DbSZdnE+n>0$v`Be{!K7Ovq=DP-Lit ztwJ7PVn~JQLfYR~Rm_UKs9)?*`c!tOa&cKx;-_eI-4}xXsLxRBQ+{?hWkX-L=%>}| z-qN*2p)fRxnx%Y}U|dT8%#vp*54BcY6tv3I^j>~Z(B^*X7O7yNkJRU^A0=4qO9dhC zN?aG(lwzdYm*@)je`;zPqO4+PbSk#_HD@y)<&XClA3vOp$BOz^fNlpFexn?$QI7dY z1lasB{S<=XvIVKBGd$N;{CWER!XhDb2X8*Umcz=qRbFlX*?Wq zE#+8L_0JGxMg|K{<&~Zjv7h#4P74xlafB?h+Qh$e{GnAQxeW?EOX$XB5Mlt zs>q)Lxw1SkC)$!^$YW|bkdQ&v_1tmD@&--CsTr{XEw>}TvdK=P~X;t zRN&Q6Jky%Wf6c`uan@zX2(y-K809t-st_f@XCKibA9G#wxt@2z*AaJ_)^;I7B~4@l zNS&f;V`^}6)Rp`a^JY_DVOgYvlqgEnMFG?$yjg9k@m-mX61y znm)+IZBI0{pqcuyU0qn&IsK5GNJK2LKbp z6e~)oSKQzYD|UF_6nj3V8Few#+Q4;W`uvW1vnIF|p{)pPdEwYn@TjqWTpc{V>Fa*h zZM1h?ByCH3*Ihs}^`qH2RTsAZx_50E=xr@=e{yHHv%*<3|CHDN_na~C9YYVE`KB+8 z;td&tjwc`eZ3ONGp2je4b4~xS@YS1|8P-Tvpcvpyjt@&s;=6Wj_h8Vc=(rk*lxY$EA$;9aPCP@U3mYJJF~Y4#&;&a=(!toY~n)%;oTBqH8N4$QMN=Ve)+wEpk0B! z{*8uouSx9JZZgDM_c)xj`%tIpFKv{AN}c4m{OGMq0WiP+tcT}@i%o`L{aX-Dh0}z2 zVXGCTE>dex>O^!IxnBNHjlH)20q*g5JRXn7<9~YmD*ylh0RR6307Nj99sokKF$lf^ zk_v_wGypI#FfcGMFfcGMFaR(yGcz|d03a}vVF6^b0RaO6f76zmQ2+zPQ(cSHFcf{y zugE^lQ_{{Xf)*5I6%iDM6;u={X?mxh_iIZb0YeHQ1(kA3);{waVxnbIL-)3n)ZLiT!|>Xui28@x!vjI45WX11eD}g{Pca z)^fvwQF-U1e_d#qn)2vlYM9_Jl|wN6${T}8Y^UhUs*mt}!dSREbUns~)0b(8xz(dW zBL4D~^(qr$Q?D;Y{YY%qysn%1mGyD(&#Z?4t_PbjdQ%>7QHh7XSbN|NjF35AYZtvjGnO1pxrQ20r5e delta 2186 zcmV;52zB>>D1a!Cgc&e3G5|0zFfcGMFfcGMFaR(yGcz$a03a}vVF6^b0RaO6f488M zQ2+z%TYFF3I1umO`zd_fskQEJ7L7Y(#6-u8BP<(0Scb!+d{PWHE? zZ}0AI@4f(AO(;`t31u+m)8Bdse~|@p%lKvEo=E!{puh=T99)mVr;DRsU-x>y9G@Qi zVV@mbe6W&$dU(nPN0=bX#c=?AG_dWXkH_zAdpHD1KzP^y;|?4+ByrLHyjyy`82yvr z7=iv5pTv=~=@5(p*3ao#IA*M#Lm;2#1EgNB2Y`#F{0Bw0kK$|e(;#FXe~N97bBCM@ zK;E|ybUZtPI0kMAzI`6ue3KFYup96OP(-GepRY7Y_c)#1SeV*ye;{TYf|oBrk+3f$ zat#JILofz6au^i2y>zgi>Q*$aDC{PYHQyjP2LIKF|B0FZ8t}Tyz~cPh+1c6NF6IBL zy}jR_^M4gB%ep)06C(*xe>~xN=Z9`W5I9c*M8vYn#X}h>GI}9nu^l7mq8N;wFbI&t za2Vt~=s5h|kaMFjW+O26LMkp1WFEgH6v-+fDU{xZv8$*yrG)>*lLsb**%80Xo?=8? zsfWrc9AJha!T<8Cio~>(=kM41q0VVelLXxbN(J!dEqJ{(%87b1e?gx@LXp7|x(a%L zi9r>r3u=E;RWU2_qJD8eY16Dbm5Ei(3_FF;WnU2bqdr5iPx;m1AshNyqMuf;drQ|A zg~HG%YL>EDf^jJUFiW1LEYw`lDR7mg>Ak#D;O2H}iIh+pBegjjM-j?nDJSGZiGD$5 zCPrF*2Cs0h4o!oUe^u-(oQg8P=h4h(`RnBP{OoW%R-tbN=ys6dH_E{p<(Q9zgUuh) zPC*z}HAq#R;%lwN-v=kh773v{cz^y*PAk_|k#U2*wMir7Yzi>d7VeIx@o>nwlw&b( ze1<49GFVtDdwNZjlPDc7$Jx*}bbTCL%^33R;6-E~GqY@(v^D;y0CH5LT3N&*z zuxC8FT13^95qZV#A~}#QN+m8|OIbn{Kba6rJyRsFY4dXV0kv$I`vhK%`cA5gtMp>U zneWUtbEHmhe+G#^;VVApZkzgr(KHSGP!GX6_WjuOztQxqzE&lN-|fO!2P3BgReK;sdGG7 zm|P3rF7Vw(B+8Q?>o;{mfWDw(8h4DJ zepRX%e^e{(3xT|VU&0{t@46ArOlzYyE_}0e9mbfKiMmiut!*@}QzIS(JZ`o8*NiK! zxuP!y5XJrv61CjY)kJKC!Dn8&j}hv1WI0@gCz@Rp=ej~Ijf;=cEvG~+C~Gr1aIjnl zG*dg8jagkKzV~4HgH-a|*bW!-6CN?}BSTLi$nELJ!(D-lVBZ=*QPn`Kl#(ztPidY@7DYWRadP` zM~)&*Jef-^Y`5O>9r~ICaBfLUFJ9!_OO7FHg7qqkuu(A{kGa~WuL4N2NL3k(}E+otgTdgQ{1+})MPDHE7_40p??6v)mbkFU% zJ-6rf#M*xX00030{{sN$h0de1KnTDAksun93WgUo05C8xFfcGMFfcGM05CB#GdDE= zATX0*0c5iQ0RsVlx1f_z00YERU2oJd5PbKqaG&nUN$#pj5Qz#@5JCd!R3xZCC~};= zWQ)JB9q9dg*2!J2l+st6NXgo>$GH742Wg9^AyV6#U{7-SPVr(HI%_OQ%bva_j!1(F>M Date: Tue, 4 Jun 2013 14:59:24 -0400 Subject: [PATCH 11/70] Major major refactor. --- README.rdoc | 62 ++++ lib/rubypress.rb | 11 +- lib/rubypress/client.rb | 579 ++---------------------------------- lib/rubypress/comments.rb | 51 ++++ lib/rubypress/media.rb | 24 ++ lib/rubypress/options.rb | 17 ++ lib/rubypress/post.rb | 72 +++++ lib/rubypress/taxonomies.rb | 61 ++++ lib/rubypress/users.rb | 36 +++ rubypress-0.0.2.gem | Bin 5120 -> 5120 bytes rubypress.gemspec | 7 +- 11 files changed, 359 insertions(+), 561 deletions(-) create mode 100644 README.rdoc create mode 100644 lib/rubypress/comments.rb create mode 100644 lib/rubypress/media.rb create mode 100644 lib/rubypress/options.rb create mode 100644 lib/rubypress/post.rb create mode 100644 lib/rubypress/taxonomies.rb create mode 100644 lib/rubypress/users.rb diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..03765ef --- /dev/null +++ b/README.rdoc @@ -0,0 +1,62 @@ +# rubypress + +This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. + +WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. + + +## Getting Started + +1. Install the gem using specific_install + +A. To your system + +`gem install specific_install` + +`gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` + +B. Or using Bundler + +Inside your Gemfile: + +`gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` + +2. Create a new client + +`>wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword")` + +3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) + +`>wp.getOptions +=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} +(just a small excerpt of actual options for the sake of the whole brevity thing)` + +`>wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) +=> "24" +(returns a post ID if post was successful) + +To make further requests, check out the documentation - this blog should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). + + +## Contributing to rubypress + +We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. + +* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. +* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. +* Fork the project. +* Start a feature/bugfix branch. +* Commit and push until you are happy with your contribution. +* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. + + +## Credits + +* Dan Collis-Puro (dan@collispuro.com) +* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) + + +### Copyright and License + +Copyright (c) 2012 Dan Collis-Puro +Licensed under the same terms as WordPress itself - GPLv2. diff --git a/lib/rubypress.rb b/lib/rubypress.rb index 0d595a3..f29968e 100644 --- a/lib/rubypress.rb +++ b/lib/rubypress.rb @@ -19,4 +19,13 @@ def deep_merge(other_hash) dup.deep_merge!(other_hash) end -end \ No newline at end of file +end + + +require 'pp' + +class XMLRPC::Client + def set_debug + @http.set_debug_output($stderr); + end +end diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 5cb3cd6..d2e7313 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -1,14 +1,21 @@ require 'yaml' require 'erb' +require_relative "post" +require_relative "taxonomies" +require_relative "media" +require_relative "comments" +require_relative "options" +require_relative "users" module Rubypress class Client + attr_reader :connection attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields def initialize(options = {}) - opts = { + { :port => 80, :use_ssl => false, :host => nil, @@ -16,14 +23,7 @@ def initialize(options = {}) :username => nil, :password => nil, :default_post_fields => ['post','terms','custom_fields'] - }.merge(options) - self.port = opts[:port] - self.host = opts[:host] - self.path = opts[:path] - self.username = opts[:username] - self.password = opts[:password] - self.use_ssl = opts[:use_ssl] - self.default_post_fields = opts[:default_post_fields] + }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self.connect self end @@ -40,558 +40,25 @@ def self.testClient @client = self.new(config[:wordpress_admin]) end - def getOptions(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getOptions", - opts[:blog_id], - opts[:username], - opts[:password], - (opts[:options] if !opts[:options].nil?) - ) - end - - def getPost(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :post_type => 'post', - :post_status => 'publish', - :fields => self.default_post_fields - }.merge(options) - self.connection.call( - "wp.getPost", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id], - (opts[:fields] if !opts[:fields].nil?) - ) - end - - def getPosts(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :filter => { - :post_type => 'post', - :orderby => 'post_date', - :order => 'asc', - :fields => self.default_post_fields - } - }.deep_merge(options) - self.connection.call( - "wp.getPosts", - opts[:blog_id], - opts[:username], - opts[:password], - (opts[:filter] if !opts[:filter].nil?), - (opts[:fields] if !opts[:fields].nil?) - ) - end - - def newPost(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :content => { - :post_type => "post", - :post_status => "publish", - :post_date => Time.now, - :post_format => "post", - :comment_status => "hold", - :ping_status => "closed" - } - }.deep_merge(options) - self.connection.call( - "wp.newPost", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:content] - ) - end - - def editPost(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.editPost", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id], - opts[:content] - ) - end - - def deletePost(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.deletePost", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id] - ) - end - - def getPostTypes(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :filter => {}, - :fields => [] - }.deep_merge(options) - self.connection.call( - "wp.getPostTypes", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id], - :filter => {}, - :fields => [] - ) - end - - def getPostFormats(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :filter => {} - }.deep_merge(options) - self.connection.call( - "wp.getPostFormats", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id], - :filter => {} - ) - end - - def getPostStatusList(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getPostStatusList", - opts[:blog_id], - opts[:username], - opts[:password] - ) - end - - def getTaxonomy(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :taxonomy => "categories" - }.deep_merge(options) - self.connection.call( - "wp.getTaxonomy", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:taxonomy] - ) - end - - def getTaxonomies(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getTaxonomies", - opts[:blog_id], - opts[:username], - opts[:password] - ) - end - - def getTerm(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - args = [opts[:blog_id], - opts[:username], - opts[:password], - opts[:taxonomy], - opts[:term_id] - ] - args.push(opts[:filter]) if !opts[:filter].nil? - self.connection.call( - "wp.getTerm", - args - ) - end - - def getTerms(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :taxonomy => "categories" - }.deep_merge(options) - args = [opts[:blog_id], - opts[:username], - opts[:password], - opts[:taxonomy] - ] - args.push(opts[:filter]) if !opts[:filter].nil? - self.connection.call( - "wp.getTerms", - args - ) - end - - def newTerm(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.newTerm", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:content] - ) - end - - def editTerm(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.editTerm", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:term_id], - opts[:content] - ) - end - - def deleteTerm(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :taxonomy => "categories" - }.deep_merge(options) - self.connection.call( - "wp.deleteTerm", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:taxonomy], - opts[:term_id] - ) - end - - def getMediaItem(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getMediaItem", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:attachment_id] - ) - end - - def getMediaLibrary(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getMediaItem", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:filter] - ) - end - - def uploadFile(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getMediaItem", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:data] - ) - end - - def getCommentCount(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getCommentCount", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id] - ) - end - - def getComment(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getComment", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:comment_id] - ) - end - - def getComments(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :filter => {} - }.deep_merge(options) - self.connection.call( - "wp.getComments", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:filter] - ) - end - - def newComment(options = {}) - opts = { + def execute(method, options) + args = [] + options_final = { :blog_id => 0, :username => self.username, :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.newComment", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:post_id], - opts[:comment] - ) + } + options_final.deep_merge!(options).each{|option| args.push(option[1]) if !option[1].nil?} + #connection.set_debug + server = self.connection.call("wp.#{method}", args) + #pp server end - def editComment(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getCommentCount", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:comment_id], - opts[:comment] - ) - end - - def deleteComment(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.deleteComment", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:comment_id] - ) - end - - def getCommentStatusList(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getCommentStatusList", - opts[:blog_id], - opts[:username], - opts[:password] - ) - end - - def getOptions(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :options => [] - }.deep_merge(options) - self.connection.call( - "wp.getOptions", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:options] - ) - end - - def setOptions(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :options => [] - }.deep_merge(options) - self.connection.call( - "wp.setOptions", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:options] - ) - end - - def getUsersBlogs(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getUsersBlogs", - opts[:username], - opts[:password] - ) - end - - def getUser(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :fields => [] - }.deep_merge(options) - self.connection.call( - "wp.getUser", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:user_id], - opts[:fields] - ) - end - - def getUsers(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :filter => {} - }.deep_merge(options) - self.connection.call( - "wp.getUsers", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:filter] - ) - end - - def getProfile(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :fields => [] - }.deep_merge(options) - self.connection.call( - "wp.getProfile", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:user_id], - opts[:fields] - ) - end - - def editProfile(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password, - :content => {} - }.deep_merge(options) - self.connection.call( - "wp.editProfile", - opts[:blog_id], - opts[:username], - opts[:password], - opts[:content] - ) - end - - def getAuthors(options = {}) - opts = { - :blog_id => 0, - :username => self.username, - :password => self.password - }.deep_merge(options) - self.connection.call( - "wp.getAuthors", - opts[:blog_id], - opts[:username], - opts[:password] - ) - end + include Post + include Taxonomies + include Media + include Comments + include Options + include Users end diff --git a/lib/rubypress/comments.rb b/lib/rubypress/comments.rb new file mode 100644 index 0000000..cfd6f59 --- /dev/null +++ b/lib/rubypress/comments.rb @@ -0,0 +1,51 @@ +module Comments + + def getCommentCount(options = {}) + default_options = { + :post_id => nil + }.deep_merge!(options) + execute("getCommentCount", default_options) + end + + def getComment(options = {}) + default_options = { + :comment_id => nil + }.deep_merge!(options) + execute("getComment", default_options) + end + + def getComments(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute("getComments", default_options) + end + + def newComment(options = {}) + default_options = { + :post_id => nil, + :comment => {} + }.deep_merge!(options) + execute("newComment", default_options) + end + + def editComment(options = {}) + default_options = { + :comment_id => nil, + :comment => {} + }.deep_merge!(options) + execute("editComment", default_options) + end + + def deleteComment(options = {}) + default_options = { + :comment_id => nil + }.deep_merge!(options) + execute("deleteComment", default_options) + end + + def getCommentStatusList(options = {}) + execute("getCommentStatusList", options) + end + +end \ No newline at end of file diff --git a/lib/rubypress/media.rb b/lib/rubypress/media.rb new file mode 100644 index 0000000..e39de5e --- /dev/null +++ b/lib/rubypress/media.rb @@ -0,0 +1,24 @@ +module Media + + def getMediaItem(options = {}) + default_options = { + :attachment_id => nil + }.deep_merge!(options) + execute("getMediaItem", default_options) + end + + def getMediaLibrary(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute("getMediaLibrary", default_options) + end + + def uploadFile(options = {}) + default_options = { + :data => {} + }.deep_merge!(options) + execute("uploadFile", default_options) + end + +end \ No newline at end of file diff --git a/lib/rubypress/options.rb b/lib/rubypress/options.rb new file mode 100644 index 0000000..8acd744 --- /dev/null +++ b/lib/rubypress/options.rb @@ -0,0 +1,17 @@ +module Options + + def getOptions(options = {}) + default_options = { + :options => [] + }.deep_merge!(options) + execute("getOptions", default_options) + end + + def setOptions(options = {}) + default_options = { + :options => [] + }.deep_merge!(options) + execute("setOptions", default_options) + end + +end \ No newline at end of file diff --git a/lib/rubypress/post.rb b/lib/rubypress/post.rb new file mode 100644 index 0000000..49cde3d --- /dev/null +++ b/lib/rubypress/post.rb @@ -0,0 +1,72 @@ +module Post + + def getPost(options = {}) + default_options = { + :post_id => nil, + :fields => self.default_post_fields + }.deep_merge!(options) + execute("getPost", default_options) + end + + def getPosts(options = {}) + default_options = { + :filter => { + :post_type => 'post', + :orderby => 'post_date', + :order => 'asc', + :fields => self.default_post_fields + } + }.deep_merge!(options) + execute("getPosts", default_options) + end + + def newPost(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute("newPost", default_options) + end + + def editPost(options = {}) + default_options = { + :post_id => nil, + :content => {} + }.deep_merge!(options) + execute("editPost", default_options) + end + + def deletePost(options = {}) + default_options = { + :post_id => nil + }.deep_merge!(options) + execute("deletePost", default_options) + end + + def getPostType(options = {}) + default_options = { + :post_type_name => nil, + :fields => [] + }.deep_merge!(options) + execute("getPostTypes", default_options) + end + + def getPostTypes(options = {}) + default_options = { + :filter => {}, + :fields => [] + }.deep_merge!(options) + execute("getPostTypes", default_options) + end + + def getPostFormats(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute("getPostFormats", default_options) + end + + def getPostStatusList(options = {}) + execute("getPostFormats", options) + end + +end \ No newline at end of file diff --git a/lib/rubypress/taxonomies.rb b/lib/rubypress/taxonomies.rb new file mode 100644 index 0000000..5607fc7 --- /dev/null +++ b/lib/rubypress/taxonomies.rb @@ -0,0 +1,61 @@ +module Taxonomies + + def getTaxonomy(options = {}) + default_options = { + :taxonomy => "categories" + }.deep_merge!(options) + execute("getTaxonomy", default_options) + end + + def getTaxonomies(options = {}) + execute("getTaxonomies", options) + end + + def getTerm(options = {}) + default_options = { + :taxonomy => "categories", + :term_id => nil + }.deep_merge!(options) + execute("getTerm", default_options) + end + + def getTerms(options = {}) + default_options = { + :taxonomy => "categories", + :filter => {} + }.deep_merge!(options) + execute("getTerms", default_options) + end + + def newTerm(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute("newTerm", default_options) + end + + def editTerm(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute("newTerm", default_options) + end + + + def editTerm(options = {}) + default_options = { + :term_id => nil, + :content => {} + }.deep_merge!(options) + execute("editTerm", default_options) + end + + def deleteTerm(options = {}) + default_options = { + :taxonomy => nil, + :term_id => nil + }.deep_merge!(options) + execute("deleteTerm", default_options) + end + +end \ No newline at end of file diff --git a/lib/rubypress/users.rb b/lib/rubypress/users.rb new file mode 100644 index 0000000..9425848 --- /dev/null +++ b/lib/rubypress/users.rb @@ -0,0 +1,36 @@ +module Users + + def getUser(options = {}) + default_options = { + :user_id => nil, + :fields => [] + }.deep_merge!(options) + execute("getUser", default_options) + end + + def getUsers(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute("getUsers", default_options) + end + + def getProfile(options = {}) + default_options = { + :fields => [] + }.deep_merge!(options) + execute("getProfile", default_options) + end + + def editProfile(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute("editProfile", default_options) + end + + def getAuthors(options = {}) + execute("getAuthors", options) + end + +end \ No newline at end of file diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 79233c2c1918474127daebda1312b149b0bc8afe..f842cae38f6c4cfd36824a1fd5248ca7551eebc0 100644 GIT binary patch delta 2407 zcmV-t37GbPD1a!Cgc&n5GXO9!FfcGMFfcGMFaR(yGcz(W03a}vVF6^b0RaO6e+M|O zQ2+z%TK`YmI27N{`769~T3d+=Ewps%i7}2F+9ak;J0{%;p~y|###+9e?UZrA|9-aP zd?nB%?Yi5PCqbHL$M0kNee+8kJliAT>?RQ0-kn=>pe^u?p$^9U-1CVF>7WNiX@cH8G*O!|1%lU_sKa7tj z7jN~@qc)zi-Whg~Zeij<7xfI|?A`er!|3-x=s8?%K;{YTnNDb--eR&2%6a^A=KD(*Us0od2P~a1mLc=RKd;D0MdIM zLDMz@hzYQKaQ9_*c_(`Sz?R?$P~^-nzg#Jny5oGd)G;;SaZgC>gBLGAo^dRCqzHP; zKA3`~90qxo77wOHw+|3M0BnVU{`iFC81i4TL_xq8We4zXz=aEJ0viSa@+jcXA+=h6 zy+8l-@pL*pm5ZoAP{a%if6c;$l>6FdEYK64;fE{;S??FhEJR5EHzi#BeQ!N&>D!Q# z_5aG?HXR05`2YRMWK!_|4VA%Icn?i~RZ_r%d3LOMK#ri8;e{JOal+%-54l+jg z!;t$lFg1P8L#7xxZG)!CANF}`;1jkBrZ%4?zXXuk{34`@C?+|SUi-v~xCW&T|Hb_( z3>{{OwK3)xITnos3x|t6%rJEDzufCb6XNmZ_P(!T&aJwFNH#cn1zrwzQ>Kz4_;ct` zlxY$m1>eI?hAS`&e{Od#3a@%#2i^RDax!I4Mss`EQZhl&>9Q*r-Q6xj#HIXda$E9U z)uS7S)q7n9y=eM<8Iy0p9lyVmVUh z`*Yp#q1Aiy>31nsCPzXgdtH5x2FTnKD<9?HH{1^Uecnp>nm;x^LzE?fJ({V!Q%Q{! z5@EQUCPN$0a?SF zq)Mab^Ch8lWXavgQBEO6M-w_uuX7#fJGapy-g7M$g5x#Z2?F(We)(0x3_fxt%rPz! zmzrb07rr#dIaN+H$NUg2MUMAbxJ^yVrj*6_uZG%ee+IBB{tx#L3-SMO|KPBV|JxuH zLNhv~P6`Xe6!X*%JysIE;;@iu(PC2;kpjn|M2o^enWaXypuA6~Ad_2AK}K>MDq^e$ zPpSD@2y1|&_0Y|+!-S7{#XC0uMpq)^!J*Nz<#%;YEUfB$$;wEx3lTmRb*Df^F)i>Y-fPCeaC zSg+z@K}E|_(pDN3-6}9z1=x?B?&R%XWcZtZ3B1Do4+f(L_5aae*xLU#NZG%vKBdMl zZZ~o^OsmDRU{+Qtui+&GtSXs-=-2$voh`|8nCvEyWlL4;;*w{L)v0v&ufMyd@3BTl{7O3}j@6G~YE+JBf;Gla@m#;Ifz&+F*HQcn zuCEQC2{kuL-V9}wwO&Y%u{^DkMdWML%C>|!1Nh7*F5FgmFC(xjzRG2t{MbKNhSSnh zl+XXt*Z7;v0$1dJ`v;SQ;`#5eJ^yWoe^maLdD)n{5XG!nTv0kC^P-N)Q=)}W+PU4aHKB8GYOn|Ah2I32h4Wn)vrzDmtX=weG zZk&czT1Sxr{(ms71uCy`8%T{SEnt+Zu4h15xDD+lh4Ir?Z8k^w_%A=K+xGjPYT?0f zRILAu$AdQhZ-Z3)k3J2`e*7Ug^~_i(&yyvfdZ#e~pi1nM(6@60lcFjezKB1s{o<$b zu{9D_t<2H{*cug;iqQBhPC{n;r5l-@tLoJrQd?@NrIyyE{{#R40RR630BURmWdJ&} zQ3xLak_v?wG&TS*FfcGMFfcGMFfafxF*7tUG5{bjlVJg5vjG7E0e=TLu2BF3#8lgk z(=ZTy_g8qI`jkt%2tgzeXh8@Gq-v2^1VWMHOp{rB!**c%_l%uh76|)FTB#k+nd9R# zo)ksFFZ|T)E8E?IjLjR+P4mHl#2rcz(HdrihK47Q^AH020Y1=rvrzbPPBG32>Op}B zR7&BgrY`Gp!<-UvXMeq(X_=VfXnkl{!Cwi3p!k(l3PZ7-yiHl_;roO>adl{V^bMz9 zCc(#6jsl7J%U9NmNQh0nzAWm;Mg54^b(6nkeSG+5)`J7ngOLbfE`uOFx|sF776H|s zyD5x3T7F}FzfGs+XhIZ9WlI8&qqoyQkP+@-KD~ceTyL-FynipZZ%YPRph}18Z>4)d zN2H3_*;q=e8Qg)KqUh8?1>8k2$)i)~MeBPj+Z`S;^FJa~*j1;7l)n3Osger8#Knx& zno^5Z8hR8<37g$ntZ_Ch?i0nGHCB_!OW7&Vg-D6fYH(tpzKt=u&{Wlcah$s3QI&kl zMa56@I9C?JA%9aS$*Y4YNkDt(POAx$*;uyjpgZFZSEzL&jz<%Zi+!7RX&<=R*E29# zNA30Jh^RO(=ySnW&!4R*NZ~`Hk)G2|>+&hh1LwvXQoR!@!0)04(BXdwTh*&&Su=Nb zl&ENm2lCY0Ovu^alGo*va&yT74hGH8euF*1!u>bQ86!)uNo(Qvr$H1_rpfxp9F{Bs Zb^kmezW@LL|NjF3$9B-4(6a#!-36#oqh$a9 delta 2217 zcmV;a2v+xiD1a!Cgc&g~GypI#FfcGMFfcGMFaR(yGcz$Y03a}vVF6^b0RaO6f76zm zQ2+z%TWxRKHW2P-{|Yu6Y8&vBbV-B4K$oRigBD1UqDz4dfg#WmZ4sqjCQ?bWHUE8l zlSJ8)?XHrgcoC2&x}(Uu=bk%~l0xuwKTf81QH&_H;^~tHjst!iA05dvKNimi$1e`E zzoq>7(b4mxC*Yt7V-}BuG8psWe{Vg6$clFB^o!0tkmCn{0w;8FFdu_YSLZ*y?Dc-U zxIF#M{&0Hr)=C2E;Tap8V}dLf#{u-wz_!odUA(dF;SeMN;j{t99XN1E;-ZtPTY9}1 z{gvPtf&Let#F4Y_5R3xW&*d2%GgZ$akPq_~Qm@woz(q6ugCg5U@fa6i<2H`JtN-1U{w&5nNWecqW-5*$Wwq?HEB9#bE4& zL4X{F!ywl|$Km&eTpNWk8-cMGQgMnP^Y|&DNLC3cq4YM4T_v?CCHya*JTM{5j`&^n z3?t%7J5*NT05c2;{+nl2B!;CtfB(53>YU~>DbSZdnE+n>0$v`Be{!K7Ovq=DP-Lit ztwJ7PVn~JQLfYR~Rm_UKs9)?*`c!tOa&cKx;-_eI-4}xXsLxRBQ+{?hWkX-L=%>}| z-qN*2p)fRxnx%Y}U|dT8%#vp*54BcY6tv3I^j>~Z(B^*X7O7yNkJRU^A0=4qO9dhC zN?aG(lwzdYm*@)je`;zPqO4+PbSk#_HD@y)<&XClA3vOp$BOz^fNlpFexn?$QI7dY z1lasB{S<=XvIVKBGd$N;{CWER!XhDb2X8*Umcz=qRbFlX*?Wq zE#+8L_0JGxMg|K{<&~Zjv7h#4P74xlafB?h+Qh$e{GnAQxeW?EOX$XB5Mlt zs>q)Lxw1SkC)$!^$YW|bkdQ&v_1tmD@&--CsTr{XEw>}TvdK=P~X;t zRN&Q6Jky%Wf6c`uan@zX2(y-K809t-st_f@XCKibA9G#wxt@2z*AaJ_)^;I7B~4@l zNS&f;V`^}6)Rp`a^JY_DVOgYvlqgEnMFG?$yjg9k@m-mX61y znm)+IZBI0{pqcuyU0qn&IsK5GNJK2LKbp z6e~)oSKQzYD|UF_6nj3V8Few#+Q4;W`uvW1vnIF|p{)pPdEwYn@TjqWTpc{V>Fa*h zZM1h?ByCH3*Ihs}^`qH2RTsAZx_50E=xr@=e{yHHv%*<3|CHDN_na~C9YYVE`KB+8 z;td&tjwc`eZ3ONGp2je4b4~xS@YS1|8P-Tvpcvpyjt@&s;=6Wj_h8Vc=(rk*lxY$EA$;9aPCP@U3mYJJF~Y4#&;&a=(!toY~n)%;oTBqH8N4$QMN=Ve)+wEpk0B! z{*8uouSx9JZZgDM_c)xj`%tIpFKv{AN}c4m{OGMq0WiP+tcT}@i%o`L{aX-Dh0}z2 zVXGCTE>dex>O^!IxnBNHjlH)20q*g5JRXn7<9~YmD*ylh0RR6307Nj99sokKF%G@~ zk_v?wFf;%#FfcGMFfcGMFfafxF*7qaGyotllVJg5vjG7E0e{n$n^6D*#8X|1)G!o% z&#%Zn%~R6OEP@skWfc(=h80v4DQSAAy=%TqQr-FY-n8?v>bkF{h4v=ro}7DfBZS}= zaq9M!?`}Zn<~7)+c^^RI4zC+rqkmm!nVRzGV``Y-FO@?u{K^}HNo=R+%c_s?eZp9{I&?k8hSQg6h`H6H zLL&b1mGvqUVpFd#Mg2%@*1WEp`IYr?@XxG=0Imn85z>+dNkSa z?Ja{_&{I~OIjDf!46b-|3ZrUc?{&MwBWC#{LW5m(IuIGVKc^~f5L_-Rqqh*$K*o$Y zhtyQnfO(v{BBCn7<}C4(ikMS{3djs<5_8x!_>|j2`K=|$%*JMIeztAF9nPo?Dvw8% z$H~4eyMMF~w9fScv?QDSi|2@_I2ZI>@YS=YD+)^ZQ16v-+G#DHP{VQVyd%{+WfJ@@ zY5<%5hp<(>x?k49Jv&NNbWH~GH2Rs4v%e*;(aXaXmrUk(CMFB@D~680RR6301xmO9|AE1voQ|O1(6^xVnaYL diff --git a/rubypress.gemspec b/rubypress.gemspec index 7e9f3a0..f7fe897 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -12,8 +12,7 @@ Gem::Specification.new do |s| s.required_ruby_version = ">= 1.9.2" - s.files = [ - "lib/rubypress.rb", - "lib/rubypress/client.rb" - ] + s.files = "lib/rubypress.rb" + s.files += Dir["lib/rubypress/**"] + end \ No newline at end of file From 1ee706c6ad3f24ebcd34b6203fd7ee8d3a7dfaed Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 4 Jun 2013 15:40:49 -0400 Subject: [PATCH 12/70] Some testing stuff, added debug mode to see request. --- Rakefile | 52 ++++------------------------------ lib/rubypress/client.rb | 26 ++++++++--------- lib/rubypress/users.rb | 6 +++- rubypress-0.0.2.gem | Bin 5120 -> 5120 bytes spec/cassettes/getOptions.yml | 47 ++++++++++++++++++++++++++++++ spec/rubypress_spec.rb | 25 ++++++++++------ spec/spec_helper.rb | 33 +-------------------- 7 files changed, 87 insertions(+), 102 deletions(-) diff --git a/Rakefile b/Rakefile index ed47356..092c878 100644 --- a/Rakefile +++ b/Rakefile @@ -1,49 +1,7 @@ -# encoding: utf-8 - -require 'rubygems' -require 'bundler' -begin - Bundler.setup(:default, :development) -rescue Bundler::BundlerError => e - $stderr.puts e.message - $stderr.puts "Run `bundle install` to install missing gems" - exit e.status_code -end +require "bundler/gem_tasks" require 'rake' - -require 'jeweler' -Jeweler::Tasks.new do |gem| - # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options - gem.name = "rubypress" - gem.homepage = "http://github.com/djcp/rubypress" - gem.license = "GPLv2" - gem.summary = %Q{The WordPress xmlrpc api in ruby} - gem.description = %Q{This is an implementation of the WordPress xmlrpc api introduced in version 3.4.} - gem.email = "dan@collispuro.com" - gem.authors = ["djcp"] - # dependencies defined in Gemfile -end -Jeweler::RubygemsDotOrgTasks.new - -require 'rspec/core' require 'rspec/core/rake_task' -RSpec::Core::RakeTask.new(:spec) do |spec| - spec.pattern = FileList['spec/**/*_spec.rb'] -end - -RSpec::Core::RakeTask.new(:rcov) do |spec| - spec.pattern = 'spec/**/*_spec.rb' - spec.rcov = true -end - -task :default => :spec - -require 'rdoc/task' -Rake::RDocTask.new do |rdoc| - version = File.exist?('VERSION') ? File.read('VERSION') : "" - - rdoc.rdoc_dir = 'rdoc' - rdoc.title = "rubypress #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') -end + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec \ No newline at end of file diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index d2e7313..33156c1 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -12,7 +12,7 @@ module Rubypress class Client attr_reader :connection - attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields + attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, :debug def initialize(options = {}) { @@ -22,22 +22,18 @@ def initialize(options = {}) :path => '/xmlrpc.php', :username => nil, :password => nil, - :default_post_fields => ['post','terms','custom_fields'] + :default_post_fields => ['post','terms','custom_fields'], + :debug => false }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } - self.connect self end - def connect + def connection @connection = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,nil,nil,self.use_ssl,nil) end - def self.config - YAML.load(ERB.new(File.read('./spec/wordpress.yml')).result) - end - - def self.testClient - @client = self.new(config[:wordpress_admin]) + def self.default + self.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) end def execute(method, options) @@ -48,9 +44,13 @@ def execute(method, options) :password => self.password } options_final.deep_merge!(options).each{|option| args.push(option[1]) if !option[1].nil?} - #connection.set_debug - server = self.connection.call("wp.#{method}", args) - #pp server + if self.debug + connection.set_debug + server = self.connection.call("wp.#{method}", args) + pp server + else + self.connection.call("wp.#{method}", args) + end end include Post diff --git a/lib/rubypress/users.rb b/lib/rubypress/users.rb index 9425848..56e5dcc 100644 --- a/lib/rubypress/users.rb +++ b/lib/rubypress/users.rb @@ -1,5 +1,9 @@ module Users - + + def getUsersBlogs + self.connection.call("wp.getUsersBlogs", self.username, self.password) + end + def getUser(options = {}) default_options = { :user_id => nil, diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index f842cae38f6c4cfd36824a1fd5248ca7551eebc0..6ec6dd05d8e7832bbf9c2cc8d9b3296d9573d427 100644 GIT binary patch delta 1837 zcmV+|2h#X}D1a!Cgab4%HnE3&0e?e6u2BF3>|1+p+cpsI-})4+Thun-skUP~MTRs> z(*!M$HbIF1z741fFl!D!SUJOlmj0VYkJOCYA=ZH1Jv)4_oF86(kUh&?>T}XL(G4VPI<}yRI*M}g@$^_x zx?SK|1~nTHYoS}J;c4jLu_ls)(LbJ!5omui4eY3|RYOM>X-E9f9K#|>H6Ru90lG^` z0zgA^`iC6FM0kOocWkmmSbtg4(k?9pAbOV(RF{eabqq8c+<)z@?s*LW$O`NO7a8-b zuh)Vl-YB1}WZhNZL5E4~f>*CVl5xOlLkx(j^+gxcj>h z!v21=JvLM?8FBwF7TmVOK#u?48SYL}{(n57tj7P>K%qyug{Bd6!U)g8Hw7aD5`Be0 z%duV3%HR|D&9-b)M{ZWBi8LK%6{xmpQiIEEWIIH+t;{0NMVJ;yrmcAf0vCb(GFR(6 zMd1v&_k)CB+89z_2Y>cd+p>_#dXCDVs?x?bEp=>6dSGu!M@b(JBun~W(pVJZ9M`?E zvF39X*EQ%b>TjWE5QXVRnd`{VT+U_Q*LUyKA?ub-bZF@RQt$5%jK-O}hpvb{cj5_r z3}F8)c+>AiOd*Z&=g@FbtcZbSd`mZCT!x)-+pqmFD?3Z4oqz0*4=SsrKgRWvjDfOB zS8c{<_u2$u)1^<9t|{9THQLvS9;i~nK?weXETW>Xmo5+5ci^7B-}5+1BbTLhS}*P> z=c<4Gu;1zd_H%IE1rM>{9R}b~>#5nMkuc&={U<}GY@wSDm*>wv|LNO+|C1R9(@6Y} zmjt#z8Qpadynl+&T?{Q37tY@C=RdF7f1O>tKfgGhPL&U5(@Uzkgf%25E!E)5^!VcQ z;iqH2QEUoR_0A8cQ})K|rL8IhJo<)IkD!i;$kNuh-uWbnfk3=qhI|#|P@=hLkyJZFSl%y6tm(p0t?ELp3JBcwtsc+zut5Bvg5f+QGuJ3J_pak zSDDV~LD0V*PG*o<`D$W0l?n|b)Dr7AP!WnOT}*srgEDW`x^d(ecYfQ4R;sngCliyB zBQe&0G7n_(@rt^^{qjH@M>I~t5&1qir*@oRT!s-L!T!WTL4tE6VnBj<=FeAx_l0?V zNs4F0KYu!U{`{26|HNEuHv`Pc|AvEMI{%vtcbfdK77{5`Y!QkbGPjabN*8giTLlQ<&j_D z?;i;=%XuzH2;E;*kFBBDBEE}PKGkO!;@f&6Y+Pb4LeDX5sIhC1a^N&bU`c3^s3%Zm zyMN{6`WJ1s>;dxD|G1xC|C2#~r&<4XkXZl0emh!Sf>X|RL)P2iNT}e-64G)Pm0K$? zw+OJGJKagHf0p5I|095$^}o{}?XJcD=KjAP66>EI-$jd`y>4Z17~K-YPr>6i2xYtk zgHjRaqc3Clm(*S>Kx1aEWZVeGjI~@y z53oFKl4;}{oR!stI0pE{#wM)mcrPZfD89nSI?29&tqiB3rzn~KMW1nOGYibg|9^%% zyF2Oq-=x|9)k7lxi`~{nE<`X(9^3dzC0f+I3eHT;hJdA-UqyzTl&6ZJDjZ+*;kuShZl4!7dEiD3M)r++rvqh$Q&A6C|V|1%g((*OTsJRT35_+JN!_%FV# z3Ihs%e`nYW|0Lqkuf-BoTfNj5e94dX*25NSTFzCluAe++D!1cf0E)y{KE`^sd0bSX z4IZ}Vr7xE%Z;gFn#g1~S0NdcyrXVyribIbq?aYack5$xaHo^@x)X=X@{|*TN00960 b0|3M@!H57nli>*bvI+zO0z*Qx1`PTKk0O?^ delta 1802 zcmV+l2le=XD1a!Cgab1)GqHz#0e=TLu2BF3>{|a%+c*^8&-p97a#~x73oW#C>WMLq z8`>nMO*<9sF1B<;G}lqW%&XUFej`+f6E96Z}2;p`?L zh*F)*o_zxva5@}~?{6rm-Ce3sp7xNZUThjor z(47CFz;F>+pyxfG*@zf6Z-4FcRshm_9YNDJ0*DE)d~o+=cX=m!0Kk^u2vFqAFTY$V zmb&A7w$w2-;Bik#?1L9CK%Q|ddZY+?%RZQbr5px%mKG1DMYj(SKLBinf&Tb}rC42_I`kwD%M9W%TWMNp=VEV4h6|VFlKVaDRN}EE8 z2yf6_-wGWBKE?VgTz_rk{FKv^UJf!w_`{IM3#K-o zCBFoa+594;i6|yHlwSM9ins=)4*$jdDhwTFh_x~17&#V=1Ph0YJV$Q9)f=D(vdIeq%c2lO3BKULYP?TvBAO+vUPKGNm3x95RFAA@EU2~vF&qqYvL)SeyZnWLLVj(iSN!kn^xzU3TvVR#;Guu#cRpOFojn%1i_^-darth&vNBl}V zCXUsQU}{v3Xo5AyQ1M*9u7T7%(brM@3$CvXpb0fMO5O}*l(k++kFh+hl11ce)XKJm zI0N|1CobGpc`qZdD!$5Po&4B8SBBHlQBfBOfMgW~z`us#26hksQ5 zmwDNkx)8;zSzJ*%B=e$<$y1_*PvmzYHGEwxxr(Dpp|5aqX~z;Dmkx(W&7#+16Helh z_&%apJxqY9vqCtlRecpK9U3a8#`SjK_mE{%?a+{Et2j%6|MIIQ7g}D9@86 zpn9h<0ia6klhC(w1e2mF9lnS^ul?eu@v$`$R;|p^1lSrCm5R{#EKWjZ`=uM1ovZ5A s9#UIssil_IrT+u~009600|07l1Z4m^voQ`I0kR4N0s;p(vjzwp.getOptions0wrongjf3290fh0tbf34fhjvih + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '280' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 19:07:59 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '403' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n faultCode\n + \ 403\n \n \n + \ faultString\n Incorrect username + or password.\n \n \n \n + \ \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 19:07:59 GMT recorded_with: VCR 2.4.0 diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index 3d30d29..8afbd28 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -2,22 +2,30 @@ describe "Rubypress" do - it '#initialize' do - init_wp_admin_connection.class.should == Rubypress::Client + let(:client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) + } + let(:invalid_client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => "wrongjf3290fh0tbf34fhjvih", :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) + } + + describe "client" do + + it '#initialize' do + client.class.should == Rubypress::Client + end + end it '#getOptions' do VCR.use_cassette("getOptions", :record => :new_episodes) do - init_wp_admin_connection.class.should == Rubypress::Client - init_wp_admin_connection.connection.class.should == XMLRPC::Client - init_wp_admin_connection.getOptions.class.should == Hash - expect { init_wp_invalid_connection.getOptions }.to raise_error + client.class.should == Rubypress::Client + client.connection.class.should == XMLRPC::Client + client.getOptions.class.should == Hash + expect { invalid_client.getOptions }.to raise_error end end it '#getPosts #getPost' do VCR.use_cassette("getPosts", :record => :new_episodes) do - client = init_wp_admin_connection posts = client.getPosts(:number => 1) posts.class.should == Array @@ -28,10 +36,9 @@ it '#newPost #getUsersBlogs' do VCR.use_cassette("getUsersBlogs", :record => :new_episodes) do - client = init_wp_admin_connection user_blogs = client.getUsersBlogs blog_id = user_blogs[0]["blogid"] - init_wp_admin_connection.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String + client.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e4fc270..f3793a4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,40 +1,9 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'rspec' -require 'yaml' require 'rubypress' -require 'erb' require_relative 'vcr_setup' -# Requires supporting files with custom matchers and macros, etc, -# in ./support/ and its subdirectories. -Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} - RSpec.configure do |config| - -end - -def load_config - YAML.load(ERB.new(File.read('./spec/wordpress.yml')).result) -end - -def init_wp_admin_connection - config = load_config - Rubypress::Client.new( - config[:wordpress_admin] - ) -end - -def init_wp_editor_connection - config = load_config - Rubypress::Client.new( - config[:wordpress_editor] - ) -end -def init_wp_invalid_connection - config = load_config - Rubypress::Client.new( - config[:wordpress_invalid] - ) -end +end \ No newline at end of file From dacb11271b7c32ade1b3567da8b9c418fe20583d Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 5 Jun 2013 11:49:38 -0400 Subject: [PATCH 13/70] All specs passing with VCR --- Gemfile.lock | 40 +- lib/rubypress/post.rb | 2 +- lib/rubypress/taxonomies.rb | 14 +- rubypress-0.0.2.gem | Bin 5120 -> 5120 bytes spec/cassettes/deleteComment.yml | 47 ++ spec/cassettes/deletePost.yml | 47 ++ spec/cassettes/deleteTerm.yml | 47 ++ spec/cassettes/editComment.yml | 49 ++ spec/cassettes/editPost.yml | 49 ++ spec/cassettes/editProfile.yml | 47 ++ spec/cassettes/editTerm.yml | 47 ++ spec/cassettes/getAuthors.yml | 54 ++ spec/cassettes/getComment.yml | 62 ++ spec/cassettes/getCommentCount.yml | 49 ++ spec/cassettes/getCommentStatusList.yml | 49 ++ spec/cassettes/getComments.yml | 90 +++ spec/cassettes/getMediaItem.yml | 66 ++ spec/cassettes/getMediaLibrary.yml | 66 ++ spec/cassettes/getOptions.yml | 388 +++++----- spec/cassettes/getPost.yml | 196 +++++ spec/cassettes/getPostFormats.yml | 58 ++ spec/cassettes/getPostStatusList.yml | 58 ++ spec/cassettes/getPostType.yml | 66 ++ spec/cassettes/getPostTypes.yml | 134 ++++ spec/cassettes/getPosts.yml | 919 ++++++++++++++++++++---- spec/cassettes/getProfile.yml | 47 ++ spec/cassettes/getTaxonomies.yml | 135 ++++ spec/cassettes/getTaxonomy.yml | 77 ++ spec/cassettes/getTerm.yml | 57 ++ spec/cassettes/getTerms.yml | 75 ++ spec/cassettes/getUsers.yml | 59 ++ spec/cassettes/getUsersBlogs.yml | 54 +- spec/cassettes/newComment.yml | 49 ++ spec/cassettes/newPost.yml | 49 ++ spec/cassettes/newTerm.yml | 47 ++ spec/cassettes/setOptions.yml | 53 ++ spec/cassettes/uploadFile.yml | 55 ++ spec/rubypress_spec.rb | 263 ++++++- spec/vcr_setup.rb | 17 +- 39 files changed, 3220 insertions(+), 461 deletions(-) create mode 100644 spec/cassettes/deleteComment.yml create mode 100644 spec/cassettes/deletePost.yml create mode 100644 spec/cassettes/deleteTerm.yml create mode 100644 spec/cassettes/editComment.yml create mode 100644 spec/cassettes/editPost.yml create mode 100644 spec/cassettes/editProfile.yml create mode 100644 spec/cassettes/editTerm.yml create mode 100644 spec/cassettes/getAuthors.yml create mode 100644 spec/cassettes/getComment.yml create mode 100644 spec/cassettes/getCommentCount.yml create mode 100644 spec/cassettes/getCommentStatusList.yml create mode 100644 spec/cassettes/getComments.yml create mode 100644 spec/cassettes/getMediaItem.yml create mode 100644 spec/cassettes/getMediaLibrary.yml create mode 100644 spec/cassettes/getPost.yml create mode 100644 spec/cassettes/getPostFormats.yml create mode 100644 spec/cassettes/getPostStatusList.yml create mode 100644 spec/cassettes/getPostType.yml create mode 100644 spec/cassettes/getPostTypes.yml create mode 100644 spec/cassettes/getProfile.yml create mode 100644 spec/cassettes/getTaxonomies.yml create mode 100644 spec/cassettes/getTaxonomy.yml create mode 100644 spec/cassettes/getTerm.yml create mode 100644 spec/cassettes/getTerms.yml create mode 100644 spec/cassettes/getUsers.yml create mode 100644 spec/cassettes/newComment.yml create mode 100644 spec/cassettes/newPost.yml create mode 100644 spec/cassettes/newTerm.yml create mode 100644 spec/cassettes/setOptions.yml create mode 100644 spec/cassettes/uploadFile.yml diff --git a/Gemfile.lock b/Gemfile.lock index 4d9fc4c..36a19e1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,31 +3,31 @@ GEM specs: addressable (2.3.4) crack (0.3.2) - diff-lcs (1.1.3) + diff-lcs (1.2.4) git (1.2.5) - jeweler (1.8.3) + jeweler (1.8.4) bundler (~> 1.0) git (>= 1.2.5) rake rdoc - json (1.6.5) - multi_json (1.0.4) - rake (0.9.2) - rdoc (3.12) + json (1.8.0) + multi_json (1.7.6) + rake (10.0.4) + rdoc (4.0.1) json (~> 1.4) - rspec (2.8.0) - rspec-core (~> 2.8.0) - rspec-expectations (~> 2.8.0) - rspec-mocks (~> 2.8.0) - rspec-core (2.8.0) - rspec-expectations (2.8.0) - diff-lcs (~> 1.1.2) - rspec-mocks (2.8.0) - simplecov (0.5.4) - multi_json (~> 1.0.3) - simplecov-html (~> 0.5.3) - simplecov-html (0.5.3) - vcr (2.4.0) + rspec (2.13.0) + rspec-core (~> 2.13.0) + rspec-expectations (~> 2.13.0) + rspec-mocks (~> 2.13.0) + rspec-core (2.13.1) + rspec-expectations (2.13.0) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.13.1) + simplecov (0.7.1) + multi_json (~> 1.0) + simplecov-html (~> 0.7.1) + simplecov-html (0.7.1) + vcr (2.5.0) webmock (1.11.0) addressable (>= 2.2.7) crack (>= 0.3.2) @@ -42,4 +42,4 @@ DEPENDENCIES rspec simplecov vcr - webmock + webmock (>= 1.8.0) diff --git a/lib/rubypress/post.rb b/lib/rubypress/post.rb index 49cde3d..9ef98ac 100644 --- a/lib/rubypress/post.rb +++ b/lib/rubypress/post.rb @@ -47,7 +47,7 @@ def getPostType(options = {}) :post_type_name => nil, :fields => [] }.deep_merge!(options) - execute("getPostTypes", default_options) + execute("getPostType", default_options) end def getPostTypes(options = {}) diff --git a/lib/rubypress/taxonomies.rb b/lib/rubypress/taxonomies.rb index 5607fc7..3bb42c4 100644 --- a/lib/rubypress/taxonomies.rb +++ b/lib/rubypress/taxonomies.rb @@ -2,7 +2,7 @@ module Taxonomies def getTaxonomy(options = {}) default_options = { - :taxonomy => "categories" + :taxonomy => "category" }.deep_merge!(options) execute("getTaxonomy", default_options) end @@ -13,7 +13,7 @@ def getTaxonomies(options = {}) def getTerm(options = {}) default_options = { - :taxonomy => "categories", + :taxonomy => "category", :term_id => nil }.deep_merge!(options) execute("getTerm", default_options) @@ -21,7 +21,7 @@ def getTerm(options = {}) def getTerms(options = {}) default_options = { - :taxonomy => "categories", + :taxonomy => "category", :filter => {} }.deep_merge!(options) execute("getTerms", default_options) @@ -34,14 +34,6 @@ def newTerm(options = {}) execute("newTerm", default_options) end - def editTerm(options = {}) - default_options = { - :content => {} - }.deep_merge!(options) - execute("newTerm", default_options) - end - - def editTerm(options = {}) default_options = { :term_id => nil, diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem index 6ec6dd05d8e7832bbf9c2cc8d9b3296d9573d427..7cdf4e70cf8e5b0a1bc805c056d86615c1196ffa 100644 GIT binary patch delta 1894 zcmV-s2buVQD1a!Cgc&n8Hvlj&FfcGMFfcGMFaR(yGcz+W03a}vVF6^b0RaO6e?42T zQ2+z%T6<61ND%Me{uJBv)Fe{QO&|#srcrR;Y!+=_k+{%AZN zj-G+xw*Zr+z$XyX?ypt|S&x(}f6C7e?gyb406DsAn9gz+d_F(=^|hk>a(uG?PCMN{ zf3F6PzcLr3cVt>fHB9V48}&5p=)>`$ruF+Ea4f1eAW_3~bSp5>-a}Os1*3lg6C=?5 zYFpUTU+I>K9MX;Xkvc|Mif%#L&3ovt6a@eSE$AQeG#lY1dfs!%3Sn(Ue{=gZ7l1ge zBB-x451JSlF1YFFe=j~U5XSxAWGC$Jd+TFM&61V0|8l`?+6@%g|LxJvC}aO8 z)16^!|C^x5qFh7UN*G~;=TS<-$b!UNBhc|&pLBBg1b%fL*EW%#mun-#gn1ddYui-e zax1wWFLji^%}&uIMP~$Ae@=Kdd+A#W=_JuUu>huIBp|{YC993@oBC*=P$BS%%NK%=!xR zP7Si@n8bvZ`7gEpVqnzI+}!o0@41m*ATWS8Z^7%~AZE(m7=HmRA0@IFSjKluE5T*h z8MpgNxLMU(dEIn_e|%7RHN_b3=j05O6}sp$Mt9I92-`mW>U2%Hwk*-TOtnCT5)DG~ z?^Nj(gBzb z_U`oTa5mH4pUlpwz;WQu$d#!xbw&bua~#(8ASQ|yn- zil;aS(tM|wCqmRI-e+d86(t$Wes9Ou5~oc3Cnt2Xe-U6o{I@mQnr7m^>DKnNjsKb; z8A2sivfM!~5s}OTH*iQ!)DngRi5w*~*epUY!w^CdUOvwr3yUOuOefPPHDH-OqU~@N zV>NhE&7Xv@0yw`Kx`k;G<}%*W!Zm>Tg~({&QA=#;Ssi4gSrKpyq7X0jI~$tkCt^+j zDFkgGe+v=RuzIFCt)QVZ0!iQ>n|>bB936|xcTyo?=-t1!Rcom%rTstOsBiohpuqnR zcP5kU`OkQ#_5Y2K^#3BZkL?0ae;~-NX1O3CbbnRfw?^HTv0c3Iu{p;OUpM1nlRXw9 z3_Qz)2D=8S2F`#4R)iLJ^$4nbvz%W4vd)Gre?ZatpA56>e>xg&x9h(NlIuU*w8yJU za;oWW#CjVZ36)$~vbVxTFs`ll|C ziaYu$ihoY^wFWe%=335;U_x1|x%3drqqwucpKw&RF~G%ZNESYFu??F#-Ai;>7GLR8 zopjqjSAf&fqm+*S;%6M2i~;Tiiaywhj?7n z(P>Dubn$hkim40xEo0|m-~~1=E|_ED;^q*pc;uBo+{hWRH!=0j!WfiN5@4@xHj25f zi{ePi1fbQWTsr_QB}Eqe)tLFz)NUaDEQM7Bgiq7cB;1+`8pHT$k4F9%l=lDpe_>_Q z_dlcYH0%E-lgU==|C=D`|K$U%$f@x3AC|imClL=mHcJ)l3^FhH(vS7-yDnC>niXSB zKYGkmZOg|1l<~2AjLq!xcvq!%c-UQ3zFexkHx`|hJIbj8><47!=1ydC ztg=+Q6K<)cmVR#fPXGV_0RR632LNY1{>1=1voQ_>0kR4N0vA17uTcO4#8lgk(=ZTy g_g8qI`jkt%0<#+o0|EwI_ba8)1hX*?&jpbn4VkaETL1t6 delta 1900 zcmV-y2b1`KD1a!Cgc&q2HUKa%FfcGMFfcGMFaR(yGcz(W03a}vVF6^b0RaO6e?vm9 zQ2+z%TYGQYHW2UM`V_2N)HdL$wqrX*hBQml1TBy@L7Z*_fPY>=Vp%(yIs;%kPVh?<|Jo)X7B)vR6JAAL4 zA6|ZtJe zXn!*e?5M9*Lq`^ANBqzn!y-vFAQkfgx=Tp{Ktpr-haAO3c!8dGY_ddHe_7JfE-eKh zdY2JYmx=>*3^W_uf9lalmRs z2s*1S*aIux4YD*T=uGlo*ATA();vdkd_cSp{!gSM#|gFa_ovf~^P|1JBd#nV%tb`e z(9B!#{{L7K;>aOSu|48=f28x$B^tuG`@0ar{(iJQHdHSeasMwC+_u9&j{n~o?oLwv ze>|bA#{btqp+~uerV(?(2+zVd1tS9zeT6{Fv0c*2;1l@Gwro>JZdR#@G#zFYsJ3ZR zgUf7WJ4Cmw%p%W4m=;K;t$79l7lHjUSL-`P;S9O=gM?t(7*bycfA&<{vXIJpj>@2_ z(#AF|b!<#}U~frBNgoa*OZs5aSQO(N*S)c^=5rO-HRvzuZ=q)ph3Q6_>&Vbt&Sl=$ zckk38>y}P*Xz2e^@9z(c#+kc^u82K%;t6~VVE-+6)9*!0A&v3p&~Q<#h=FB%OE+R% zhMjTSul+D9J4>gXf9#MCDyyYG#`ThnfwD?hZN_N#+5}ydCqN1;tE)Uvw;GVwU^EgT)m!)-DFYYMks(<~k-|7MOb8y`S53%4K2H;TZsoAEH zFyc`CCqt)fp_>ku=g&X?>Dz$+lNkroNc@kN1hzmK-E|PWe~Qpu3@sNI&ff9oKd;(< zon5>?zc`*wl@DjrORBkqH6$l3)!@tY_~P^7r(?fSYzkBL&JU+k_Qva_tttaN`i4}G zppJ>i($=`%`6P*fK)hgvd==zSqL|LT1r285(cI4rd!gtYQ~wb|43z0Fw``LXv*I%X z3(At7%%~E!e|7J_-gEe}*2hYP-na=4!(7zr|W{_F=YGOH+3JoLF66-fm z5sEBbOnhX6GH=zoapV_we%psuse>!^p{FKW7#9VAQ1I)?)hJ#@` z|Ch73ed&E}a9TEar71QO3Z)!i(l88#NxZzWQ~ATa-EuhvjeO2&V_ zQQ!J4Ku-Mc?~cdm^Pf?3{!&zBY>RsztbP>uEqc6 z{=Xg)>z^OrMT?)kZe?#6-4eu4!Q(dwWxND~RU|WD^{Q{W<5w{hCb@O^;k3Brh)Qj& ze<3`(4a*c7xzSn$UJP9|UQkdg!NGP3?G)Plm!DnLwn(KdexVs-+v-O!RXUESf;GTU za9_Xa0x7wpFJt(Z)Ltto+z7^uwOmLKusm&&Y2+K6mDPke2KdCrCamjtFD9@k zzQV^k$-aNB45y)|D4G97pK)w63(U#?e}+4|JL&!3q}l(~Ln8l+-PT4fL@-Mpt_U0A zc~MKHDbd2l{JWqMzAlhl#L-32bDUgMF~i42-634^(Ce`Qhw+Gg7gOy#jDabn1NP<3 zmQh!YQyfc?G_<^?E2p7_^vF`c{|}~(KqW113#oA-1^T(_W(z0|x8k~qVEnSDe>U5r zWc=qJR@Qz0GZ;B;wJp#S&Fpz0?*i2FG^LpU?!eF%HiKksu9i38@+Y diff --git a/spec/cassettes/deleteComment.yml b/spec/cassettes/deleteComment.yml new file mode 100644 index 0000000..359e83a --- /dev/null +++ b/spec/cassettes/deleteComment.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.deleteComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '304' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:56:10 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:56:10 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/deletePost.yml b/spec/cassettes/deletePost.yml new file mode 100644 index 0000000..7ee79f6 --- /dev/null +++ b/spec/cassettes/deletePost.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.deletePost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD137 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '303' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:16:35 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:16:35 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/deleteTerm.yml b/spec/cassettes/deleteTerm.yml new file mode 100644 index 0000000..57a6346 --- /dev/null +++ b/spec/cassettes/deleteTerm.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.deleteTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory173470052 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '349' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:42:07 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:42:07 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editComment.yml b/spec/cassettes/editComment.yml new file mode 100644 index 0000000..dba3798 --- /dev/null +++ b/spec/cassettes/editComment.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.editComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1comment_parentcontentThis + is a test thing here.authorJohn + Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '788' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:54:50 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:54:50 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/editPost.yml b/spec/cassettes/editPost.yml new file mode 100644 index 0000000..3347451 --- /dev/null +++ b/spec/cassettes/editPost.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.editPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134post_typepostpost_statusdraftpost_title5 + Ways to Know You''re Coolpost_contentI + don''t always write tests, but when I do, I use RSpec. + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '713' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:13:52 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:13:52 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editProfile.yml b/spec/cassettes/editProfile.yml new file mode 100644 index 0000000..98a77d0 --- /dev/null +++ b/spec/cassettes/editProfile.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.editProfile0WORDPRESS_USERNAMEWORDPRESS_PASSWORDfirst_nameJohnson + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '388' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:45:48 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:45:48 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editTerm.yml b/spec/cassettes/editTerm.yml new file mode 100644 index 0000000..4a705d8 --- /dev/null +++ b/spec/cassettes/editTerm.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.editTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORD576440namegazellestaxonomycategory + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '488' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:40:09 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 1\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:40:09 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getAuthors.yml b/spec/cassettes/getAuthors.yml new file mode 100644 index 0000000..a04beaa --- /dev/null +++ b/spec/cassettes/getAuthors.yml @@ -0,0 +1,54 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getAuthors0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '276' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:46:25 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '763' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n user_id46917508\n + \ user_logincontently\n + \ display_namecontently\n\n + \ \n user_id33483367\n + \ user_loginzachfeldman\n + \ display_namezachfeldman\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:46:25 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getComment.yml b/spec/cassettes/getComment.yml new file mode 100644 index 0000000..c153cfd --- /dev/null +++ b/spec/cassettes/getComment.yml @@ -0,0 +1,62 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '301' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:28:07 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '1482' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n date_created_gmt20130604T20:07:46\n + \ user_id46917508\n + \ comment_id1\n + \ parent0\n + \ statusapprove\n + \ contentComments are fun!\n + \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-1\n + \ post_id134\n + \ post_title2013 Hair Color: Get the&nbsp;Look\n + \ authorcontently\n + \ author_urlhttp://WORDPRESS_HOST\n + \ author_emailWORDPRESS_USERNAME\n + \ author_ip184.75.98.7\n + \ type\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:28:07 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getCommentCount.yml b/spec/cassettes/getCommentCount.yml new file mode 100644 index 0000000..b6f1443 --- /dev/null +++ b/spec/cassettes/getCommentCount.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getCommentCount0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '308' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:27:15 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '467' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n approved1\n + \ awaiting_moderation0\n + \ spam0\n total_comments1\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:27:15 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getCommentStatusList.yml b/spec/cassettes/getCommentStatusList.yml new file mode 100644 index 0000000..9750825 --- /dev/null +++ b/spec/cassettes/getCommentStatusList.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getCommentStatusList0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '286' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:56:42 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '408' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n holdUnapproved\n + \ approveApproved\n + \ spamSpam\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:56:42 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getComments.yml b/spec/cassettes/getComments.yml new file mode 100644 index 0000000..573c8b7 --- /dev/null +++ b/spec/cassettes/getComments.yml @@ -0,0 +1,90 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getComments0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '301' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:49:29 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '4159' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n date_created_gmt20130604T20:47:50\n + \ user_id46917508\n + \ comment_id3\n + \ parent0\n + \ statusapprove\n + \ contentThis is a test thing here.\n + \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-3\n + \ post_id134\n + \ post_title2013 Hair Color: Get the&nbsp;Look\n + \ authorcontently\n + \ author_urlhttp://WORDPRESS_HOST\n + \ author_emailWORDPRESS_USERNAME\n + \ author_ip184.75.98.7\n + \ type\n\n + \ \n date_created_gmt20130604T20:46:25\n + \ user_id46917508\n + \ comment_id2\n + \ parent0\n + \ statusapprove\n + \ contentThis is a test comment.\n + \ linkhttp://WORDPRESS_HOST/about/comment-page-1/#comment-2\n + \ post_id1\n + \ post_titleAbout\n + \ authorcontently\n + \ author_urlhttp://WORDPRESS_HOST\n + \ author_emailWORDPRESS_USERNAME\n + \ author_ip184.75.98.7\n + \ type\n\n + \ \n date_created_gmt20130604T20:07:46\n + \ user_id46917508\n + \ comment_id1\n + \ parent0\n + \ statusapprove\n + \ contentComments are fun!\n + \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-1\n + \ post_id134\n + \ post_title2013 Hair Color: Get the&nbsp;Look\n + \ authorcontently\n + \ author_urlhttp://WORDPRESS_HOST\n + \ author_emailWORDPRESS_USERNAME\n + \ author_ip184.75.98.7\n + \ type\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:49:29 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getMediaItem.yml b/spec/cassettes/getMediaItem.yml new file mode 100644 index 0000000..e3bd1a7 --- /dev/null +++ b/spec/cassettes/getMediaItem.yml @@ -0,0 +1,66 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getMediaItem0WORDPRESS_USERNAMEWORDPRESS_PASSWORD129 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '305' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 21:07:35 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '2166' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n attachment_id129\n + \ date_created_gmt20130529T19:47:11\n + \ parent128\n linkhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg\n + \ title8yI9E3I\n + \ caption\n + \ description\n + \ metadata\n width1848\n + \ height2970\n file/home/wpcom/public_html/wp-content/blogs.dir/3dd/47989391/files/2013/05/8yi9e3i.jpg\n + \ sizes\n\n + \ image_meta\n aperture0\n + \ credit\n camera\n + \ caption\n + \ created_timestamp0\n + \ copyright\n + \ focal_length0\n + \ iso0\n shutter_speed0\n + \ title\n\n\n + \ thumbnailhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg?w=93\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 21:07:35 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getMediaLibrary.yml b/spec/cassettes/getMediaLibrary.yml new file mode 100644 index 0000000..1e5b264 --- /dev/null +++ b/spec/cassettes/getMediaLibrary.yml @@ -0,0 +1,66 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getMediaLibrary0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '305' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 21:08:52 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '2213' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n attachment_id129\n + \ date_created_gmt20130529T19:47:11\n + \ parent128\n linkhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg\n + \ title8yI9E3I\n + \ caption\n + \ description\n + \ metadata\n width1848\n + \ height2970\n file/home/wpcom/public_html/wp-content/blogs.dir/3dd/47989391/files/2013/05/8yi9e3i.jpg\n + \ sizes\n\n + \ image_meta\n aperture0\n + \ credit\n camera\n + \ caption\n + \ created_timestamp0\n + \ copyright\n + \ focal_length0\n + \ iso0\n shutter_speed0\n + \ title\n\n\n + \ thumbnailhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg?w=93\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 21:08:52 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getOptions.yml b/spec/cassettes/getOptions.yml index 24216b2..86e7fb8 100644 --- a/spec/cassettes/getOptions.yml +++ b/spec/cassettes/getOptions.yml @@ -5,7 +5,7 @@ http_interactions: uri: http://WORDPRESS_HOST/xmlrpc.php body: encoding: US-ASCII - string: ! 'wp.getOptions0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS + string: ! 'wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD ' headers: @@ -14,7 +14,7 @@ http_interactions: Content-Type: - text/xml; charset=utf-8 Content-Length: - - '315' + - '313' Connection: - keep-alive Accept: @@ -27,11 +27,11 @@ http_interactions: Server: - nginx Date: - - Wed, 15 May 2013 14:42:57 GMT + - Tue, 04 Jun 2013 21:20:10 GMT Content-Type: - text/xml; charset=UTF-8 Content-Length: - - '8887' + - '8893' Connection: - keep-alive Vary: @@ -57,235 +57,189 @@ http_interactions: dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ - PHN0cmluZz4zLjYtYmV0YTM8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8 - L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Ymxv - Z191cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5k - ZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPldvcmRQcmVzcyBBZGRyZXNzIChV - UkwpPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 - dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1Q8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+aG9tZV91cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlNp - dGUgQWRkcmVzcyAoVVJMKTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+ - MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19I - T1NUPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmltYWdlX2RlZmF1bHRfbGlu - a190eXBlPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ - ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5JbWFnZSBkZWZhdWx0IGxpbmsg - dHlwZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+ - PHZhbHVlPjxzdHJpbmc+ZmlsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5p - bWFnZV9kZWZhdWx0X3NpemU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l - bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkltYWdlIGRl - ZmF1bHQgc2l6ZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + PHN0cmluZz4zLjYtYmV0YTMtMjQzNzU8L3N0cmluZz48L3ZhbHVlPjwvbWVt + YmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h + bWU+YmxvZ191cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 + bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPldvcmRQcmVzcyBBZGRy + ZXNzIChVUkwpPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + PjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29s + ZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwv + bmFtZT48dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1Q8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+aG9tZV91cmw8L25hbWU+PHZhbHVlPjxz + dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPlNpdGUgQWRkcmVzcyAoVVJMKTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJv + b2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQ + UkVTU19IT1NUPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmltYWdlX2RlZmF1 + bHRfbGlua190eXBlPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+ + PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5JbWFnZSBkZWZhdWx0 + IGxpbmsgdHlwZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl cj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9v bGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PmltYWdlX2RlZmF1bHRfYWxpZ248L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAg - PG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkltYWdl - IGRlZmF1bHQgYWxpZ248L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8 - L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZh - bHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9t + L25hbWU+PHZhbHVlPjxzdHJpbmc+ZmlsZTwvc3RyaW5nPjwvdmFsdWU+PC9t ZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT50ZW1wbGF0ZTwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVy - PjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVtcGxhdGU8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9u - bHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48 - c3RyaW5nPnB1Yi9idWVubzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwv - c3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zdHls - ZXNoZWV0PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ - ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5TdHlsZXNoZWV0PC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9u - YW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmlu - Zz5wdWIvYnVlbm88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj - dD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVt - Ym5haWw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5k - ZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlBvc3QgVGh1bWJuYWlsPC9zdHJp - bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5 - PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJv - b2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGltZV96b25lPC9u - YW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFt - ZT48dmFsdWU+PHN0cmluZz5UaW1lIFpvbmU8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVl - Pjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu + bmFtZT5pbWFnZV9kZWZhdWx0X3NpemU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPklt + YWdlIGRlZmF1bHQgc2l6ZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+ + MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + PjxuYW1lPmltYWdlX2RlZmF1bHRfYWxpZ248L25hbWU+PHZhbHVlPjxzdHJ1 + Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5n + PkltYWdlIGRlZmF1bHQgYWxpZ248L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29s + ZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT50ZW1wbGF0ZTwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8 + bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVtcGxh + dGU8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPnB1Yi9idWVubzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i + ZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5zdHlsZXNoZWV0PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+ + PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5TdHlsZXNoZWV0PC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv + bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ + PHN0cmluZz5wdWIvYnVlbm88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8 + L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z + dF90aHVtYm5haWw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 + bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlBvc3QgVGh1bWJuYWls + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJl + YWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFs + dWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0 + cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGltZV96 + b25lPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVz + YzwvbmFtZT48dmFsdWU+PHN0cmluZz5UaW1lIFpvbmU8L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+ + PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+YmxvZ190aXRsZTwvbmFtZT48dmFs + dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl + PjxzdHJpbmc+U2l0ZSBUaXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xl + YW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h + bWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y3RoaXNpc2F0ZXN0PC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2dfdGFnbGluZTwvbmFtZT48dmFs + dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl + PjxzdHJpbmc+U2l0ZSBUYWdsaW5lPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9v + bGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5TbWlsZSEgWW914oCZ + cmUgYXQgdGhlIGJlc3QgV29yZFByZXNzLmNvbSBzaXRlIGV2ZXI8L3N0cmlu Zz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+YmxvZ190aXRsZTwvbmFtZT48dmFsdWU+PHN0 - cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp - bmc+U2l0ZSBUaXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwv - Ym9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFs - dWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y3RoaXNpc2F0ZXN0PC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPmJsb2dfdGFnbGluZTwvbmFtZT48dmFsdWU+PHN0 - cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp - bmc+U2l0ZSBUYWdsaW5lPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + PgogIDxtZW1iZXI+PG5hbWU+ZGF0ZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxz + dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPkRhdGUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4w PC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52 - YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5TbWlsZSEgWW914oCZcmUgYXQg - dGhlIGJlc3QgV29yZFByZXNzLmNvbSBzaXRlIGV2ZXI8L3N0cmluZz48L3Zh + YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5GIGosIFk8L3N0cmluZz48L3Zh bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+ZGF0ZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkRh - dGUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + ZW1iZXI+PG5hbWU+dGltZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlRp + bWUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy PjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29s ZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwv - bmFtZT48dmFsdWU+PHN0cmluZz5GIGosIFk8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+dGltZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l - bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlRpbWUgRm9y - bWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 - dmFsdWU+PHN0cmluZz5nOmkgYTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT51 - c2Vyc19jYW5fcmVnaXN0ZXI8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1l - bWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFsbG93IG5l - dyB1c2VycyB0byBzaWduIHVwPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVh - bj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3Zh - bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfdzwvbmFtZT48dmFsdWU+PHN0 - cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp - bmc+VGh1bWJuYWlsIFdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVh - bj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4xNTA8L2ludD48L3ZhbHVlPjwv - bWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+dGh1bWJuYWlsX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0cnVjdD4K - ICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGh1 - bWJuYWlsIEhlaWdodDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwv - Ym9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFs - dWU8L25hbWU+PHZhbHVlPjxpbnQ+MTUwPC9pbnQ+PC92YWx1ZT48L21lbWJl - cj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnRodW1ibmFpbF9jcm9wPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1i - ZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Dcm9wIHRodW1i - bmFpbCB0byBleGFjdCBkaW1lbnNpb25zPC9zdHJpbmc+PC92YWx1ZT48L21l + bmFtZT48dmFsdWU+PHN0cmluZz5nOmkgYTwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT51c2Vyc19jYW5fcmVnaXN0ZXI8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ + CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFs + bG93IG5ldyB1c2VycyB0byBzaWduIHVwPC9zdHJpbmc+PC92YWx1ZT48L21l bWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48 Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+PC92YWx1 - ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPm1lZGl1bV9zaXplX3c8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPk1l - ZGl1bSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9v - bGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+bWVkaXVtX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0 + cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVh + bj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfdzwvbmFtZT48dmFs + dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl + PjxzdHJpbmc+VGh1bWJuYWlsIFdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48 + Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4xNTA8L2ludD48L3Zh + bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0 cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp - bmc+TWVkaXVtIHNpemUgaW1hZ2UgaGVpZ2h0PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1 - ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+bGFyZ2Vfc2l6ZV93PC9uYW1lPjx2YWx1 - ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+ - PHN0cmluZz5MYXJnZSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1 + bmc+VGh1bWJuYWlsIEhlaWdodDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xl + YW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h + bWU+dmFsdWU8L25hbWU+PHZhbHVlPjxpbnQ+MTUwPC9pbnQ+PC92YWx1ZT48 + L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + PjxuYW1lPnRodW1ibmFpbF9jcm9wPC9uYW1lPjx2YWx1ZT48c3RydWN0Pgog + IDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Dcm9w + IHRodW1ibmFpbCB0byBleGFjdCBkaW1lbnNpb25zPC9zdHJpbmc+PC92YWx1 ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2 YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4xMDI0 - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxhcmdlX3NpemVfaDwvbmFtZT48 - dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZh - bHVlPjxzdHJpbmc+TGFyZ2Ugc2l6ZSBpbWFnZSBoZWlnaHQ8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25h - bWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5n - PjEwMjQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVmYXVsdF9jb21tZW50 - X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1l - PmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+QWxsb3cgcGVvcGxlIHRvIHBv - c3QgY29tbWVudHMgb24gbmV3IGFydGljbGVzPC9zdHJpbmc+PC92YWx1ZT48 + PG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+ + PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPm1lZGl1bV9zaXplX3c8L25hbWU+PHZhbHVlPjxz + dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPk1lZGl1bSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1ZT48 L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1 ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5vcGVuPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlZmF1bHRfcGluZ19zdGF0dXM8L25h - bWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1l - Pjx2YWx1ZT48c3RyaW5nPkFsbG93IGxpbmsgbm90aWZpY2F0aW9ucyBmcm9t - IG90aGVyIGJsb2dzIChwaW5nYmFja3MgYW5kIHRyYWNrYmFja3MpPC9zdHJp - bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5 - PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0 - cmluZz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2dfcHVibGlj - PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwv - bmFtZT48dmFsdWU+PHN0cmluZz5Qcml2YWN5IGFjY2Vzczwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFt - ZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT53b3JkcHJlc3MuY29tPC9uYW1l + bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+bWVkaXVtX3NpemVfaDwvbmFtZT48dmFs + dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl + PjxzdHJpbmc+TWVkaXVtIHNpemUgaW1hZ2UgaGVpZ2h0PC9zdHJpbmc+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1l + Pjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4z + MDA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGFyZ2Vfc2l6ZV93PC9uYW1l Pjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48 - dmFsdWU+PHN0cmluZz5UaGlzIGlzIGEgd29yZHByZXNzLmNvbSBibG9nPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv - bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ - PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj - dD48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD4KICAgICAgPC92YWx1ZT4K - ICAgIDwvcGFyYW0+CiAgPC9wYXJhbXM+CjwvbWV0aG9kUmVzcG9uc2U+Cg== - http_version: - recorded_at: Wed, 15 May 2013 14:42:57 GMT -- request: - method: post - uri: http://WORDPRESS_HOST/xmlrpc.php - body: - encoding: US-ASCII - string: ! 'wp.getOptions0wrongjf3290fh0tbf34fhjvih - -' - headers: - User-Agent: - - XMLRPC::Client (Ruby 1.9.3) - Content-Type: - - text/xml; charset=utf-8 - Content-Length: - - '280' - Connection: - - keep-alive - Accept: - - ! '*/*' - response: - status: - code: 200 - message: OK - headers: - Server: - - nginx - Date: - - Tue, 04 Jun 2013 19:07:59 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '403' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. - body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n faultCode\n - \ 403\n \n \n - \ faultString\n Incorrect username - or password.\n \n \n \n - \ \n\n" + dmFsdWU+PHN0cmluZz5MYXJnZSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9u + YW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmlu + Zz4xMDI0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxhcmdlX3NpemVfaDwv + bmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25h + bWU+PHZhbHVlPjxzdHJpbmc+TGFyZ2Ugc2l6ZSBpbWFnZSBoZWlnaHQ8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9u + bHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48 + c3RyaW5nPjEwMjQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj + dD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVmYXVsdF9j + b21tZW50X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVy + PjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+QWxsb3cgcGVvcGxl + IHRvIHBvc3QgY29tbWVudHMgb24gbmV3IGFydGljbGVzPC9zdHJpbmc+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1l + Pjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5v + cGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlZmF1bHRfcGluZ19zdGF0 + dXM8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNj + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFsbG93IGxpbmsgbm90aWZpY2F0aW9u + cyBmcm9tIG90aGVyIGJsb2dzIChwaW5nYmFja3MgYW5kIHRyYWNrYmFja3Mp + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJl + YWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFs + dWU+PHN0cmluZz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9z + dHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2df + cHVibGljPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ + ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Qcml2YWN5IGFjY2Vzczwvc3Ry + aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25s + eTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxz + dHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0Pjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT53b3JkcHJlc3MuY29t + PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwv + bmFtZT48dmFsdWU+PHN0cmluZz5UaGlzIGlzIGEgd29yZHByZXNzLmNvbSBi + bG9nPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 + dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8 + L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD4KICAgICAgPC92 + YWx1ZT4KICAgIDwvcGFyYW0+CiAgPC9wYXJhbXM+CjwvbWV0aG9kUmVzcG9u + c2U+Cg== http_version: - recorded_at: Tue, 04 Jun 2013 19:07:59 GMT + recorded_at: Tue, 04 Jun 2013 21:20:10 GMT recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/getPost.yml b/spec/cassettes/getPost.yml new file mode 100644 index 0000000..f37c64c --- /dev/null +++ b/spec/cassettes/getPost.yml @@ -0,0 +1,196 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134posttermscustom_fields + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '461' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:03:32 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '6714' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv + ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 + ZT4KICAgICAgPHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPnBvc3RfaWQ8L25h + bWU+PHZhbHVlPjxzdHJpbmc+MTM0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxz + dHJpbmc+MjAxMyBIYWlyIENvbG9yOiBHZXQgdGhlIExvb2s8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9u + YW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUzMFQxMzo1MToz + NDwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+cG9zdF9kYXRlX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1l + Lmlzbzg2MDE+MjAxMzA1MzBUMTM6NTE6MzQ8L2RhdGVUaW1lLmlzbzg2MDE+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZp + ZWQ8L25hbWU+PHZhbHVlPjxkYXRlVGltZS5pc284NjAxPjIwMTMwNTMwVDEz + OjUxOjM1PC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5wb3N0X21vZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+ + PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzBUMTM6NTE6MzU8L2RhdGVUaW1l + Lmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBv + c3Rfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPnB1Ymxpc2g8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90eXBl + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnBvc3Q8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9uYW1lPC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPjIwMTMtaGFpci1jb2xvci1nZXQtdGhlLWxvb2s8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRo + b3I8L25hbWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwv + bmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48 + c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5wb3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3Am + Z3Q7Jmx0O2kmZ3Q7QnkgU2FyYWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0 + OyZsdDtwJmd0OyZsdDtpJmd0OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3Am + Z3Q7VG9ucyBvZiBnb3JnZW91cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4g + Z3JhY2luZyB0aGUgcmVkIGNhcnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291 + bGQgc2F5IHRoZXkgYXJlIGRlZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAy + MDEzIGhhaXIgY29sb3IgdHJlbmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMg + dG8ga2VlcCBpbiBtaW5kIHdoZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRo + ZSBuZXcgeWVhciEmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJl + IC0gVGhlIHJlYWxseSBib2xkIG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRp + cHMgaXMgZGVmaW5pdGVseSBvbiB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFk + aWVzIGFyZSBjaG9vc2luZyB0byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9t + IHJvb3QgdG8gdGlwIGEgbXVjaCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhy + ZWY9JnF1b3Q7aHR0cDovL3d3dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtl + dXAvdGVkLWdpYnNvbi1vbi1zcHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zl + ci1hbmQtdW5kZXJodHRwOi8vJnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQg + R2lic29uJmx0Oy9hJmd0Oywgb3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMs + IHRoZSBzdGFyayBvbWJyZSB0cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3Qu + ICZxdW90O0nigJltIG92ZXIgb21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFy + ay4gVGhlcmXigJlzIGEgd2F5IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxv + b2sgc28gdGhhdCBpdOKAmXMgc2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBj + b250cmFzdGluZywgaXTigJlzIG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJv + dXQgYSBzbW9vdGhlciB0cmFuc2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBp + cyAgZ3JhZHVhbCwgeW91IGNhbiB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8g + ZGlkIHRoZSBjb2xvciBpcyBhbiBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3 + aXRob3V0IG11Y2ggaW4gdGhlIHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0 + IHdvcmsuJnF1b3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBC + b2xkLCBjcmVhdGl2ZSBjb2xvciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24g + dGhlIHdpbGQgc2lkZSwgYWRkaW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVs + eSB0aGUgd2F5IHRvIGdvLiBBbmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBi + cmlnaHQgY29wcGVyIC0gdHVycXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBn + cmVlbiBhcmUgYWxsIHRoZSByYWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4n + dCByZWFkeSB0byBnbyBmdWxsLW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2Eg + aHJlZj0mcXVvdDtodHRwOi8vdGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAx + Mi8wMS9jaGFsay1pdC11cC9odHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRo + ZSB0aXBzIG9mIHlvdXIgaGFpciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7 + L3AmZ3Q7Jmx0O3AmZ3Q7My4gRGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIg + aG90IGxvb2sgZm9yIFNwcmluZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9 + JnF1b3Q7aHR0cDovL3d3dy5mYXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1w + ZXRlci1zb20tc3MtMTMtMjkxNDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVs + aWNhdGUgcGFzdGVscyB0aHJvdWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4g + SXQncyBhIGdyZWF0IHdheSB0byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5l + eHBlY3RlZCwgYnV0IGl0J3Mgbm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBz + b21lIG9mIHRoZSBib2xkZXIgaHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsm + bHQ7cCZndDs0LiBTdW4tZmxlY2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwg + d2lsbCBnb3JnZW91cywganVzdC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4t + ZmxlY2tlZCBodWVzIGV2ZXIgZ28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5v + dCwgbXkgZnJpZW5kcy4gU3VuLWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1h + a2UgYW55IGRyYWIgY29sb3IgcG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUg + bW9zdCBjb21wbGV4aW9ucy4mbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0 + OzUuIENvb2wgdG9uZXMgLSBPbiB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9u + ZXMgYXJlIG1ha2luZyBhIGh1Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNy + aXNwIGFuZCBjbGVhbiBzaGFkZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAy + MDEzLCZxdW90OyBDbGVtZW50cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdp + bGwgYWxzbyBzZWUsIGZvciB0aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJz + IG9mIHRoZSAgbGlnaHRlciBzaGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhl + IGFsbW9zdCB0b25lbGVzcyBhbmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNj + b3JkaW5nIHRvICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29t + LmF1L2xpZmVzdHlsZS9iZWF1dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEw + NC0yYzd6NC5odG1saHR0cDovLyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0 + Oy9hJmd0Oy4gT24gdGhlIG9wcG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwg + YmUgc3VwZXIgZGFyaywgd2l0aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxh + Y2sgc2hhZGVzLiBJbiBteSBvcGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBj + YW4gdHJ1bHkgcHVsbCBvZmYgdGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3Ms + IHRob3VnaC4mbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBs + b29rcyB0byBiZSBhIHN1cGVyIGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZs + dDsvcCZndDsmbHQ7cCZndDtGQUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBj + b2xvcnMgYXJlIHBpY2tpbmcgdXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0 + IHJlYWR5IHRvIG1ha2UgdGhlIGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0 + aGUgZW5kcyBvZiB5b3VyIGhhaXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5 + IGZ1biBlZmZlY3Qgd2l0aCBzcGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24u + Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9w + Jmd0OyZsdDtwJmd0OyZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0 + O2JyJmd0OyZsdDsvcCZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJp + bmc+MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5wb3N0X21pbWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFt + ZT48dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8w + NS8zMC8yMDEzLWhhaXItY29sb3ItZ2V0LXRoZS1sb29rLzwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5ndWlkPC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPmh0dHA6Ly9XT1JEUFJFU1NfSE9TVC8/cD0xMzQ8L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bWVudV9v + cmRlcjwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPmNvbW1lbnRfc3RhdHVzPC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPm9wZW48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cGluZ19zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5zdGlja3k8L25hbWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdGh1bWJuYWls + PC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+CjwvZGF0YT48L2FycmF5Pjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2Zvcm1hdDwv + bmFtZT48dmFsdWU+PHN0cmluZz5zdGFuZGFyZDwvc3RyaW5nPjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50ZXJtczwvbmFtZT48dmFsdWU+ + PGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5h + bWU+dGVybV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPm5hbWU8L25hbWU+PHZh + bHVlPjxzdHJpbmc+VW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zbHVnPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPnVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+dGVybV9ncm91cDwvbmFtZT48dmFsdWU+PHN0cmlu + Zz4wPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnRlcm1fdGF4b25vbXlfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3Ry + aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50YXhvbm9t + eTwvbmFtZT48dmFsdWU+PHN0cmluZz5jYXRlZ29yeTwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5kZXNjcmlwdGlvbjwvbmFt + ZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+cGFyZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Y291 + bnQ8L25hbWU+PHZhbHVlPjxpbnQ+NDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+ + Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jdXN0b21fZmllbGRzPC9uYW1lPjx2 + YWx1ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJl + cj48bmFtZT5pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4zOTY8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+a2V5PC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPmphYmJlcl9wdWJsaXNoZWQ8L3N0cmluZz48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVl + PjxzdHJpbmc+MTM2OTkyMTg5Nzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9t + ZW1iZXI+Cjwvc3RydWN0PgogICAgICA8L3ZhbHVlPgogICAgPC9wYXJhbT4K + ICA8L3BhcmFtcz4KPC9tZXRob2RSZXNwb25zZT4K + http_version: + recorded_at: Wed, 05 Jun 2013 15:03:32 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostFormats.yml b/spec/cassettes/getPostFormats.yml new file mode 100644 index 0000000..dd6e7b9 --- /dev/null +++ b/spec/cassettes/getPostFormats.yml @@ -0,0 +1,58 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPostFormats0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '304' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:20:13 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '934' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n standardStandard\n + \ asideAside\n + \ chatChat\n + \ galleryGallery\n + \ linkLink\n + \ imageImage\n + \ quoteQuote\n + \ statusStatus\n + \ videoVideo\n + \ audioAudio\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:20:13 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostStatusList.yml b/spec/cassettes/getPostStatusList.yml new file mode 100644 index 0000000..4444966 --- /dev/null +++ b/spec/cassettes/getPostStatusList.yml @@ -0,0 +1,58 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPostFormats0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '280' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:20:54 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '934' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n standardStandard\n + \ asideAside\n + \ chatChat\n + \ galleryGallery\n + \ linkLink\n + \ imageImage\n + \ quoteQuote\n + \ statusStatus\n + \ videoVideo\n + \ audioAudio\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:20:54 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostType.yml b/spec/cassettes/getPostType.yml new file mode 100644 index 0000000..589ba97 --- /dev/null +++ b/spec/cassettes/getPostType.yml @@ -0,0 +1,66 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPostType0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '350' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:19:02 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '1627' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n namepost\n + \ labelPosts\n + \ hierarchical0\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ has_archive0\n + \ supports\n title1\n + \ editor1\n + \ author1\n + \ thumbnail1\n + \ excerpt1\n + \ trackbacks1\n + \ custom-fields1\n + \ comments1\n + \ revisions1\n + \ post-formats1\n + \ geo-location1\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:19:03 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostTypes.yml b/spec/cassettes/getPostTypes.yml new file mode 100644 index 0000000..c53cb0a --- /dev/null +++ b/spec/cassettes/getPostTypes.yml @@ -0,0 +1,134 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getPostTypes0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '339' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:19:19 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '7887' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n post\n + \ namepost\n + \ labelPosts\n + \ hierarchical0\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ has_archive0\n + \ supports\n title1\n + \ editor1\n + \ author1\n + \ thumbnail1\n + \ excerpt1\n + \ trackbacks1\n + \ custom-fields1\n + \ comments1\n + \ revisions1\n + \ post-formats1\n + \ geo-location1\n\n\n + \ page\n namepage\n + \ labelPages\n + \ hierarchical1\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ has_archive0\n + \ supports\n title1\n + \ editor1\n + \ author1\n + \ thumbnail1\n + \ page-attributes1\n + \ custom-fields1\n + \ comments1\n + \ revisions1\n\n\n + \ attachment\n nameattachment\n + \ labelMedia\n + \ hierarchical0\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ has_archive0\n + \ supports\n title1\n + \ author1\n + \ comments1\n\n\n + \ revision\n namerevision\n + \ labelRevisions\n + \ hierarchical0\n + \ public0\n + \ show_ui0\n + \ _builtin1\n + \ has_archive0\n + \ supports\n author1\n\n\n + \ nav_menu_item\n namenav_menu_item\n + \ labelNavigation Menu Items\n + \ hierarchical0\n + \ public0\n + \ show_ui0\n + \ _builtin1\n + \ has_archive0\n + \ supports\n title1\n + \ editor1\n\n\n + \ safecss\n namesafecss\n + \ labelCustom CSS\n + \ hierarchical0\n + \ public0\n + \ show_ui0\n + \ _builtin0\n + \ has_archive0\n + \ supports\n revisions1\n\n\n + \ custom_dns\n namecustom_dns\n + \ labelCustom DNS\n + \ hierarchical0\n + \ public0\n + \ show_ui0\n + \ _builtin0\n + \ has_archive0\n + \ supports\n revisions1\n\n\n + \ feedback\n namefeedback\n + \ labelFeedbacks\n + \ hierarchical0\n + \ public0\n + \ show_ui1\n + \ _builtin0\n + \ has_archive0\n + \ supports\n title1\n + \ editor1\n\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:19:19 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPosts.yml b/spec/cassettes/getPosts.yml index 75bd19a..b291437 100644 --- a/spec/cassettes/getPosts.yml +++ b/spec/cassettes/getPosts.yml @@ -5,7 +5,7 @@ http_interactions: uri: http://WORDPRESS_HOST/xmlrpc.php body: encoding: US-ASCII - string: ! 'wp.getPosts0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASSpost_typepostpost_statuspublishnumber1offset0orderbypost_dateorderascposttermscustom_fields + string: ! 'wp.getPosts0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost_typepostorderbypost_dateorderascfieldsposttermscustom_fields ' headers: @@ -14,7 +14,7 @@ http_interactions: Content-Type: - text/xml; charset=utf-8 Content-Length: - - '909' + - '726' Connection: - keep-alive Accept: @@ -27,11 +27,11 @@ http_interactions: Server: - nginx Date: - - Wed, 15 May 2013 14:42:57 GMT + - Wed, 05 Jun 2013 15:05:41 GMT Content-Type: - text/xml; charset=UTF-8 Content-Length: - - '3605' + - '35468' Connection: - keep-alive Vary: @@ -40,126 +40,793 @@ http_interactions: - If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header. body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n post_id3\n - \ post_titleRob as PM\n - \ post_date20130416T18:13:18\n - \ post_date_gmt20130416T18:13:18\n - \ post_modified20130416T18:13:19\n - \ post_modified_gmt20130416T18:13:19\n - \ post_statuspublish\n - \ post_typepost\n - \ post_namerob-as-pm\n - \ post_author46917508\n - \ post_password\n - \ post_excerpt\n - \ post_content<p><i>By Cindy - Bokma</i></p><p>Rob as PM is amazballs!!</p><div - id="summary"><p><br></p></div>\n - \ post_parent0\n - \ post_mime_type\n - \ linkhttp://WORDPRESS_HOST/2013/04/16/rob-as-pm/\n - \ guidhttp://WORDPRESS_HOST/?p=3\n - \ menu_order0\n comment_statusopen\n - \ ping_statusopen\n - \ sticky0\n - \ post_thumbnail\n\n - \ post_formatstandard\n - \ terms\n \n term_id1\n - \ nameUncategorized\n - \ sluguncategorized\n - \ term_group0\n - \ term_taxonomy_id1\n - \ taxonomycategory\n - \ description\n - \ parent0\n - \ count11\n\n\n - \ custom_fields\n \n - \ id3\n keyjabber_published\n - \ value1366135999\n\n\n\n\n - \ \n \n \n\n" - http_version: - recorded_at: Wed, 15 May 2013 14:42:57 GMT -- request: - method: post - uri: http://WORDPRESS_HOST/xmlrpc.php - body: - encoding: US-ASCII - string: ! 'wp.getPost0WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS3posttermscustom_fields - -' - headers: - User-Agent: - - XMLRPC::Client (Ruby 1.9.3) - Content-Type: - - text/xml; charset=utf-8 - Content-Length: - - '484' - Connection: - - keep-alive - Accept: - - ! '*/*' - response: - status: - code: 200 - message: OK - headers: - Server: - - nginx - Date: - - Wed, 15 May 2013 14:42:58 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '3558' - Connection: - - keep-alive - Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. - body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n post_id3\n - \ post_titleRob as PM\n - \ post_date20130416T18:13:18\n - \ post_date_gmt20130416T18:13:18\n - \ post_modified20130416T18:13:19\n - \ post_modified_gmt20130416T18:13:19\n - \ post_statuspublish\n - \ post_typepost\n - \ post_namerob-as-pm\n - \ post_author46917508\n - \ post_password\n - \ post_excerpt\n - \ post_content<p><i>By Cindy - Bokma</i></p><p>Rob as PM is amazballs!!</p><div - id="summary"><p><br></p></div>\n - \ post_parent0\n - \ post_mime_type\n - \ linkhttp://WORDPRESS_HOST/2013/04/16/rob-as-pm/\n - \ guidhttp://WORDPRESS_HOST/?p=3\n - \ menu_order0\n comment_statusopen\n - \ ping_statusopen\n - \ sticky0\n - \ post_thumbnail\n\n - \ post_formatstandard\n - \ terms\n \n term_id1\n - \ nameUncategorized\n - \ sluguncategorized\n - \ term_group0\n - \ term_taxonomy_id1\n - \ taxonomycategory\n - \ description\n - \ parent0\n - \ count11\n\n\n - \ custom_fields\n \n - \ id3\n keyjabber_published\n - \ value1366135999\n\n\n\n - \ \n \n \n\n" + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv + ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 + ZT4KICAgICAgPGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3RydWN0PgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4zPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rf + dGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Um9iIGFzIFBNPC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZGF0ZTwv + bmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA0MTZUMTg6MTM6 + MTg8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPnBvc3RfZGF0ZV9nbXQ8L25hbWU+PHZhbHVlPjxkYXRlVGlt + ZS5pc284NjAxPjIwMTMwNDE2VDE4OjEzOjE4PC9kYXRlVGltZS5pc284NjAx + PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21vZGlm + aWVkPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDQxNlQx + ODoxMzoxOTwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+cG9zdF9tb2RpZmllZF9nbXQ8L25hbWU+PHZhbHVl + PjxkYXRlVGltZS5pc284NjAxPjIwMTMwNDE2VDE4OjEzOjE5PC9kYXRlVGlt + ZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w + b3N0X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5wdWJsaXNoPC9zdHJp + bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdHlw + ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5wb3N0PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbmFtZTwvbmFtZT48dmFs + dWU+PHN0cmluZz5yb2ItYXMtcG08L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+PHZhbHVlPjxz + dHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFsdWU+PHN0cmlu + Zz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2NvbnRlbnQ8 + L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2kmZ3Q7QnkgQ2lu + ZHkgQm9rbWEmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0O1JvYiBhcyBQ + TSBpcyBhbWF6YmFsbHMhISZsdDsvcCZndDsmbHQ7ZGl2IGlkPSZxdW90O3N1 + bW1hcnkmcXVvdDsmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsm + bHQ7L2RpdiZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X21pbWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFs + dWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8wNC8xNi9y + b2ItYXMtcG0vPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy + PjxuYW1lPmd1aWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQ + UkVTU19IT1NULz9wPTM8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+bWVudV9vcmRlcjwvbmFtZT48dmFsdWU+PGludD4wPC9p + bnQ+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmNvbW1lbnRf + c3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9wZW48L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGluZ19zdGF0dXM8L25h + bWU+PHZhbHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT5zdGlja3k8L25hbWU+PHZhbHVlPjxib29s + ZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPnBvc3RfdGh1bWJuYWlsPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+ + CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5wb3N0X2Zvcm1hdDwvbmFtZT48dmFsdWU+PHN0cmluZz5zdGFuZGFy + ZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50 + ZXJtczwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3Ry + dWN0PgogIDxtZW1iZXI+PG5hbWU+dGVybV9pZDwvbmFtZT48dmFsdWU+PHN0 + cmluZz4xPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPm5hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+VW5jYXRlZ29yaXplZDwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zbHVn + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybV9ncm91cDwv + bmFtZT48dmFsdWU+PHN0cmluZz4wPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnRlcm1fdGF4b25vbXlfaWQ8L25hbWU+PHZh + bHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT50YXhvbm9teTwvbmFtZT48dmFsdWU+PHN0cmluZz5jYXRl + Z29yeTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5kZXNjcmlwdGlvbjwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGFyZW50PC9uYW1l + Pjx2YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+Y291bnQ8L25hbWU+PHZhbHVlPjxpbnQ+NDwvaW50 + PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48 + L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jdXN0 + b21fZmllbGRzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVl + PjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5pZDwvbmFtZT48dmFsdWU+PHN0 + cmluZz4zPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPmtleTwvbmFtZT48dmFsdWU+PHN0cmluZz5qYWJiZXJfcHVibGlzaGVk + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZh + bHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjEzNjYxMzU5OTk8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9h + cnJheT48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgogIDx2 + YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48 + dmFsdWU+PHN0cmluZz44PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + WU9VIEFSRSBFRElURUQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUu + aXNvODYwMT4yMDEzMDUxMFQyMDoyNDozMDwvZGF0ZVRpbWUuaXNvODYwMT48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlX2dt + dDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MTBUMjA6 + MjQ6MzA8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxkYXRl + VGltZS5pc284NjAxPjIwMTMwNTEwVDIwOjI0OjMwPC9kYXRlVGltZS5pc284 + NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21v + ZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAx + MzA1MTBUMjA6MjQ6MzA8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPmRyYWZ0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnBvc3RfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz5w + b3N0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnBvc3RfbmFtZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25h + bWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48 + dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5n + Pjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w + b3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGhpcyBhIGdyZWF0 + IHRlc3QuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9taW1l + X3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxpbms8L25hbWU+PHZhbHVlPjxz + dHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTg8L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Z3VpZDwvbmFtZT48dmFs + dWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9ODwvc3RyaW5n + PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51X29yZGVy + PC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZhbHVlPjxz + dHJpbmc+Y2xvc2VkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPnBpbmdfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9w + ZW48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + c3RpY2t5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3RodW1ibmFpbDwv + bmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgo8L2RhdGE+PC9hcnJheT48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9mb3JtYXQ8L25h + bWU+PHZhbHVlPjxzdHJpbmc+c3RhbmRhcmQ8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybXM8L25hbWU+PHZhbHVlPjxh + cnJheT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1l + PnRlcm1faWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5uYW1lPC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPlVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+c2x1ZzwvbmFtZT48dmFsdWU+PHN0cmlu + Zz51bmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnRlcm1fZ3JvdXA8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50 + ZXJtX3RheG9ub215X2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGF4b25vbXk8 + L25hbWU+PHZhbHVlPjxzdHJpbmc+Y2F0ZWdvcnk8L3N0cmluZz48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVzY3JpcHRpb248L25hbWU+ + PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnBhcmVudDwvbmFtZT48dmFsdWU+PHN0cmluZz4wPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmNvdW50 + PC9uYW1lPjx2YWx1ZT48aW50PjQ8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgo8 + L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+Y3VzdG9tX2ZpZWxkczwvbmFtZT48dmFs + dWU+PGFycmF5PjxkYXRhPgo8L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwvbWVt + YmVyPgo8L3N0cnVjdD48L3ZhbHVlPgogIDx2YWx1ZT48c3RydWN0PgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xMjg8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z + dF90aXRsZTwvbmFtZT48dmFsdWU+PHN0cmluZz5Xb3JkUHJlc3MgVGVzdDwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X2RhdGU8L25hbWU+PHZhbHVlPjxkYXRlVGltZS5pc284NjAxPjIwMTMwNTI5 + VDE5OjQ3OjI0PC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT5wb3N0X2RhdGVfZ210PC9uYW1lPjx2YWx1ZT48 + ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUyOVQxOTo0NzoyNDwvZGF0ZVRpbWUu + aXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z + dF9tb2RpZmllZDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAx + MzA1MjlUMTk6NDc6MjQ8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWRfZ210PC9uYW1l + Pjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUyOVQxOTo0NzoyNDwv + ZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+cG9zdF9zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+cHVibGlz + aDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w + b3N0X3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+cG9zdDwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X25hbWU8L25h + bWU+PHZhbHVlPjxzdHJpbmc+d29yZHByZXNzLXRlc3Q8L3N0cmluZz48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25h + bWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48 + dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5n + Pjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w + b3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVzdGluZyB0ZXN0 + IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv + cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt + IGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 + bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk + b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv + ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz + aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg + YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l + dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7C + oFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRl + c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp + bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg + dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC5UZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g + aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz + dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g + ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s + b3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Ig + c2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0 + IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt + ZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu + wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu + ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 + ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0 + IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv + cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt + IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw + c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt + IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LlRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l + dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7C + oFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRl + c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp + bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg + dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz + dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs + b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4NCg0KJmFtcDtuYnNwOw0KDQpU + ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0 + IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv + cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt + IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw + c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt + IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRl + c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp + bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg + dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz + dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs + b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl + bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp + cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 + bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk + b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv + ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz + aXQgYW1ldC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt + ZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu + wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU + ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g + aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz + dW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxv + cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt + IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw + c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt + IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3Rp + bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg + dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz + dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs + b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl + bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp + cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 + bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk + b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv + ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz + aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg + YW1ldC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu + wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU + ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g + aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz + dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g + ZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu + ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVt + IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw + c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt + IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3Rpbmcg + dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz + dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs + b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl + bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp + cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 + bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk + b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv + ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz + aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg + YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l + dC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU + ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g + aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz + dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g + ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s + b3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu + ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 + ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlw + c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt + IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv + bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y + IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp + dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu + ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3RpbmcgdGVz + dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs + b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl + bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp + cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 + bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk + b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv + ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz + aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg + YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l + dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC5U + ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 + aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n + IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl + c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg + bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y + ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g + aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz + dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g + ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s + b3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Ig + c2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh + bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 + LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg + VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz + dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu + ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 + ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0 + IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiZsdDthIGhyZWY9JnF1b3Q7 + aHR0cDovL2N0aGlzaXNhdGVzdC5maWxlcy53b3JkcHJlc3MuY29tLzIwMTMv + MDUvOHlpOWUzaS5qcGcmcXVvdDsmZ3Q7Jmx0O2ltZyBjbGFzcz0mcXVvdDth + bGlnbnJpZ2h0IHNpemUtbWVkaXVtIHdwLWltYWdlLTEyOSZxdW90OyBhbHQ9 + JnF1b3Q7OHlJOUUzSSZxdW90OyBzcmM9JnF1b3Q7aHR0cDovL2N0aGlzaXNh + dGVzdC5maWxlcy53b3JkcHJlc3MuY29tLzIwMTMvMDUvOHlpOWUzaS5qcGc/ + dz0xODYmcXVvdDsgd2lkdGg9JnF1b3Q7MTg2JnF1b3Q7IGhlaWdodD0mcXVv + dDszMDAmcXVvdDsgLyZndDsmbHQ7L2EmZ3Q7PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9taW1lX3R5cGU8L25hbWU+PHZhbHVlPjxzdHJp + bmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + Pmxpbms8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19I + T1NULzIwMTMvMDUvMjkvd29yZHByZXNzLXRlc3QvPC9zdHJpbmc+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmd1aWQ8L25hbWU+PHZhbHVl + PjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTEyODwvc3RyaW5n + PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51X29yZGVy + PC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZhbHVlPjxz + dHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + cj48bmFtZT5waW5nX3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5vcGVu + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnN0 + aWNreTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5haWw8L25h + bWU+PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0PC9uYW1l + Pjx2YWx1ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1ZT48YXJy + YXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT50 + ZXJtX2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48dmFsdWU+ + PHN0cmluZz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + dW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVy + bV90YXhvbm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9ub215PC9u + YW1lPjx2YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3Ry + aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jb3VudDwv + bmFtZT48dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KPC9z + dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+PHZhbHVl + PjxhcnJheT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxu + YW1lPmlkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjM4ODwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5rZXk8L25hbWU+PHZhbHVl + PjxzdHJpbmc+amFiYmVyX3B1Ymxpc2hlZDwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0 + cmluZz4xMzY5ODU2ODQ2PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9z + dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJl + cj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVt + YmVyPjxuYW1lPnBvc3RfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTMyPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rf + dGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MjAxMyBIYWlyIENvbG9yOiBH + ZXQgdGhlIExvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNv + ODYwMT4yMDEzMDUyOVQyMzowMTozMjwvZGF0ZVRpbWUuaXNvODYwMT48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlX2dtdDwv + bmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MjlUMjM6MDE6 + MzI8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxkYXRlVGlt + ZS5pc284NjAxPjIwMTMwNTI5VDIzOjAxOjMyPC9kYXRlVGltZS5pc284NjAx + PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21vZGlm + aWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1 + MjlUMjM6MDE6MzI8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2YWx1ZT48 + c3RyaW5nPmRyYWZ0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt + YmVyPjxuYW1lPnBvc3RfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz5wb3N0 + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBv + c3RfbmFtZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+ + PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFs + dWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2km + Z3Q7QnkgU2FyYWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0 + OyZsdDtpJmd0OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7VG9ucyBv + ZiBnb3JnZW91cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4gZ3JhY2luZyB0 + aGUgcmVkIGNhcnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291bGQgc2F5IHRo + ZXkgYXJlIGRlZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAyMDEzIGhhaXIg + Y29sb3IgdHJlbmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMgdG8ga2VlcCBp + biBtaW5kIHdoZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRoZSBuZXcgeWVh + ciEmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJlIC0gVGhlIHJl + YWxseSBib2xkIG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRpcHMgaXMgZGVm + aW5pdGVseSBvbiB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFkaWVzIGFyZSBj + aG9vc2luZyB0byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9tIHJvb3QgdG8g + dGlwIGEgbXVjaCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhyZWY9JnF1b3Q7 + aHR0cDovL3d3dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtldXAvdGVkLWdp + YnNvbi1vbi1zcHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zlci1hbmQtdW5k + ZXJodHRwOi8vJnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQgR2lic29uJmx0 + Oy9hJmd0Oywgb3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMsIHRoZSBzdGFy + ayBvbWJyZSB0cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3QuICZxdW90O0ni + gJltIG92ZXIgb21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFyay4gVGhlcmXi + gJlzIGEgd2F5IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxvb2sgc28gdGhh + dCBpdOKAmXMgc2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBjb250cmFzdGlu + ZywgaXTigJlzIG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJvdXQgYSBzbW9v + dGhlciB0cmFuc2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBpcyAgZ3JhZHVh + bCwgeW91IGNhbiB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8gZGlkIHRoZSBj + b2xvciBpcyBhbiBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3aXRob3V0IG11 + Y2ggaW4gdGhlIHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0IHdvcmsuJnF1 + b3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBCb2xkLCBjcmVh + dGl2ZSBjb2xvciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24gdGhlIHdpbGQg + c2lkZSwgYWRkaW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVseSB0aGUgd2F5 + IHRvIGdvLiBBbmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBicmlnaHQgY29w + cGVyIC0gdHVycXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBncmVlbiBhcmUg + YWxsIHRoZSByYWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4ndCByZWFkeSB0 + byBnbyBmdWxsLW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2EgaHJlZj0mcXVv + dDtodHRwOi8vdGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAxMi8wMS9jaGFs + ay1pdC11cC9odHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRoZSB0aXBzIG9m + IHlvdXIgaGFpciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0 + O3AmZ3Q7My4gRGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIgaG90IGxvb2sg + Zm9yIFNwcmluZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9JnF1b3Q7aHR0 + cDovL3d3dy5mYXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1wZXRlci1zb20t + c3MtMTMtMjkxNDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVsaWNhdGUgcGFz + dGVscyB0aHJvdWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4gSXQncyBhIGdy + ZWF0IHdheSB0byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5leHBlY3RlZCwg + YnV0IGl0J3Mgbm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBzb21lIG9mIHRo + ZSBib2xkZXIgaHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDs0 + LiBTdW4tZmxlY2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwgd2lsbCBnb3Jn + ZW91cywganVzdC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4tZmxlY2tlZCBo + dWVzIGV2ZXIgZ28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5vdCwgbXkgZnJp + ZW5kcy4gU3VuLWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1ha2UgYW55IGRy + YWIgY29sb3IgcG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUgbW9zdCBjb21w + bGV4aW9ucy4mbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OzUuIENvb2wg + dG9uZXMgLSBPbiB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9uZXMgYXJlIG1h + a2luZyBhIGh1Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNyaXNwIGFuZCBj + bGVhbiBzaGFkZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAyMDEzLCZxdW90 + OyBDbGVtZW50cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdpbGwgYWxzbyBz + ZWUsIGZvciB0aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJzIG9mIHRoZSAg + bGlnaHRlciBzaGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhlIGFsbW9zdCB0 + b25lbGVzcyBhbmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNjb3JkaW5nIHRv + ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29tLmF1L2xpZmVz + dHlsZS9iZWF1dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEwNC0yYzd6NC5o + dG1saHR0cDovLyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0Oy9hJmd0Oy4g + T24gdGhlIG9wcG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwgYmUgc3VwZXIg + ZGFyaywgd2l0aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxhY2sgc2hhZGVz + LiBJbiBteSBvcGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBjYW4gdHJ1bHkg + cHVsbCBvZmYgdGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3MsIHRob3VnaC4m + bHQ7L3AmZ3Q7Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBsb29rcyB0byBi + ZSBhIHN1cGVyIGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZsdDsvcCZndDsm + bHQ7cCZndDtGQUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBjb2xvcnMgYXJl + IHBpY2tpbmcgdXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0IHJlYWR5IHRv + IG1ha2UgdGhlIGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0aGUgZW5kcyBv + ZiB5b3VyIGhhaXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5IGZ1biBlZmZl + Y3Qgd2l0aCBzcGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24uJmx0O2JyJmd0 + OyZsdDsvcCZndDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtw + Jmd0OyZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZs + dDsvcCZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3Ry + aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21p + bWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl + PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFsdWU+ + PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9MTMyPC9zdHJpbmc+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmd1aWQ8L25hbWU+ + PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTEzMjwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51 + X29yZGVyPC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZh + bHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5waW5nX3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmlu + Zz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu + YW1lPnN0aWNreTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5h + aWw8L25hbWU+PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+ + PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0 + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1 + ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 + bmFtZT50ZXJtX2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48 + L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48 + dmFsdWU+PHN0cmluZz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxz + dHJpbmc+dW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h + bWU+dGVybV90YXhvbm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9z + dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9u + b215PC9uYW1lPjx2YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92 + YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9u + YW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5j + b3VudDwvbmFtZT48dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJl + cj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+ + PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48 + L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KICA8dmFsdWU+PHN0cnVjdD4K + ICA8bWVtYmVyPjxuYW1lPnBvc3RfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + MTM0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MjAxMyBIYWlyIENv + bG9yOiBHZXQgdGhlIExvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRp + bWUuaXNvODYwMT4yMDEzMDUzMFQxMzo1MTozNDwvZGF0ZVRpbWUuaXNvODYw + MT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRl + X2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzBU + MTM6NTE6MzQ8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxk + YXRlVGltZS5pc284NjAxPjIwMTMwNTMwVDEzOjUxOjM1PC9kYXRlVGltZS5p + c284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X21vZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+ + MjAxMzA1MzBUMTM6NTE6MzU8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPnB1Ymxpc2g8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+cG9zdF90eXBlPC9uYW1lPjx2YWx1ZT48c3Ry + aW5nPnBvc3Q8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ + PG5hbWU+cG9zdF9uYW1lPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjIwMTMtaGFp + ci1jb2xvci1nZXQtdGhlLWxvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+PHZhbHVlPjxz + dHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt + ZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFsdWU+PHN0cmlu + Zz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2NvbnRlbnQ8 + L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2kmZ3Q7QnkgU2Fy + YWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OyZsdDtpJmd0 + OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7VG9ucyBvZiBnb3JnZW91 + cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4gZ3JhY2luZyB0aGUgcmVkIGNh + cnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291bGQgc2F5IHRoZXkgYXJlIGRl + ZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAyMDEzIGhhaXIgY29sb3IgdHJl + bmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMgdG8ga2VlcCBpbiBtaW5kIHdo + ZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRoZSBuZXcgeWVhciEmbHQ7L3Am + Z3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJlIC0gVGhlIHJlYWxseSBib2xk + IG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRpcHMgaXMgZGVmaW5pdGVseSBv + biB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFkaWVzIGFyZSBjaG9vc2luZyB0 + byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9tIHJvb3QgdG8gdGlwIGEgbXVj + aCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3 + dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtldXAvdGVkLWdpYnNvbi1vbi1z + cHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zlci1hbmQtdW5kZXJodHRwOi8v + JnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQgR2lic29uJmx0Oy9hJmd0Oywg + b3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMsIHRoZSBzdGFyayBvbWJyZSB0 + cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3QuICZxdW90O0nigJltIG92ZXIg + b21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFyay4gVGhlcmXigJlzIGEgd2F5 + IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxvb2sgc28gdGhhdCBpdOKAmXMg + c2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBjb250cmFzdGluZywgaXTigJlz + IG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJvdXQgYSBzbW9vdGhlciB0cmFu + c2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBpcyAgZ3JhZHVhbCwgeW91IGNh + biB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8gZGlkIHRoZSBjb2xvciBpcyBh + biBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3aXRob3V0IG11Y2ggaW4gdGhl + IHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0IHdvcmsuJnF1b3Q7Jmx0O2Jy + Jmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBCb2xkLCBjcmVhdGl2ZSBjb2xv + ciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24gdGhlIHdpbGQgc2lkZSwgYWRk + aW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVseSB0aGUgd2F5IHRvIGdvLiBB + bmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBicmlnaHQgY29wcGVyIC0gdHVy + cXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBncmVlbiBhcmUgYWxsIHRoZSBy + YWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4ndCByZWFkeSB0byBnbyBmdWxs + LW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8v + dGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAxMi8wMS9jaGFsay1pdC11cC9o + dHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRoZSB0aXBzIG9mIHlvdXIgaGFp + ciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7My4g + RGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIgaG90IGxvb2sgZm9yIFNwcmlu + ZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5m + YXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1wZXRlci1zb20tc3MtMTMtMjkx + NDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVsaWNhdGUgcGFzdGVscyB0aHJv + dWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4gSXQncyBhIGdyZWF0IHdheSB0 + byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5leHBlY3RlZCwgYnV0IGl0J3Mg + bm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBzb21lIG9mIHRoZSBib2xkZXIg + aHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDs0LiBTdW4tZmxl + Y2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwgd2lsbCBnb3JnZW91cywganVz + dC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4tZmxlY2tlZCBodWVzIGV2ZXIg + Z28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5vdCwgbXkgZnJpZW5kcy4gU3Vu + LWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1ha2UgYW55IGRyYWIgY29sb3Ig + cG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUgbW9zdCBjb21wbGV4aW9ucy4m + bHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OzUuIENvb2wgdG9uZXMgLSBP + biB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9uZXMgYXJlIG1ha2luZyBhIGh1 + Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNyaXNwIGFuZCBjbGVhbiBzaGFk + ZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAyMDEzLCZxdW90OyBDbGVtZW50 + cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdpbGwgYWxzbyBzZWUsIGZvciB0 + aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJzIG9mIHRoZSAgbGlnaHRlciBz + aGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhlIGFsbW9zdCB0b25lbGVzcyBh + bmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNjb3JkaW5nIHRvICZsdDthIGhy + ZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29tLmF1L2xpZmVzdHlsZS9iZWF1 + dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEwNC0yYzd6NC5odG1saHR0cDov + LyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0Oy9hJmd0Oy4gT24gdGhlIG9w + cG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwgYmUgc3VwZXIgZGFyaywgd2l0 + aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxhY2sgc2hhZGVzLiBJbiBteSBv + cGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBjYW4gdHJ1bHkgcHVsbCBvZmYg + dGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3MsIHRob3VnaC4mbHQ7L3AmZ3Q7 + Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBsb29rcyB0byBiZSBhIHN1cGVy + IGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZsdDsvcCZndDsmbHQ7cCZndDtG + QUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBjb2xvcnMgYXJlIHBpY2tpbmcg + dXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0IHJlYWR5IHRvIG1ha2UgdGhl + IGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0aGUgZW5kcyBvZiB5b3VyIGhh + aXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5IGZ1biBlZmZlY3Qgd2l0aCBz + cGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24uJmx0O2JyJmd0OyZsdDsvcCZn + dDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OyZsdDti + ciZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDs8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z + dF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21pbWVfdHlwZTwv + bmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFsdWU+PHN0cmluZz5o + dHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8wNS8zMC8yMDEzLWhhaXItY29s + b3ItZ2V0LXRoZS1sb29rLzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5ndWlkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPmh0dHA6 + Ly9XT1JEUFJFU1NfSE9TVC8/cD0xMzQ8L3N0cmluZz48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+bWVudV9vcmRlcjwvbmFtZT48dmFsdWU+ + PGludD4wPC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PmNvbW1lbnRfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9wZW48L3N0 + cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGluZ19z + dGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zdGlja3k8L25hbWU+PHZh + bHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnBvc3RfdGh1bWJuYWlsPC9uYW1lPjx2YWx1ZT48YXJy + YXk+PGRhdGE+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAg + PG1lbWJlcj48bmFtZT5wb3N0X2Zvcm1hdDwvbmFtZT48dmFsdWU+PHN0cmlu + Zz5zdGFuZGFyZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl + cj48bmFtZT50ZXJtczwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgogIDx2 + YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+dGVybV9pZDwvbmFtZT48 + dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPm5hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+VW5jYXRl + Z29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5zbHVnPC9uYW1lPjx2YWx1ZT48c3RyaW5nPnVuY2F0ZWdvcml6ZWQ8 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVy + bV9ncm91cDwvbmFtZT48dmFsdWU+PHN0cmluZz4wPC9zdHJpbmc+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1fdGF4b25vbXlfaWQ8 + L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT50YXhvbm9teTwvbmFtZT48dmFsdWU+PHN0 + cmluZz5jYXRlZ29yeTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT5kZXNjcmlwdGlvbjwvbmFtZT48dmFsdWU+PHN0cmluZz48 + L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGFy + ZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwv + bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Y291bnQ8L25hbWU+PHZhbHVlPjxp + bnQ+NDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ + CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5jdXN0b21fZmllbGRzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+ + CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5pZDwvbmFtZT48 + dmFsdWU+PHN0cmluZz4zOTY8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog + IDxtZW1iZXI+PG5hbWU+a2V5PC9uYW1lPjx2YWx1ZT48c3RyaW5nPmphYmJl + cl9wdWJsaXNoZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTM2OTkyMTg5 + Nzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ + CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0Pjwv + dmFsdWU+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjEzNzwvc3RyaW5nPjwvdmFsdWU+ + PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3RpdGxlPC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPk5ldyB0aXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i + ZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2RhdGU8L25hbWU+PHZhbHVlPjxk + YXRlVGltZS5pc284NjAxPjIwMTMwNTMxVDEzOjI2OjM1PC9kYXRlVGltZS5p + c284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X2RhdGVfZ210PC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEz + MDUzMVQxMzoyNjozNTwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9tb2RpZmllZDwvbmFtZT48dmFs + dWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzFUMTg6Mzk6NTg8L2RhdGVU + aW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l + PnBvc3RfbW9kaWZpZWRfZ210PC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNv + ODYwMT4yMDEzMDUzMVQxODozOTo1ODwvZGF0ZVRpbWUuaXNvODYwMT48L3Zh + bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9zdGF0dXM8L25h + bWU+PHZhbHVlPjxzdHJpbmc+cHVibGlzaDwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3R5cGU8L25hbWU+PHZhbHVl + PjxzdHJpbmc+cG9zdDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l + bWJlcj48bmFtZT5wb3N0X25hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+YXQt + bGFzdDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt + ZT5wb3N0X2F1dGhvcjwvbmFtZT48dmFsdWU+PHN0cmluZz40NjkxNzUwODwv + c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 + X3Bhc3N3b3JkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFs + dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2V4Y2VycHQ8L25h + bWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnBvc3RfY29udGVudDwvbmFtZT48dmFsdWU+PHN0 + cmluZz5IZXkgdGhpcyBpcyBjb250ZW50PC9zdHJpbmc+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i + ZXI+PG5hbWU+cG9zdF9taW1lX3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ + PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxp + bms8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NU + LzIwMTMvMDUvMzEvYXQtbGFzdC88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy + PgogIDxtZW1iZXI+PG5hbWU+Z3VpZDwvbmFtZT48dmFsdWU+PHN0cmluZz5o + dHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9MTM3PC9zdHJpbmc+PC92YWx1ZT48 + L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPm1lbnVfb3JkZXI8L25hbWU+PHZh + bHVlPjxpbnQ+MDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5jb21tZW50X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5jbG9z + ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ + cGluZ19zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y2xvc2VkPC9zdHJp + bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnN0aWNreTwv + bmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5haWw8L25hbWU+PHZh + bHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21l + bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0PC9uYW1lPjx2YWx1 + ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K + ICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRh + dGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT50ZXJtX2lk + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48L3ZhbHVlPjwvbWVt + YmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48dmFsdWU+PHN0cmlu + Zz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxzdHJpbmc+dW5jYXRl + Z29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu + Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybV90YXhv + bm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92YWx1 + ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9ub215PC9uYW1lPjx2 + YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl + cj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPjx2YWx1ZT48 + c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 + bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3RyaW5nPjwv + dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jb3VudDwvbmFtZT48 + dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ + PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj4KICA8 + bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+PHZhbHVlPjxhcnJh + eT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmlk + PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjQwMzwvc3RyaW5nPjwvdmFsdWU+PC9t + ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5rZXk8L25hbWU+PHZhbHVlPjxzdHJp + bmc+amFiYmVyX3B1Ymxpc2hlZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ + CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4x + MzcwMDIxMTk1PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ + PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj4KPC9z + dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+CiAgICAgIDwvdmFsdWU+ + CiAgICA8L3BhcmFtPgogIDwvcGFyYW1zPgo8L21ldGhvZFJlc3BvbnNlPgo= http_version: - recorded_at: Wed, 15 May 2013 14:42:58 GMT -recorded_with: VCR 2.4.0 + recorded_at: Wed, 05 Jun 2013 15:05:41 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getProfile.yml b/spec/cassettes/getProfile.yml new file mode 100644 index 0000000..36aed68 --- /dev/null +++ b/spec/cassettes/getProfile.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getProfile0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '313' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:44:54 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '256' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n user_id46917508\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:44:54 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTaxonomies.yml b/spec/cassettes/getTaxonomies.yml new file mode 100644 index 0000000..4a15439 --- /dev/null +++ b/spec/cassettes/getTaxonomies.yml @@ -0,0 +1,135 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getTaxonomies0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '279' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:22:25 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '8329' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n namecategory\n + \ labelCategories\n + \ hierarchical1\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ labels\n nameCategories\n + \ singular_nameCategory\n + \ search_itemsSearch Categories\n + \ popular_items\n + \ all_itemsAll Categories\n + \ parent_itemParent Category\n + \ parent_item_colonParent Category:\n + \ edit_itemEdit Category\n + \ view_itemView Category\n + \ update_itemUpdate Category\n + \ add_new_itemAdd New Category\n + \ new_item_nameNew Category Name\n + \ separate_items_with_commas\n + \ add_or_remove_items\n + \ choose_from_most_used\n + \ not_found\n + \ menu_nameCategories\n + \ name_admin_barcategory\n\n + \ cap\n manage_termsmanage_categories\n + \ edit_termsmanage_categories\n + \ delete_termsmanage_categories\n + \ assign_termsedit_posts\n\n + \ object_type\n post\n\n\n + \ \n namepost_tag\n + \ labelTags\n + \ hierarchical0\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ labels\n nameTags\n + \ singular_nameTag\n + \ search_itemsSearch Tags\n + \ popular_itemsPopular Tags\n + \ all_itemsAll Tags\n + \ parent_item\n + \ parent_item_colon\n + \ edit_itemEdit Tag\n + \ view_itemView Tag\n + \ update_itemUpdate Tag\n + \ add_new_itemAdd New Tag\n + \ new_item_nameNew Tag Name\n + \ separate_items_with_commasSeparate tags + with commas\n add_or_remove_itemsAdd + or remove tags\n choose_from_most_usedChoose + from the most used tags\n not_foundNo + tags found.\n menu_nameTags\n + \ name_admin_barpost_tag\n\n + \ cap\n manage_termsmanage_categories\n + \ edit_termsmanage_categories\n + \ delete_termsmanage_categories\n + \ assign_termsedit_posts\n\n + \ object_type\n post\n\n\n + \ \n namepost_format\n + \ labelFormat\n + \ hierarchical0\n + \ public1\n + \ show_ui0\n + \ _builtin1\n + \ labels\n nameFormat\n + \ singular_nameFormat\n + \ search_itemsSearch Tags\n + \ popular_itemsPopular Tags\n + \ all_itemsFormat\n + \ parent_item\n + \ parent_item_colon\n + \ edit_itemEdit Tag\n + \ view_itemView Tag\n + \ update_itemUpdate Tag\n + \ add_new_itemAdd New Tag\n + \ new_item_nameNew Tag Name\n + \ separate_items_with_commasSeparate tags + with commas\n add_or_remove_itemsAdd + or remove tags\n choose_from_most_usedChoose + from the most used tags\n not_foundNo + tags found.\n menu_nameFormat\n + \ name_admin_barFormat\n\n + \ cap\n manage_termsmanage_categories\n + \ edit_termsmanage_categories\n + \ delete_termsmanage_categories\n + \ assign_termsedit_posts\n\n + \ object_type\n post\n\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:22:25 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTaxonomy.yml b/spec/cassettes/getTaxonomy.yml new file mode 100644 index 0000000..c238ad8 --- /dev/null +++ b/spec/cassettes/getTaxonomy.yml @@ -0,0 +1,77 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getTaxonomy0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '317' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:23:07 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '2846' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n namecategory\n + \ labelCategories\n + \ hierarchical1\n + \ public1\n + \ show_ui1\n + \ _builtin1\n + \ labels\n nameCategories\n + \ singular_nameCategory\n + \ search_itemsSearch Categories\n + \ popular_items\n + \ all_itemsAll Categories\n + \ parent_itemParent Category\n + \ parent_item_colonParent Category:\n + \ edit_itemEdit Category\n + \ view_itemView Category\n + \ update_itemUpdate Category\n + \ add_new_itemAdd New Category\n + \ new_item_nameNew Category Name\n + \ separate_items_with_commas\n + \ add_or_remove_items\n + \ choose_from_most_used\n + \ not_found\n + \ menu_nameCategories\n + \ name_admin_barcategory\n\n + \ cap\n manage_termsmanage_categories\n + \ edit_termsmanage_categories\n + \ delete_termsmanage_categories\n + \ assign_termsedit_posts\n\n + \ object_type\n post\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:23:07 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTerm.yml b/spec/cassettes/getTerm.yml new file mode 100644 index 0000000..b0fbf6f --- /dev/null +++ b/spec/cassettes/getTerm.yml @@ -0,0 +1,57 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory1 + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '338' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:27:17 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '865' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n term_id1\n + \ nameUncategorized\n + \ sluguncategorized\n + \ term_group0\n + \ term_taxonomy_id1\n + \ taxonomycategory\n + \ description\n + \ parent0\n + \ count2\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:27:17 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTerms.yml b/spec/cassettes/getTerms.yml new file mode 100644 index 0000000..8763408 --- /dev/null +++ b/spec/cassettes/getTerms.yml @@ -0,0 +1,75 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getTerms0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '338' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:27:36 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '2345' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n term_id490\n + \ nameAnimals\n + \ sluganimals\n + \ term_group0\n + \ term_taxonomy_id3\n + \ taxonomycategory\n + \ description\n + \ parent0\n + \ count0\n\n + \ \n term_id1\n + \ nameUncategorized\n + \ sluguncategorized\n + \ term_group0\n + \ term_taxonomy_id1\n + \ taxonomycategory\n + \ description\n + \ parent0\n + \ count2\n\n + \ \n term_id576440\n + \ nameZebras\n + \ slugzebras\n + \ term_group0\n + \ term_taxonomy_id4\n + \ taxonomycategory\n + \ description\n + \ parent490\n + \ count0\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:27:36 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getUsers.yml b/spec/cassettes/getUsers.yml new file mode 100644 index 0000000..953e8c6 --- /dev/null +++ b/spec/cassettes/getUsers.yml @@ -0,0 +1,59 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.getUsers0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '298' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:43:58 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '1283' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n \n user_id46917508\n + \ usernamecontently\n + \ first_name\n + \ last_name\n + \ registered20130305T15:25:34\n + \ bio\n emailWORDPRESS_USERNAME\n + \ nicknamecontently\n + \ nicenamecontently\n + \ urlhttp://WORDPRESS_HOST\n + \ display_namecontently\n + \ roles\n administrator\n\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:43:58 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getUsersBlogs.yml b/spec/cassettes/getUsersBlogs.yml index ac2e0ba..e7f9412 100644 --- a/spec/cassettes/getUsersBlogs.yml +++ b/spec/cassettes/getUsersBlogs.yml @@ -5,7 +5,7 @@ http_interactions: uri: http://WORDPRESS_HOST/xmlrpc.php body: encoding: US-ASCII - string: ! 'wp.getUsersBlogsWORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASS + string: ! 'wp.getUsersBlogsWORDPRESS_USERNAMEWORDPRESS_PASSWORD ' headers: @@ -27,7 +27,7 @@ http_interactions: Server: - nginx Date: - - Wed, 15 May 2013 14:42:59 GMT + - Wed, 05 Jun 2013 15:43:12 GMT Content-Type: - text/xml; charset=UTF-8 Content-Length: @@ -49,51 +49,5 @@ http_interactions: \ xmlrpchttps://WORDPRESS_HOST/xmlrpc.php\n\n\n \ \n \n \n\n" http_version: - recorded_at: Wed, 15 May 2013 14:42:59 GMT -- request: - method: post - uri: http://WORDPRESS_HOST/xmlrpc.php - body: - encoding: US-ASCII - string: ! 'wp.newPost47989391WORDPRESS_ADMIN_USERWORDPRESS_ADMIN_PASSpost_typepostpost_statuspublishpost_date20130515T10:42:59post_formatpostcomment_statusholdping_statusclosedpost_titleTest - postpost_contentThis - a great test. - -' - headers: - User-Agent: - - XMLRPC::Client (Ruby 1.9.3) - Content-Type: - - text/xml; charset=utf-8 - Content-Length: - - '994' - Connection: - - keep-alive - Accept: - - ! '*/*' - response: - status: - code: 200 - message: OK - headers: - Server: - - nginx - Date: - - Wed, 15 May 2013 14:43:00 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '177' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. - body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 39\n \n \n - \ \n\n" - http_version: - recorded_at: Wed, 15 May 2013 14:43:00 GMT -recorded_with: VCR 2.4.0 + recorded_at: Wed, 05 Jun 2013 15:43:12 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/newComment.yml b/spec/cassettes/newComment.yml new file mode 100644 index 0000000..1da9362 --- /dev/null +++ b/spec/cassettes/newComment.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.newComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134comment_parentcontentThis + is a test thing here.authorJohn + Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '789' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 20:47:54 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '170' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 3\n \n \n + \ \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 20:47:54 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/cassettes/newPost.yml b/spec/cassettes/newPost.yml new file mode 100644 index 0000000..edb5875 --- /dev/null +++ b/spec/cassettes/newPost.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.newPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost_typepostpost_statusdraftpost_title5 + Ways to Know You''re Coolpost_contentI + don''t always write tests, but when I do, I use RSpec. + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '685' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:10:17 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '178' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 147\n \n \n + \ \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:10:17 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/newTerm.yml b/spec/cassettes/newTerm.yml new file mode 100644 index 0000000..697a454 --- /dev/null +++ b/spec/cassettes/newTerm.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.newTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDnameGeraffestaxonomycategory + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '457' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 15:29:21 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '184' + Connection: + - keep-alive + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n 173470052\n \n + \ \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 15:29:21 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/setOptions.yml b/spec/cassettes/setOptions.yml new file mode 100644 index 0000000..f2ead6c --- /dev/null +++ b/spec/cassettes/setOptions.yml @@ -0,0 +1,53 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.setOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORDblog_taglineThis + is a great tagline + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '405' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Wed, 05 Jun 2013 14:49:57 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '504' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n blog_tagline\n + \ descSite Tagline\n + \ readonly0\n + \ valueThis is a great tagline\n\n\n + \ \n \n \n\n" + http_version: + recorded_at: Wed, 05 Jun 2013 14:49:57 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/uploadFile.yml b/spec/cassettes/uploadFile.yml new file mode 100644 index 0000000..015e74a --- /dev/null +++ b/spec/cassettes/uploadFile.yml @@ -0,0 +1,55 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: US-ASCII + string: ! 'wp.uploadFile0WORDPRESS_USERNAMEWORDPRESS_PASSWORDidnametest_file.pngbits"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe + ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 + \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ + \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\x00\x00\x00\x00IEND\xAEB`\x82" + +' + headers: + User-Agent: + - XMLRPC::Client (Ruby 1.9.3) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '997' + Connection: + - keep-alive + Accept: + - ! '*/*' + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 04 Jun 2013 21:17:46 GMT + Content-Type: + - text/xml; charset=UTF-8 + Content-Length: + - '526' + Connection: + - keep-alive + Vary: + - Accept-Encoding + X-Hacker: + - If you're reading this, you should visit automattic.com/jobs and apply to + join the fun, mention this header. + body: + encoding: US-ASCII + string: ! "\n\n \n + \ \n \n \n id146\n + \ filetest_file.png\n + \ urlhttp://cthisisatest.files.wordpress.com/2013/06/test_file.png\n + \ type\n\n + \ \n \n \n\n" + http_version: + recorded_at: Tue, 04 Jun 2013 21:17:46 GMT +recorded_with: VCR 2.4.0 diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb index 8afbd28..d81b233 100644 --- a/spec/rubypress_spec.rb +++ b/spec/rubypress_spec.rb @@ -2,44 +2,261 @@ describe "Rubypress" do - let(:client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) - } - let(:invalid_client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => "wrongjf3290fh0tbf34fhjvih", :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) - } + let(:string_number_regex){ /^[-+]?[0-9]+$/ } + let(:client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) } + let(:invalid_client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => "wrongjf3290fh0tbf34fhjvih", :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) } + let(:post_id){ 134 } + let(:comment_id){ 1 } + let(:comment){ {:comment_parent => "", :content => "This is a test thing here.", :author => "John Adams", :author_url => "http://johnadamsforpresidentnow.com", :author_email => "johnadams@whitehouse.gov"} } + let(:attachment_id){ 129 } + let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} + let(:options){ { "blog_tagline" => "This is a great tagline" } } + let(:post){ {:post_type => "post", :post_status => "draft", :post_title => "5 Ways to Know You're Cool", :post_content => "I don't always write tests, but when I do, I use RSpec."} } + let(:post_id_to_delete){ 137 } + let(:term){ {:name => "Geraffes", :taxonomy => "category"} } + let(:term_id_to_edit){ 576440 } + let(:edited_term){ {:name => "gazelles", :taxonomy => "category"} } + let(:term_id_to_delete){ 173470052 } + let(:term_id_to_delete_taxonomy){ "category" } + let(:edited_profile_content){ {:first_name => "Johnson"} } - describe "client" do + + describe "#client" do it '#initialize' do - client.class.should == Rubypress::Client + client.class.should == Rubypress::Client + end + + it "#execute" do + Rubypress::Client.any_instance.stub_chain(:connection, :call){ [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] } + expect(client.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) end end - it '#getOptions' do - VCR.use_cassette("getOptions", :record => :new_episodes) do - client.class.should == Rubypress::Client - client.connection.class.should == XMLRPC::Client - client.getOptions.class.should == Hash - expect { invalid_client.getOptions }.to raise_error + describe "#comments" do + + it "#getCommentCount" do + VCR.use_cassette("getCommentCount") do + client.getCommentCount({:post_id => post_id}).should include("approved" => "1") + end + end + + it "#getComment" do + VCR.use_cassette("getComment") do + client.getComment({:comment_id => comment_id}).should include("comment_id" => "1") + end + end + + it "#getComments" do + VCR.use_cassette("getComments") do + client.getComments[0].should include("post_id" => post_id.to_s) + end + end + + it "#newComment" do + VCR.use_cassette("newComment") do + client.newComment({:post_id => post_id, :comment => comment}).class.should eq(Fixnum) + end + end + + it "#editComment" do + VCR.use_cassette("editComment") do + client.editComment({:comment_id => comment_id, :comment => comment}).class.should eq(TrueClass) + end + end + + it "#deleteComment" do + VCR.use_cassette("deleteComment") do + client.deleteComment({:comment_id => comment_id}).class.should eq(TrueClass) + end + end + + it "#getCommentStatusList" do + VCR.use_cassette("getCommentStatusList") do + client.getCommentStatusList.should include("hold" => "Unapproved") + end + end + + end + + describe "#media" do + + it "#getMediaItem" do + VCR.use_cassette("getMediaItem") do + client.getMediaItem({:attachment_id => attachment_id}).should include("title" => "8yI9E3I") + end + end + + it "#getMediaLibrary" do + VCR.use_cassette("getMediaLibrary") do + client.getMediaLibrary[0].should include("attachment_id"=>"129") + end + end + + it "#uploadFile" do + VCR.use_cassette("uploadFile") do + client.uploadFile({:data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") + end + end + + end + + describe "#options" do + + it "#getOptions" do + VCR.use_cassette("getOptions") do + client.getOptions.should include("time_zone" => {"desc"=>"Time Zone", "readonly"=>false, "value"=>"0"}) + end + end + + it "#setOptions" do + VCR.use_cassette("setOptions") do + client.setOptions({:options => options}).should include("blog_tagline" => {"desc"=>"Site Tagline", "readonly"=>false, "value"=>"This is a great tagline"}) + end + end + + end + + describe "#post" do + + it "#getPost" do + VCR.use_cassette("getPost") do + client.getPost({:post_id => post_id}).should include("post_id" => "134") + end + end + + it "#getPosts" do + VCR.use_cassette("getPosts") do + client.getPosts[0].should include("post_id") + end + end + + it "#newPost" do + VCR.use_cassette("newPost") do + client.newPost({:content => post}).should =~ string_number_regex + end + end + + it "#editPost" do + VCR.use_cassette("editPost") do + client.editPost({:post_id => post_id, :content => post}).should eq(true) + end + end + + it "#deletePost" do + VCR.use_cassette("deletePost") do + client.deletePost({:post_id => post_id_to_delete}).should eq(true) + end end + + it "#getPostType" do + VCR.use_cassette("getPostType") do + client.getPostType({:post_type_name => "post"}).should include("name"=>"post") + end + end + + it "#getPostTypes" do + VCR.use_cassette("getPostTypes") do + client.getPostTypes.should include("page") + end + end + + it "#getPostFormats" do + VCR.use_cassette("getPostFormats") do + client.getPostFormats.should include("image" => "Image") + end + end + + it "#getPostStatusList" do + VCR.use_cassette("getPostStatusList") do + client.getPostStatusList.should include("standard"=>"Standard") + end + end + + end - it '#getPosts #getPost' do - VCR.use_cassette("getPosts", :record => :new_episodes) do - posts = client.getPosts(:number => 1) - posts.class.should == Array + describe "#taxonomies" do + + it "#getTaxonomy" do + VCR.use_cassette("getTaxonomy") do + client.getTaxonomy.should include("label" => "Categories") + end + end - id = posts[0]["post_id"] - client.getPost(:post_id => id).class.should == Hash + it "#getTaxonomies" do + VCR.use_cassette("getTaxonomies") do + client.getTaxonomies[0].should include("name"=>"category") + end end + + it "#getTerm" do + VCR.use_cassette("getTerm") do + client.getTerm({:term_id => 1}).should include("name"=>"Uncategorized") + end + end + + it "#getTerms" do + VCR.use_cassette("getTerms") do + client.getTerms[0].should include("taxonomy"=>"category") + end + end + + it "#newTerm" do + VCR.use_cassette("newTerm") do + client.newTerm({:content => term}).should =~ string_number_regex + end + end + + it "#editTerm" do + VCR.use_cassette("editTerm") do + client.editTerm({:term_id => term_id_to_edit, :content => edited_term}).should eq(true) + end + end + + it "#deleteTerm" do + VCR.use_cassette("deleteTerm") do + client.deleteTerm({:term_id => term_id_to_delete, :taxonomy => term_id_to_delete_taxonomy}).should eq(true) + end + end + end - it '#newPost #getUsersBlogs' do - VCR.use_cassette("getUsersBlogs", :record => :new_episodes) do - user_blogs = client.getUsersBlogs - blog_id = user_blogs[0]["blogid"] - client.newPost(:blog_id => blog_id, :content => { :post_title => "Test post", :post_content => "This a great test.", :post_type => "post"}).class.should == String + describe "#users" do + + it "#getUsersBlogs" do + VCR.use_cassette("getUsersBlogs") do + client.getUsersBlogs[0].should include("blogid") + end + end + + it "#getUsers" do + VCR.use_cassette("getUsers") do + client.getUsers[0].should include("user_id") + end + end + + it "#getProfile" do + VCR.use_cassette("getProfile") do + client.getProfile.should include("user_id") + end + end + + it "#editProfile" do + VCR.use_cassette("editProfile") do + client.editProfile({:content => edited_profile_content}).should eq(true) + end end + + it "#getAuthors" do + VCR.use_cassette("getAuthors") do + client.getAuthors[0].should include("user_id") + end + end + end + + end diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index bfcad2f..a1fc8cb 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -3,22 +3,13 @@ VCR.configure do |c| c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock - c.filter_sensitive_data("WORDPRESS_ADMIN_USER") do - ENV['WORDPRESS_ADMIN_USER'] + c.filter_sensitive_data("WORDPRESS_USERNAME") do + ENV['WORDPRESS_USERNAME'] end - - c.filter_sensitive_data("WORDPRESS_ADMIN_PASS") do - ENV['WORDPRESS_ADMIN_PASS'] - end - c.filter_sensitive_data("WORDPRESS_EDITOR_USER") do - ENV['WORDPRESS_EDITOR_USER'] - end - c.filter_sensitive_data("WORDPRESS_EDITOR_PASS") do - ENV['WORDPRESS_EDITOR_PASS'] + c.filter_sensitive_data("WORDPRESS_PASSWORD") do + ENV['WORDPRESS_PASSWORD'] end c.filter_sensitive_data("WORDPRESS_HOST") do ENV['WORDPRESS_HOST'] end - - end \ No newline at end of file From 61d9fba3ccf64e97bcb61026d6027b312176fd4c Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 5 Jun 2013 12:08:05 -0400 Subject: [PATCH 14/70] Final cleanup, version bump to 1.0.0. --- .document | 5 - .gitignore | 3 +- README.rdoc | 62 ------- Rakefile | 2 +- lib/rubypress.rb | 2 - lib/rubypress/client.rb | 4 +- lib/rubypress/{post.rb => posts.rb} | 2 +- rubypress-0.0.2.gem | Bin 5120 -> 0 bytes rubypress.gemspec | 12 +- spec/cassettes/options_spec.rb | 17 ++ spec/cassettes/users_spec.rb | 35 ++++ spec/client_spec.rb | 14 ++ spec/comments_spec.rb | 49 ++++++ spec/media_spec.rb | 24 +++ spec/posts_spec.rb | 61 +++++++ spec/rubypress_spec.rb | 262 ---------------------------- spec/spec_helper.rb | 5 +- spec/taxonomies_spec.rb | 51 ++++++ 18 files changed, 266 insertions(+), 344 deletions(-) delete mode 100644 .document delete mode 100644 README.rdoc rename lib/rubypress/{post.rb => posts.rb} (99%) delete mode 100644 rubypress-0.0.2.gem create mode 100644 spec/cassettes/options_spec.rb create mode 100644 spec/cassettes/users_spec.rb create mode 100644 spec/client_spec.rb create mode 100644 spec/comments_spec.rb create mode 100644 spec/media_spec.rb create mode 100644 spec/posts_spec.rb delete mode 100644 spec/rubypress_spec.rb create mode 100644 spec/taxonomies_spec.rb diff --git a/.document b/.document deleted file mode 100644 index 3d618dd..0000000 --- a/.document +++ /dev/null @@ -1,5 +0,0 @@ -lib/**/*.rb -bin/* -- -features/**/*.feature -LICENSE.txt diff --git a/.gitignore b/.gitignore index 6826498..1dfc830 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ *.tmp -*.swp -wordpress.yml +*.swp \ No newline at end of file diff --git a/README.rdoc b/README.rdoc deleted file mode 100644 index 03765ef..0000000 --- a/README.rdoc +++ /dev/null @@ -1,62 +0,0 @@ -# rubypress - -This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. - -WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. - - -## Getting Started - -1. Install the gem using specific_install - -A. To your system - -`gem install specific_install` - -`gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` - -B. Or using Bundler - -Inside your Gemfile: - -`gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` - -2. Create a new client - -`>wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword")` - -3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) - -`>wp.getOptions -=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} -(just a small excerpt of actual options for the sake of the whole brevity thing)` - -`>wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) -=> "24" -(returns a post ID if post was successful) - -To make further requests, check out the documentation - this blog should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). - - -## Contributing to rubypress - -We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. - -* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. -* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. -* Fork the project. -* Start a feature/bugfix branch. -* Commit and push until you are happy with your contribution. -* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. - - -## Credits - -* Dan Collis-Puro (dan@collispuro.com) -* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) - - -### Copyright and License - -Copyright (c) 2012 Dan Collis-Puro -Licensed under the same terms as WordPress itself - GPLv2. diff --git a/Rakefile b/Rakefile index 092c878..f41cae0 100644 --- a/Rakefile +++ b/Rakefile @@ -4,4 +4,4 @@ require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) -task :default => :spec \ No newline at end of file +task :default => :spec \ No newline at end of file diff --git a/lib/rubypress.rb b/lib/rubypress.rb index f29968e..b21e03d 100644 --- a/lib/rubypress.rb +++ b/lib/rubypress.rb @@ -1,5 +1,3 @@ -# encoding: UTF-8 - $LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__)) require 'xmlrpc/client' diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 33156c1..b35a651 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -1,6 +1,6 @@ require 'yaml' require 'erb' -require_relative "post" +require_relative "posts" require_relative "taxonomies" require_relative "media" require_relative "comments" @@ -53,7 +53,7 @@ def execute(method, options) end end - include Post + include Posts include Taxonomies include Media include Comments diff --git a/lib/rubypress/post.rb b/lib/rubypress/posts.rb similarity index 99% rename from lib/rubypress/post.rb rename to lib/rubypress/posts.rb index 9ef98ac..1a92cd0 100644 --- a/lib/rubypress/post.rb +++ b/lib/rubypress/posts.rb @@ -1,4 +1,4 @@ -module Post +module Posts def getPost(options = {}) default_options = { diff --git a/rubypress-0.0.2.gem b/rubypress-0.0.2.gem deleted file mode 100644 index 7cdf4e70cf8e5b0a1bc805c056d86615c1196ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmeHJXEYqz7M>t_8=V9riHoZaqg)a7jfhUPVWLEjM3fPt4OdB`ME67wVU&a*BI>Bo z>x@Jh1i{FRZbA&^C9kY^SN^Op3jR; zuCGykWQq1}WnGEb3McP!MhQQwn%UF)KqL|x>gp8g*amaaogK$BU3~|ZYRJzl9(tat zLVL0$#6SoxE}ZGqLrv&$e&k{UAg!cbj2*LCZAA}DN|ziMW!> zpV8?K)SnFDjZk@Up{yFhmd(c}^X5d}W?`2DkgOO)9qJ-2(+1biG&EC(RhCwFv^40bn|(yt!yRrx})ft zo9W;-wF<((Va+|q{#i;G^dU-DZJ6aDZ}PmXI+*?K$%2a*aVv!2Y%rXf@rvTtac72w zYl^ZlJ|gZ+5yRv;c~No-`-f9oz^uA&b-`3hk=5+2Ryu5DUm?-_M`pGARQR8c=@m9ln z%@__A?cFVlb?zAW5zccV!Y;dQB|JS?rWYSzk24+V+1}kWatBO}j=KuuL~{c_MqDg+ zcgqRx%+gsYxR+NERTbQ#0j3E}iDnwx`5Tas2L-1s z_|pKt&zt*1A0^Cu!O%$gNAsEF{8xrCqjg<%CS+kYXh}Dh+d$stsGC&JplkiFbZSR& z`w@ltiG2f#Z*X5O^+#&9xWt75-fqmoDz$Mx_JGpPa{RpMf&RNMzcz=?}nw z38qoI!6sKNB<7m9`|VgANK{BsCZ7y>-VgWFE!J~4V>WWeU1C$Xi)~750Y)qUlDb^;&+L+_g#jr z6O)GGP%3m2p{Oh|ZLGw+yW2}{QU0OuyS?u@P=?21Vu(7Rqt30#$*pXgMK_!86S@xjdC_Bu?^Fl>!b}T6C|jw%B>M3fH0aJ{*4${>uKBH(-9dTTDeVf+ z1!lFu7}{pqa@vsy8mnlYKoWgLXkD&7rFJA%T66rUfVqx+*pH7qGZaStTT9|Xa%mR8xTf<9(w;QIJ$l)kT@Uim{}LHo;&n;j$S8x(+>)bWeHHKU0pKTrme4#XArJ zMJ%n~ia^N$ty5O0U-Xr4?+a%(bBO`j)RhdlH<;yR4=0jHo6Ry-_1WCcMjF9G7Iy}F z0qHw6p$Wspy&&t7dqGn-EZX1|t;#%k8J7pjsfi3ICDEtjW<)xdl~rRGzvs0U&79ul zC7I#gM<(CKFoi-5aKCce15o>`4&@(M*Bw`clgl>^`2W*?U^$4=_xcYaC;wCb{fIXB zum0<{n0<_qV-Gv94k|cGH)y8Py2S3GMbGf;R*DUccFMA08Z5Nyo+J4nA_Ca=W^Mpz_AtNR9c z1n;w;9DeEOwR%kT=y1^bUA*2yqt-U5PrcBShwlT@(5_*jhwks9s4-C~^iDESpes#T zq*k6YlljdO32L_C&S7XH)T)Ozm%gh3RZ?*SMl%_>>7?F@w1(fU#<$2e+%=%JE!2PT z>267g*41ZmQ`0v3mHfEK+#)nsi`*I#@c4<&?1&I$^F_cSh8Oj)90)7!}Y<*AGv z-8~7D+2-+<0>NAc3^{YK=e|l(o18s)idJd;2GbH_F?x^2Z~5FTY)b?;jaf`a_~tf! zG|LDbg!Y*1s#x=Mid+}(uZ)torWt}au4G7^wt2l-czK!Cx-8(ruq`qHC^YibgVx=7(3y-?e(Rrdg#BcEOn%Ck1N{h?9wEw90 oe5Mpt07Xp%{qJuQejr&gM)M>3@Mn&n4E$u^Cj&nj_^}N911`wa(EtDd diff --git a/rubypress.gemspec b/rubypress.gemspec index f7fe897..18b0261 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,13 +2,13 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "0.0.2" + s.version = "1.0.0" s.platform = Gem::Platform::RUBY - s.author = "Daniel Collis-Puro" - s.email = ["djcp@thoughtbot.com"] - s.homepage = "https://github.com/djcp/ruby-wordpress-api" - s.summary = "Easily access WordPress installations." - s.description = "Easily push to WordPress installations through the WordPress XML-RPC API." + s.author = "Zach Feldman" + s.email = ["zachfeldman@gmail.com"] + s.homepage = "https://github.com/zachfeldman/ruby-wordpress-api" + s.summary = "Easily access WordPress installations through the WordPress XML-RPC API." + s.description = "Easily push to WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API." s.required_ruby_version = ">= 1.9.2" diff --git a/spec/cassettes/options_spec.rb b/spec/cassettes/options_spec.rb new file mode 100644 index 0000000..2b49a46 --- /dev/null +++ b/spec/cassettes/options_spec.rb @@ -0,0 +1,17 @@ +describe "#options" do + + let(:options){ { "blog_tagline" => "This is a great tagline" } } + + it "#getOptions" do + VCR.use_cassette("getOptions") do + CLIENT.getOptions.should include("time_zone" => {"desc"=>"Time Zone", "readonly"=>false, "value"=>"0"}) + end + end + + it "#setOptions" do + VCR.use_cassette("setOptions") do + CLIENT.setOptions({:options => options}).should include("blog_tagline" => {"desc"=>"Site Tagline", "readonly"=>false, "value"=>"This is a great tagline"}) + end + end + +end \ No newline at end of file diff --git a/spec/cassettes/users_spec.rb b/spec/cassettes/users_spec.rb new file mode 100644 index 0000000..1f4c0fd --- /dev/null +++ b/spec/cassettes/users_spec.rb @@ -0,0 +1,35 @@ +describe "#users" do + + let(:edited_profile_content){ {:first_name => "Johnson"} } + + it "#getUsersBlogs" do + VCR.use_cassette("getUsersBlogs") do + CLIENT.getUsersBlogs[0].should include("blogid") + end + end + + it "#getUsers" do + VCR.use_cassette("getUsers") do + CLIENT.getUsers[0].should include("user_id") + end + end + + it "#getProfile" do + VCR.use_cassette("getProfile") do + CLIENT.getProfile.should include("user_id") + end + end + + it "#editProfile" do + VCR.use_cassette("editProfile") do + CLIENT.editProfile({:content => edited_profile_content}).should eq(true) + end + end + + it "#getAuthors" do + VCR.use_cassette("getAuthors") do + CLIENT.getAuthors[0].should include("user_id") + end + end + +end \ No newline at end of file diff --git a/spec/client_spec.rb b/spec/client_spec.rb new file mode 100644 index 0000000..0bebbe4 --- /dev/null +++ b/spec/client_spec.rb @@ -0,0 +1,14 @@ +require_relative 'spec_helper' + +describe "#client" do + + it '#initialize' do + CLIENT.class.should == Rubypress::Client + end + + it "#execute" do + Rubypress::Client.any_instance.stub_chain(:connection, :call){ [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] } + expect(CLIENT.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) + end + +end \ No newline at end of file diff --git a/spec/comments_spec.rb b/spec/comments_spec.rb new file mode 100644 index 0000000..110c9c2 --- /dev/null +++ b/spec/comments_spec.rb @@ -0,0 +1,49 @@ +describe "#comments" do + + let(:post_id){ 134 } + let(:comment_id){ 1 } + let(:comment){ {:comment_parent => "", :content => "This is a test thing here.", :author => "John Adams", :author_url => "http://johnadamsforpresidentnow.com", :author_email => "johnadams@whitehouse.gov"} } + + it "#getCommentCount" do + VCR.use_cassette("getCommentCount") do + CLIENT.getCommentCount({:post_id => post_id}).should include("approved" => "1") + end + end + + it "#getComment" do + VCR.use_cassette("getComment") do + CLIENT.getComment({:comment_id => comment_id}).should include("comment_id" => "1") + end + end + + it "#getComments" do + VCR.use_cassette("getComments") do + CLIENT.getComments[0].should include("post_id" => post_id.to_s) + end + end + + it "#newComment" do + VCR.use_cassette("newComment") do + CLIENT.newComment({:post_id => post_id, :comment => comment}).class.should eq(Fixnum) + end + end + + it "#editComment" do + VCR.use_cassette("editComment") do + CLIENT.editComment({:comment_id => comment_id, :comment => comment}).class.should eq(TrueClass) + end + end + + it "#deleteComment" do + VCR.use_cassette("deleteComment") do + CLIENT.deleteComment({:comment_id => comment_id}).class.should eq(TrueClass) + end + end + + it "#getCommentStatusList" do + VCR.use_cassette("getCommentStatusList") do + CLIENT.getCommentStatusList.should include("hold" => "Unapproved") + end + end + +end \ No newline at end of file diff --git a/spec/media_spec.rb b/spec/media_spec.rb new file mode 100644 index 0000000..ed52ca0 --- /dev/null +++ b/spec/media_spec.rb @@ -0,0 +1,24 @@ + describe "#media" do + + let(:attachment_id){ 129 } + let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} + + it "#getMediaItem" do + VCR.use_cassette("getMediaItem") do + CLIENT.getMediaItem({:attachment_id => attachment_id}).should include("title" => "8yI9E3I") + end + end + + it "#getMediaLibrary" do + VCR.use_cassette("getMediaLibrary") do + CLIENT.getMediaLibrary[0].should include("attachment_id"=>"129") + end + end + + it "#uploadFile" do + VCR.use_cassette("uploadFile") do + CLIENT.uploadFile({:data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") + end + end + + end \ No newline at end of file diff --git a/spec/posts_spec.rb b/spec/posts_spec.rb new file mode 100644 index 0000000..b6c59c8 --- /dev/null +++ b/spec/posts_spec.rb @@ -0,0 +1,61 @@ +describe "#post" do + + let(:post_id){ 134 } + let(:post){ {:post_type => "post", :post_status => "draft", :post_title => "5 Ways to Know You're Cool", :post_content => "I don't always write tests, but when I do, I use RSpec."} } + let(:post_id_to_delete){ 137 } + + it "#getPost" do + VCR.use_cassette("getPost") do + CLIENT.getPost({:post_id => post_id}).should include("post_id" => "134") + end + end + + it "#getPosts" do + VCR.use_cassette("getPosts") do + CLIENT.getPosts[0].should include("post_id") + end + end + + it "#newPost" do + VCR.use_cassette("newPost") do + CLIENT.newPost({:content => post}).should =~ STRING_NUMBER_REGEX + end + end + + it "#editPost" do + VCR.use_cassette("editPost") do + CLIENT.editPost({:post_id => post_id, :content => post}).should eq(true) + end + end + + it "#deletePost" do + VCR.use_cassette("deletePost") do + CLIENT.deletePost({:post_id => post_id_to_delete}).should eq(true) + end + end + + it "#getPostType" do + VCR.use_cassette("getPostType") do + CLIENT.getPostType({:post_type_name => "post"}).should include("name"=>"post") + end + end + + it "#getPostTypes" do + VCR.use_cassette("getPostTypes") do + CLIENT.getPostTypes.should include("page") + end + end + + it "#getPostFormats" do + VCR.use_cassette("getPostFormats") do + CLIENT.getPostFormats.should include("image" => "Image") + end + end + + it "#getPostStatusList" do + VCR.use_cassette("getPostStatusList") do + CLIENT.getPostStatusList.should include("standard"=>"Standard") + end + end + +end \ No newline at end of file diff --git a/spec/rubypress_spec.rb b/spec/rubypress_spec.rb deleted file mode 100644 index d81b233..0000000 --- a/spec/rubypress_spec.rb +++ /dev/null @@ -1,262 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/spec_helper') - -describe "Rubypress" do - - let(:string_number_regex){ /^[-+]?[0-9]+$/ } - let(:client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) } - let(:invalid_client){ Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => "wrongjf3290fh0tbf34fhjvih", :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) } - let(:post_id){ 134 } - let(:comment_id){ 1 } - let(:comment){ {:comment_parent => "", :content => "This is a test thing here.", :author => "John Adams", :author_url => "http://johnadamsforpresidentnow.com", :author_email => "johnadams@whitehouse.gov"} } - let(:attachment_id){ 129 } - let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} - let(:options){ { "blog_tagline" => "This is a great tagline" } } - let(:post){ {:post_type => "post", :post_status => "draft", :post_title => "5 Ways to Know You're Cool", :post_content => "I don't always write tests, but when I do, I use RSpec."} } - let(:post_id_to_delete){ 137 } - let(:term){ {:name => "Geraffes", :taxonomy => "category"} } - let(:term_id_to_edit){ 576440 } - let(:edited_term){ {:name => "gazelles", :taxonomy => "category"} } - let(:term_id_to_delete){ 173470052 } - let(:term_id_to_delete_taxonomy){ "category" } - let(:edited_profile_content){ {:first_name => "Johnson"} } - - - describe "#client" do - - it '#initialize' do - client.class.should == Rubypress::Client - end - - it "#execute" do - Rubypress::Client.any_instance.stub_chain(:connection, :call){ [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] } - expect(client.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) - end - - end - - describe "#comments" do - - it "#getCommentCount" do - VCR.use_cassette("getCommentCount") do - client.getCommentCount({:post_id => post_id}).should include("approved" => "1") - end - end - - it "#getComment" do - VCR.use_cassette("getComment") do - client.getComment({:comment_id => comment_id}).should include("comment_id" => "1") - end - end - - it "#getComments" do - VCR.use_cassette("getComments") do - client.getComments[0].should include("post_id" => post_id.to_s) - end - end - - it "#newComment" do - VCR.use_cassette("newComment") do - client.newComment({:post_id => post_id, :comment => comment}).class.should eq(Fixnum) - end - end - - it "#editComment" do - VCR.use_cassette("editComment") do - client.editComment({:comment_id => comment_id, :comment => comment}).class.should eq(TrueClass) - end - end - - it "#deleteComment" do - VCR.use_cassette("deleteComment") do - client.deleteComment({:comment_id => comment_id}).class.should eq(TrueClass) - end - end - - it "#getCommentStatusList" do - VCR.use_cassette("getCommentStatusList") do - client.getCommentStatusList.should include("hold" => "Unapproved") - end - end - - end - - describe "#media" do - - it "#getMediaItem" do - VCR.use_cassette("getMediaItem") do - client.getMediaItem({:attachment_id => attachment_id}).should include("title" => "8yI9E3I") - end - end - - it "#getMediaLibrary" do - VCR.use_cassette("getMediaLibrary") do - client.getMediaLibrary[0].should include("attachment_id"=>"129") - end - end - - it "#uploadFile" do - VCR.use_cassette("uploadFile") do - client.uploadFile({:data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") - end - end - - end - - describe "#options" do - - it "#getOptions" do - VCR.use_cassette("getOptions") do - client.getOptions.should include("time_zone" => {"desc"=>"Time Zone", "readonly"=>false, "value"=>"0"}) - end - end - - it "#setOptions" do - VCR.use_cassette("setOptions") do - client.setOptions({:options => options}).should include("blog_tagline" => {"desc"=>"Site Tagline", "readonly"=>false, "value"=>"This is a great tagline"}) - end - end - - end - - describe "#post" do - - it "#getPost" do - VCR.use_cassette("getPost") do - client.getPost({:post_id => post_id}).should include("post_id" => "134") - end - end - - it "#getPosts" do - VCR.use_cassette("getPosts") do - client.getPosts[0].should include("post_id") - end - end - - it "#newPost" do - VCR.use_cassette("newPost") do - client.newPost({:content => post}).should =~ string_number_regex - end - end - - it "#editPost" do - VCR.use_cassette("editPost") do - client.editPost({:post_id => post_id, :content => post}).should eq(true) - end - end - - it "#deletePost" do - VCR.use_cassette("deletePost") do - client.deletePost({:post_id => post_id_to_delete}).should eq(true) - end - end - - it "#getPostType" do - VCR.use_cassette("getPostType") do - client.getPostType({:post_type_name => "post"}).should include("name"=>"post") - end - end - - it "#getPostTypes" do - VCR.use_cassette("getPostTypes") do - client.getPostTypes.should include("page") - end - end - - it "#getPostFormats" do - VCR.use_cassette("getPostFormats") do - client.getPostFormats.should include("image" => "Image") - end - end - - it "#getPostStatusList" do - VCR.use_cassette("getPostStatusList") do - client.getPostStatusList.should include("standard"=>"Standard") - end - end - - - end - - describe "#taxonomies" do - - it "#getTaxonomy" do - VCR.use_cassette("getTaxonomy") do - client.getTaxonomy.should include("label" => "Categories") - end - end - - it "#getTaxonomies" do - VCR.use_cassette("getTaxonomies") do - client.getTaxonomies[0].should include("name"=>"category") - end - end - - it "#getTerm" do - VCR.use_cassette("getTerm") do - client.getTerm({:term_id => 1}).should include("name"=>"Uncategorized") - end - end - - it "#getTerms" do - VCR.use_cassette("getTerms") do - client.getTerms[0].should include("taxonomy"=>"category") - end - end - - it "#newTerm" do - VCR.use_cassette("newTerm") do - client.newTerm({:content => term}).should =~ string_number_regex - end - end - - it "#editTerm" do - VCR.use_cassette("editTerm") do - client.editTerm({:term_id => term_id_to_edit, :content => edited_term}).should eq(true) - end - end - - it "#deleteTerm" do - VCR.use_cassette("deleteTerm") do - client.deleteTerm({:term_id => term_id_to_delete, :taxonomy => term_id_to_delete_taxonomy}).should eq(true) - end - end - - end - - describe "#users" do - - it "#getUsersBlogs" do - VCR.use_cassette("getUsersBlogs") do - client.getUsersBlogs[0].should include("blogid") - end - end - - it "#getUsers" do - VCR.use_cassette("getUsers") do - client.getUsers[0].should include("user_id") - end - end - - it "#getProfile" do - VCR.use_cassette("getProfile") do - client.getProfile.should include("user_id") - end - end - - it "#editProfile" do - VCR.use_cassette("editProfile") do - client.editProfile({:content => edited_profile_content}).should eq(true) - end - end - - it "#getAuthors" do - VCR.use_cassette("getAuthors") do - client.getAuthors[0].should include("user_id") - end - end - - end - - - -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f3793a4..2875fab 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,4 +6,7 @@ RSpec.configure do |config| -end \ No newline at end of file +end + +CLIENT = Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) +STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ \ No newline at end of file diff --git a/spec/taxonomies_spec.rb b/spec/taxonomies_spec.rb new file mode 100644 index 0000000..3e12501 --- /dev/null +++ b/spec/taxonomies_spec.rb @@ -0,0 +1,51 @@ +describe "#taxonomies" do + + let(:term){ {:name => "Geraffes", :taxonomy => "category"} } + let(:term_id_to_edit){ 576440 } + let(:edited_term){ {:name => "gazelles", :taxonomy => "category"} } + let(:term_id_to_delete){ 173470052 } + let(:term_id_to_delete_taxonomy){ "category" } + + it "#getTaxonomy" do + VCR.use_cassette("getTaxonomy") do + CLIENT.getTaxonomy.should include("label" => "Categories") + end + end + + it "#getTaxonomies" do + VCR.use_cassette("getTaxonomies") do + CLIENT.getTaxonomies[0].should include("name"=>"category") + end + end + + it "#getTerm" do + VCR.use_cassette("getTerm") do + CLIENT.getTerm({:term_id => 1}).should include("name"=>"Uncategorized") + end + end + + it "#getTerms" do + VCR.use_cassette("getTerms") do + CLIENT.getTerms[0].should include("taxonomy"=>"category") + end + end + + it "#newTerm" do + VCR.use_cassette("newTerm") do + CLIENT.newTerm({:content => term}).should =~ STRING_NUMBER_REGEX + end + end + + it "#editTerm" do + VCR.use_cassette("editTerm") do + CLIENT.editTerm({:term_id => term_id_to_edit, :content => edited_term}).should eq(true) + end + end + + it "#deleteTerm" do + VCR.use_cassette("deleteTerm") do + CLIENT.deleteTerm({:term_id => term_id_to_delete, :taxonomy => term_id_to_delete_taxonomy}).should eq(true) + end + end + + end \ No newline at end of file From d850822ee5f3ca59d1c8ab9affc0cae3a784ba6b Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 5 Jun 2013 13:07:31 -0400 Subject: [PATCH 15/70] Changed homepage. --- rubypress.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rubypress.gemspec b/rubypress.gemspec index 18b0261..1f5e937 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -6,7 +6,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] - s.homepage = "https://github.com/zachfeldman/ruby-wordpress-api" + s.homepage = "https://github.com/zachfeldman/rubypress" s.summary = "Easily access WordPress installations through the WordPress XML-RPC API." s.description = "Easily push to WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API." From 55e7ff3bd3c78aa066ebef6aaf43d51fcc3ee12d Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 2 Jul 2013 12:52:58 -0400 Subject: [PATCH 16/70] Fix for Ruby 2.0.0 XML-RPC issues. See http://bugs.ruby-lang.org/issues/8182 --- lib/rubypress/client.rb | 4 +++- rubypress.gemspec | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index b35a651..aa72796 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -29,7 +29,9 @@ def initialize(options = {}) end def connection - @connection = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,nil,nil,self.use_ssl,nil) + server = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,nil,nil,self.use_ssl,nil) + server.http_header_extra = {'accept-encoding' => 'identity'} + @connection = server end def self.default diff --git a/rubypress.gemspec b/rubypress.gemspec index 1f5e937..5585487 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "1.0.0" + s.version = "1.0.1" s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] From 895349620ec8602d26c313f212cac119c417cb0e Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Mon, 8 Jul 2013 09:59:48 -0400 Subject: [PATCH 17/70] Updated README. --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f8830d5..f9ab07c 100644 --- a/README.md +++ b/README.md @@ -50,23 +50,24 @@ To make further requests, check out the documentation - this gem should follow t ## Contributing to rubypress -We could use some help implementing wider testing and cleaning up the client code! Pull requests welcome. +Pull requests welcome. * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. * Fork the project. * Start a feature/bugfix branch. * Commit and push until you are happy with your contribution. -* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. +* Make sure to add tests for it. This is important so we don't break it in a future version unintentionally. ## Credits -* Dan Collis-Puro (dan@collispuro.com) * Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) +* Dan Collis-Puro (dan@collispuro.com) -### Copyright and License +### License -Copyright (c) 2012 Dan Collis-Puro Licensed under the same terms as WordPress itself - GPLv2. + +[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/ed093654d3f4ac89d05750e3def34190 "githalytics.com")](http://githalytics.com/zachfeldman/rubypress) From d6a7b81caa5a4f1728a1edcef9ae90938ebfcb46 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 13 Aug 2013 00:31:42 -0400 Subject: [PATCH 18/70] README updates. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f9ab07c..9a74803 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # rubypress +[![Gem Version](https://badge.fury.io/rb/rubypress.png)](http://badge.fury.io/rb/rubypress) + This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. @@ -11,15 +13,13 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS A. To your system - `gem install specific_install` - - `gem specific_install -l https://github.com/zachfeldman/ruby-wordpress-api.git` + `gem install rubypress` B. Or using Bundler Inside your Gemfile: - `gem "ruby-wordpress-api", :git => https://github.com/zachfeldman/ruby-wordpress-api.git` + `gem 'rubypress'` 2. Create a new client From 7c5fc585e89af2ed17c7bad47aea70dfb26e987d Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 3 Sep 2013 09:37:45 -0400 Subject: [PATCH 19/70] Minor gemspec change. --- rubypress-1.0.1.gem | Bin 0 -> 6144 bytes rubypress.gemspec | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 rubypress-1.0.1.gem diff --git a/rubypress-1.0.1.gem b/rubypress-1.0.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..bf32ce444d0af0d15f5c5364b5a7ba3ca58ed43b GIT binary patch literal 6144 zcmeHKXH*kd77o=Qy@%csq=p`(NHd`q5d;(%h8~)95Q$U;1f)tABp@IJumMU(2~7kd zNa%u8rS}e5XZGyO9DnSdnR8}#&aU^*EBD=Z-@EUg?|#q2(a+Yw*3TB|d=v0ziR4$2 zm6Zkj)P9w3TPaDH^uOl*sh5(Gk%s|zCI74g{dQk}Uq4%)ukHhpj*jlXReaO`Px_y) z_M6LnWBzv?^27lF^<)Fa#3XH|)|d~HbhrARblw^*30eL@T}&wUG4O2n71K)Xtl}3d z$kY$u#$}Pyz;i1h*5XG~aUQnvGR}rhhE6HqyA3`UtGnHIn6C)^fQH5fUJw~gicrG? zN!Tgb)Eh6ZwQ(u-?b->hx6U$L=2q{PHOeSh<8?0|U`!0-tHK{>fHzr8MQ!ZN-6Y>% z=L+HJ+(;$`{`si&EYsugI-&Qp=|~yj?W()& zrdP$i;#`53{EtSxIB@WuM7=Xbm`4>4`GQ*2Hc*)4LxgbHGD!jK~m ziM30Q_iAL_Ia0OVjs!}n)C9Df+!F_+21vf zzn|-mMc`-b|B8VBMg0E?_P^AGU+`aA@;mHMFi<8= z(uFpx0}D(AW-18i?V8|5+ves$O5NR&u`v#KGvrqNr?2Au>E?3Ph5>Y@+LfrN@cU!39GnnVff zLdVfj$L7-yc1%(eaQje^g;06>cLV&{tB3Elt{yQv3i3bNioOOv_CB@LIWbqZc*$mg zCe+s}1+$&-Q0*OZoIELnYt)3*q~Y}7?ZyV@IwPq1=#e*}j#XI$EmIXsuV9+B6)!Rb10&PKF_fdxzlz1-c2(OL!K-01*q0b@rNen+fVts!bf_J{W?&sGHWD@hF zaM>F6?3A)%R2oR1Wq>IF-?3D9sZLqPTi=wBn%N|WkhW!DbvjqzDc+kqeHgrrGb>N8 zgrTOu$-v0x6kiC$#U;FxY9FRpyMJ?g4h*_am#E*oRrp@}gF|yUHX!|Vp{2t^od)90O%|dcckW_ez1y*ez_)#@ni}-MSCGKoJFVKrPywT4{!n@-KSIH*i4UPn z*{g^+5^PW}Oped1ffZSFVM7-?hd78TV+a8?fl*oep08fizr0IW6cUNh{hVEAs!wl% zwI2$!FvKxvlH5(#WO}m>Ad04k3wUh?3Cc*azonLyar5Cwy;_*sw$2~S!sN@j$PwGix?}~~jVGw+%_rMT678-Ob~0;7bK8LhxbvrfZYVI zimf}(zQvPgvRwF*2z_R2{iP8bf!JU+Tza(d5$qQ-cx-gc+@ToRlC~Cl*tmS+`Sjql z1ivq_aTx~Vi?xuhEpX6|LKsA9!A&y6vK_^&UtOn{VI{G#ot{omV1ee*&R0pfiN?h)r z91yREN>x2zW;9XFauf-iVFbkPThw;ktPJug)nHYgHq>plDnrT9u!yF2l@c$r>EuM< z_Mr(Vm~U5^w(-uW)opo46WH7WltA&dED{JL0ObHpQh?&`tC9c9tL>4F_HMrZ9=^~Z zTMzd?hXwvb>i*6DUlJxO|IPnjR!&a#JOBGD^6ppucPB+XZcLKy&e{R<>PHhhr6#fc zr2O;eB?UO!>9cc&px$6iG=$D_yCV=b!F~2lqpQ=$cSm{nrJcpGu@&dNCa}bc)A&V` zbcrVzFoo*s1a6{!ZD>FH*yEr&T{q>atCMN!(5$cNiKb|dT{)}DDDXPfwQ5RHPGf6j zr=)NN_YLE8>Ertifop_Rvg&TWyhi_!NC(P*r;aJ!Wb_jXfE6dRL4%wCqERDccKj3m zqePNNt(!$8`Ne8=#i(+@rCmncRQbV;CFhC&VeTbyOzMlOIDHjYJK9-!&S8SOS`XDH z{?;8aewxG;cNq)Pu6V7SNCkzMTT%0Ld^9u^KJkM{>iUwfVm`Im_jRxr#&G?{WKG(Q z?8u9rksy{3n34ihUiPy2F>Z&UHLb u6>g%ulrqW5ZFD-T90jbkP0{Nf^u*swn7B>+S0uuBAKxSJJp%uC5%>o`OQ^p9 literal 0 HcmV?d00001 diff --git a/rubypress.gemspec b/rubypress.gemspec index 5585487..c82119f 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -8,7 +8,7 @@ Gem::Specification.new do |s| s.email = ["zachfeldman@gmail.com"] s.homepage = "https://github.com/zachfeldman/rubypress" s.summary = "Easily access WordPress installations through the WordPress XML-RPC API." - s.description = "Easily push to WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API." + s.description = "Easily access WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API in Ruby." s.required_ruby_version = ">= 1.9.2" From ee4ed6edf9f199419d48dbaef5a0d9cd0cb94c02 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 3 Sep 2013 09:42:16 -0400 Subject: [PATCH 20/70] Minor README updates. --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9a74803..105b06f 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS ## Getting Started -1. Install the gem using specific_install or Bundler +1. Install the gem A. To your system @@ -24,28 +24,26 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS 2. Create a new client ```ruby - >wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") + > wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") ``` 3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) ```ruby - >wp.getOptions + > wp.getOptions => {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} ``` - - (just a small excerpt of actual options for the sake of the whole brevity thing)` + (just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) ```ruby - >wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) - + > wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) => "24" ``` (returns a post ID if post was successful) -To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). +To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. ## Contributing to rubypress @@ -58,7 +56,7 @@ Pull requests welcome. * Start a feature/bugfix branch. * Commit and push until you are happy with your contribution. * Make sure to add tests for it. This is important so we don't break it in a future version unintentionally. - +* Submit a pull request ## Credits From 74d42262c5b865926f3d30030c034a2f30d5d6c4 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Fri, 20 Sep 2013 00:03:10 -0400 Subject: [PATCH 21/70] Remove githalytics from now --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 105b06f..d1d59c1 100644 --- a/README.md +++ b/README.md @@ -67,5 +67,5 @@ Pull requests welcome. ### License Licensed under the same terms as WordPress itself - GPLv2. - -[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/ed093654d3f4ac89d05750e3def34190 "githalytics.com")](http://githalytics.com/zachfeldman/rubypress) + From 8037f9d6b7a9d72228f7e4b7ef28682448733fcf Mon Sep 17 00:00:00 2001 From: abdelkader boudih Date: Sat, 5 Oct 2013 18:31:14 +0000 Subject: [PATCH 22/70] Deleted .gem file Removed Monkey patch if ActiveSupport is defined Reformated code --- lib/rubypress.rb | 22 ++++++++++++---------- lib/rubypress/client.rb | 14 +++++++------- lib/rubypress/comments.rb | 14 +++++++------- lib/rubypress/media.rb | 6 +++--- lib/rubypress/options.rb | 4 ++-- lib/rubypress/posts.rb | 18 +++++++++--------- lib/rubypress/taxonomies.rb | 20 ++++++++++---------- lib/rubypress/users.rb | 12 ++++++------ rubypress-1.0.1.gem | Bin 6144 -> 0 bytes 9 files changed, 56 insertions(+), 54 deletions(-) delete mode 100644 rubypress-1.0.1.gem diff --git a/lib/rubypress.rb b/lib/rubypress.rb index b21e03d..0295fa8 100644 --- a/lib/rubypress.rb +++ b/lib/rubypress.rb @@ -3,20 +3,22 @@ require 'xmlrpc/client' require 'rubypress/client' -class Hash +unless defined?(ActiveSupport) + class Hash + + def deep_merge!(other_hash) + other_hash.each_pair do |k, v| + tv = self[k] + self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v + end + self + end - def deep_merge!(other_hash) - other_hash.each_pair do |k,v| - tv = self[k] - self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v + def deep_merge(other_hash) + dup.deep_merge!(other_hash) end - self - end - def deep_merge(other_hash) - dup.deep_merge!(other_hash) end - end diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index aa72796..5238e1d 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -1,11 +1,11 @@ require 'yaml' require 'erb' -require_relative "posts" -require_relative "taxonomies" -require_relative "media" -require_relative "comments" -require_relative "options" -require_relative "users" +require_relative 'posts' +require_relative 'taxonomies' +require_relative 'media' +require_relative 'comments' +require_relative 'options' +require_relative 'users' module Rubypress @@ -22,7 +22,7 @@ def initialize(options = {}) :path => '/xmlrpc.php', :username => nil, :password => nil, - :default_post_fields => ['post','terms','custom_fields'], + :default_post_fields => %w(post terms custom_fields), :debug => false }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self diff --git a/lib/rubypress/comments.rb b/lib/rubypress/comments.rb index cfd6f59..4302fd9 100644 --- a/lib/rubypress/comments.rb +++ b/lib/rubypress/comments.rb @@ -4,21 +4,21 @@ def getCommentCount(options = {}) default_options = { :post_id => nil }.deep_merge!(options) - execute("getCommentCount", default_options) + execute('getCommentCount', default_options) end def getComment(options = {}) default_options = { :comment_id => nil }.deep_merge!(options) - execute("getComment", default_options) + execute('getComment', default_options) end def getComments(options = {}) default_options = { :filter => {} }.deep_merge!(options) - execute("getComments", default_options) + execute('getComments', default_options) end def newComment(options = {}) @@ -26,7 +26,7 @@ def newComment(options = {}) :post_id => nil, :comment => {} }.deep_merge!(options) - execute("newComment", default_options) + execute('newComment', default_options) end def editComment(options = {}) @@ -34,18 +34,18 @@ def editComment(options = {}) :comment_id => nil, :comment => {} }.deep_merge!(options) - execute("editComment", default_options) + execute('editComment', default_options) end def deleteComment(options = {}) default_options = { :comment_id => nil }.deep_merge!(options) - execute("deleteComment", default_options) + execute('deleteComment', default_options) end def getCommentStatusList(options = {}) - execute("getCommentStatusList", options) + execute('getCommentStatusList', options) end end \ No newline at end of file diff --git a/lib/rubypress/media.rb b/lib/rubypress/media.rb index e39de5e..9887aeb 100644 --- a/lib/rubypress/media.rb +++ b/lib/rubypress/media.rb @@ -4,21 +4,21 @@ def getMediaItem(options = {}) default_options = { :attachment_id => nil }.deep_merge!(options) - execute("getMediaItem", default_options) + execute('getMediaItem', default_options) end def getMediaLibrary(options = {}) default_options = { :filter => {} }.deep_merge!(options) - execute("getMediaLibrary", default_options) + execute('getMediaLibrary', default_options) end def uploadFile(options = {}) default_options = { :data => {} }.deep_merge!(options) - execute("uploadFile", default_options) + execute('uploadFile', default_options) end end \ No newline at end of file diff --git a/lib/rubypress/options.rb b/lib/rubypress/options.rb index 8acd744..231c81f 100644 --- a/lib/rubypress/options.rb +++ b/lib/rubypress/options.rb @@ -4,14 +4,14 @@ def getOptions(options = {}) default_options = { :options => [] }.deep_merge!(options) - execute("getOptions", default_options) + execute('getOptions', default_options) end def setOptions(options = {}) default_options = { :options => [] }.deep_merge!(options) - execute("setOptions", default_options) + execute('setOptions', default_options) end end \ No newline at end of file diff --git a/lib/rubypress/posts.rb b/lib/rubypress/posts.rb index 1a92cd0..c71e273 100644 --- a/lib/rubypress/posts.rb +++ b/lib/rubypress/posts.rb @@ -5,7 +5,7 @@ def getPost(options = {}) :post_id => nil, :fields => self.default_post_fields }.deep_merge!(options) - execute("getPost", default_options) + execute('getPost', default_options) end def getPosts(options = {}) @@ -17,14 +17,14 @@ def getPosts(options = {}) :fields => self.default_post_fields } }.deep_merge!(options) - execute("getPosts", default_options) + execute('getPosts', default_options) end def newPost(options = {}) default_options = { :content => {} }.deep_merge!(options) - execute("newPost", default_options) + execute('newPost', default_options) end def editPost(options = {}) @@ -32,14 +32,14 @@ def editPost(options = {}) :post_id => nil, :content => {} }.deep_merge!(options) - execute("editPost", default_options) + execute('editPost', default_options) end def deletePost(options = {}) default_options = { :post_id => nil }.deep_merge!(options) - execute("deletePost", default_options) + execute('deletePost', default_options) end def getPostType(options = {}) @@ -47,7 +47,7 @@ def getPostType(options = {}) :post_type_name => nil, :fields => [] }.deep_merge!(options) - execute("getPostType", default_options) + execute('getPostType', default_options) end def getPostTypes(options = {}) @@ -55,18 +55,18 @@ def getPostTypes(options = {}) :filter => {}, :fields => [] }.deep_merge!(options) - execute("getPostTypes", default_options) + execute('getPostTypes', default_options) end def getPostFormats(options = {}) default_options = { :filter => {} }.deep_merge!(options) - execute("getPostFormats", default_options) + execute('getPostFormats', default_options) end def getPostStatusList(options = {}) - execute("getPostFormats", options) + execute('getPostFormats', options) end end \ No newline at end of file diff --git a/lib/rubypress/taxonomies.rb b/lib/rubypress/taxonomies.rb index 3bb42c4..2b11ab5 100644 --- a/lib/rubypress/taxonomies.rb +++ b/lib/rubypress/taxonomies.rb @@ -2,36 +2,36 @@ module Taxonomies def getTaxonomy(options = {}) default_options = { - :taxonomy => "category" + :taxonomy => 'category' }.deep_merge!(options) - execute("getTaxonomy", default_options) + execute('getTaxonomy', default_options) end def getTaxonomies(options = {}) - execute("getTaxonomies", options) + execute('getTaxonomies', options) end def getTerm(options = {}) default_options = { - :taxonomy => "category", + :taxonomy => 'category', :term_id => nil }.deep_merge!(options) - execute("getTerm", default_options) + execute('getTerm', default_options) end def getTerms(options = {}) default_options = { - :taxonomy => "category", + :taxonomy => 'category', :filter => {} }.deep_merge!(options) - execute("getTerms", default_options) + execute('getTerms', default_options) end def newTerm(options = {}) default_options = { :content => {} }.deep_merge!(options) - execute("newTerm", default_options) + execute('newTerm', default_options) end def editTerm(options = {}) @@ -39,7 +39,7 @@ def editTerm(options = {}) :term_id => nil, :content => {} }.deep_merge!(options) - execute("editTerm", default_options) + execute('editTerm', default_options) end def deleteTerm(options = {}) @@ -47,7 +47,7 @@ def deleteTerm(options = {}) :taxonomy => nil, :term_id => nil }.deep_merge!(options) - execute("deleteTerm", default_options) + execute('deleteTerm', default_options) end end \ No newline at end of file diff --git a/lib/rubypress/users.rb b/lib/rubypress/users.rb index 56e5dcc..0603b05 100644 --- a/lib/rubypress/users.rb +++ b/lib/rubypress/users.rb @@ -1,7 +1,7 @@ module Users def getUsersBlogs - self.connection.call("wp.getUsersBlogs", self.username, self.password) + self.connection.call('wp.getUsersBlogs', self.username, self.password) end def getUser(options = {}) @@ -9,32 +9,32 @@ def getUser(options = {}) :user_id => nil, :fields => [] }.deep_merge!(options) - execute("getUser", default_options) + execute('getUser', default_options) end def getUsers(options = {}) default_options = { :filter => {} }.deep_merge!(options) - execute("getUsers", default_options) + execute('getUsers', default_options) end def getProfile(options = {}) default_options = { :fields => [] }.deep_merge!(options) - execute("getProfile", default_options) + execute('getProfile', default_options) end def editProfile(options = {}) default_options = { :content => {} }.deep_merge!(options) - execute("editProfile", default_options) + execute('editProfile', default_options) end def getAuthors(options = {}) - execute("getAuthors", options) + execute('getAuthors', options) end end \ No newline at end of file diff --git a/rubypress-1.0.1.gem b/rubypress-1.0.1.gem deleted file mode 100644 index bf32ce444d0af0d15f5c5364b5a7ba3ca58ed43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHKXH*kd77o=Qy@%csq=p`(NHd`q5d;(%h8~)95Q$U;1f)tABp@IJumMU(2~7kd zNa%u8rS}e5XZGyO9DnSdnR8}#&aU^*EBD=Z-@EUg?|#q2(a+Yw*3TB|d=v0ziR4$2 zm6Zkj)P9w3TPaDH^uOl*sh5(Gk%s|zCI74g{dQk}Uq4%)ukHhpj*jlXReaO`Px_y) z_M6LnWBzv?^27lF^<)Fa#3XH|)|d~HbhrARblw^*30eL@T}&wUG4O2n71K)Xtl}3d z$kY$u#$}Pyz;i1h*5XG~aUQnvGR}rhhE6HqyA3`UtGnHIn6C)^fQH5fUJw~gicrG? zN!Tgb)Eh6ZwQ(u-?b->hx6U$L=2q{PHOeSh<8?0|U`!0-tHK{>fHzr8MQ!ZN-6Y>% z=L+HJ+(;$`{`si&EYsugI-&Qp=|~yj?W()& zrdP$i;#`53{EtSxIB@WuM7=Xbm`4>4`GQ*2Hc*)4LxgbHGD!jK~m ziM30Q_iAL_Ia0OVjs!}n)C9Df+!F_+21vf zzn|-mMc`-b|B8VBMg0E?_P^AGU+`aA@;mHMFi<8= z(uFpx0}D(AW-18i?V8|5+ves$O5NR&u`v#KGvrqNr?2Au>E?3Ph5>Y@+LfrN@cU!39GnnVff zLdVfj$L7-yc1%(eaQje^g;06>cLV&{tB3Elt{yQv3i3bNioOOv_CB@LIWbqZc*$mg zCe+s}1+$&-Q0*OZoIELnYt)3*q~Y}7?ZyV@IwPq1=#e*}j#XI$EmIXsuV9+B6)!Rb10&PKF_fdxzlz1-c2(OL!K-01*q0b@rNen+fVts!bf_J{W?&sGHWD@hF zaM>F6?3A)%R2oR1Wq>IF-?3D9sZLqPTi=wBn%N|WkhW!DbvjqzDc+kqeHgrrGb>N8 zgrTOu$-v0x6kiC$#U;FxY9FRpyMJ?g4h*_am#E*oRrp@}gF|yUHX!|Vp{2t^od)90O%|dcckW_ez1y*ez_)#@ni}-MSCGKoJFVKrPywT4{!n@-KSIH*i4UPn z*{g^+5^PW}Oped1ffZSFVM7-?hd78TV+a8?fl*oep08fizr0IW6cUNh{hVEAs!wl% zwI2$!FvKxvlH5(#WO}m>Ad04k3wUh?3Cc*azonLyar5Cwy;_*sw$2~S!sN@j$PwGix?}~~jVGw+%_rMT678-Ob~0;7bK8LhxbvrfZYVI zimf}(zQvPgvRwF*2z_R2{iP8bf!JU+Tza(d5$qQ-cx-gc+@ToRlC~Cl*tmS+`Sjql z1ivq_aTx~Vi?xuhEpX6|LKsA9!A&y6vK_^&UtOn{VI{G#ot{omV1ee*&R0pfiN?h)r z91yREN>x2zW;9XFauf-iVFbkPThw;ktPJug)nHYgHq>plDnrT9u!yF2l@c$r>EuM< z_Mr(Vm~U5^w(-uW)opo46WH7WltA&dED{JL0ObHpQh?&`tC9c9tL>4F_HMrZ9=^~Z zTMzd?hXwvb>i*6DUlJxO|IPnjR!&a#JOBGD^6ppucPB+XZcLKy&e{R<>PHhhr6#fc zr2O;eB?UO!>9cc&px$6iG=$D_yCV=b!F~2lqpQ=$cSm{nrJcpGu@&dNCa}bc)A&V` zbcrVzFoo*s1a6{!ZD>FH*yEr&T{q>atCMN!(5$cNiKb|dT{)}DDDXPfwQ5RHPGf6j zr=)NN_YLE8>Ertifop_Rvg&TWyhi_!NC(P*r;aJ!Wb_jXfE6dRL4%wCqERDccKj3m zqePNNt(!$8`Ne8=#i(+@rCmncRQbV;CFhC&VeTbyOzMlOIDHjYJK9-!&S8SOS`XDH z{?;8aewxG;cNq)Pu6V7SNCkzMTT%0Ld^9u^KJkM{>iUwfVm`Im_jRxr#&G?{WKG(Q z?8u9rksy{3n34ihUiPy2F>Z&UHLb u6>g%ulrqW5ZFD-T90jbkP0{Nf^u*swn7B>+S0uuBAKxSJJp%uC5%>o`OQ^p9 From 0d087196248b3018e8cd432a7fae5d59f61ed0b3 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Sat, 5 Oct 2013 17:12:24 -0400 Subject: [PATCH 23/70] Add contributors to the README, minor version bump. --- Gemfile.lock | 2 +- README.md | 8 ++++++-- rubypress.gemspec | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 36a19e1..d993564 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,4 +42,4 @@ DEPENDENCIES rspec simplecov vcr - webmock (>= 1.8.0) + webmock diff --git a/README.md b/README.md index d1d59c1..4c87124 100644 --- a/README.md +++ b/README.md @@ -60,12 +60,16 @@ Pull requests welcome. ## Credits -* Zach Feldman [@zachfeldman](http://twitter.com/zachfeldman) +* Zach Feldman [@zachfeldman](http://zfeldman.com) * Dan Collis-Puro (dan@collispuro.com) +## Contributors -### License +* Abdelkader Boudih [@seuros](https://github.com/seuros) + +## License Licensed under the same terms as WordPress itself - GPLv2. + diff --git a/rubypress.gemspec b/rubypress.gemspec index c82119f..6707a90 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "1.0.1" + s.version = "1.0.2" s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] From a328c3079cce8377747b942814c85a8e59df7445 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Wed, 13 Nov 2013 12:26:19 -0600 Subject: [PATCH 24/70] [#2] Add license to gemspec, is GPLv2 --- rubypress.gemspec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rubypress.gemspec b/rubypress.gemspec index 6707a90..15ee3c1 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -9,10 +9,11 @@ Gem::Specification.new do |s| s.homepage = "https://github.com/zachfeldman/rubypress" s.summary = "Easily access WordPress installations through the WordPress XML-RPC API." s.description = "Easily access WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API in Ruby." - + s.license = "GPLv2" + s.required_ruby_version = ">= 1.9.2" s.files = "lib/rubypress.rb" s.files += Dir["lib/rubypress/**"] -end \ No newline at end of file +end From 86c2fe8535f525a1c4c8a2bbb654b9abc73fa558 Mon Sep 17 00:00:00 2001 From: Alexandre Dantas Date: Thu, 21 Nov 2013 22:46:47 -0200 Subject: [PATCH 25/70] Update README.md Specified `path` option for `xmlrpc.php` not on root directory. Also, clarified a little bit on the text. --- README.md | 85 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 4c87124..f8e85d1 100644 --- a/README.md +++ b/README.md @@ -2,49 +2,73 @@ [![Gem Version](https://badge.fury.io/rb/rubypress.png)](http://badge.fury.io/rb/rubypress) -This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. +This implements the [WordPress XML RPC API][wp-api] as released in version 3.4. -WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. +WARNING: SSL is NOT enabled by default for ease of testing for those running OS +X systems without setup SSL certs. If this is important to you, checkout the +options for instantiating a new client where you can set :use_ssl to true. +## Installation -## Getting Started - -1. Install the gem - - A. To your system +Installing to your system: - `gem install rubypress` - - B. Or using Bundler + gem install rubypress - Inside your Gemfile: +Or when using Bundler, add this to your Gemfile: - `gem 'rubypress'` + gem 'rubypress' -2. Create a new client - - ```ruby - > wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") - ``` +## Getting Started -3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) +`rubypress` follows the exact format of the [WordPress XML RPC API][wp-api]. - ```ruby - > wp.getOptions +First, create a new client - => {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} - ``` - (just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) +```ruby +wp = Rubypress::Client.new(:host => "yourwordpresssite.com", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword") +``` - ```ruby - > wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) - => "24" - ``` +Then, make requests based off of the [WordPress XML RPC API Documentation][wp-api]. +For example, to get info on the wordpress site: - (returns a post ID if post was successful) +```ruby +> wp.getOptions -To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. +=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"}, ...} +``` +(just a small excerpt of actual options for the sake + of the whole [brevity thing]) + +To make a new post: + +```ruby +wp.newPost(:blog_id => "your_blog_id", + :content => { + :post_status => "publish", + :post_date => Time.now, + :post_content => "What an awesome post", + :post_title => "Woo Title" + }) +``` + +(returns a post ID if post was successful) + +To make further requests, check out the documentation. +For even further clarification on what requests are available, take a look +in the spec folder. + +NOTE: If your `xmlrpc.php` is not on the host root directory, you need to +specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to/blog`: + +```ruby +wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :path => "/path/to/blog/xmlrpc.php", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword") +``` ## Contributing to rubypress @@ -71,5 +95,8 @@ Pull requests welcome. Licensed under the same terms as WordPress itself - GPLv2. +[wp-api]:http://codex.wordpress.org/XML-RPC_WordPress_API +[brevity thing]:http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg + From 7e89d94c1e9e7acd1a3cd3657a6f71cf6a41c6cc Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Thu, 21 Nov 2013 20:24:17 -0500 Subject: [PATCH 26/70] Add host note. --- README.md | 77 ++++++++++++++++++++++--------------------------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index f8e85d1..bb9cfd2 100644 --- a/README.md +++ b/README.md @@ -2,63 +2,48 @@ [![Gem Version](https://badge.fury.io/rb/rubypress.png)](http://badge.fury.io/rb/rubypress) -This implements the [WordPress XML RPC API][wp-api] as released in version 3.4. +This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. -WARNING: SSL is NOT enabled by default for ease of testing for those running OS -X systems without setup SSL certs. If this is important to you, checkout the -options for instantiating a new client where you can set :use_ssl to true. +WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. -## Installation -Installing to your system: - - gem install rubypress +## Getting Started -Or when using Bundler, add this to your Gemfile: +1. Install the gem - gem 'rubypress' + A. To your system + + `gem install rubypress` -## Getting Started + B. Or using Bundler -`rubypress` follows the exact format of the [WordPress XML RPC API][wp-api]. + Inside your Gemfile: -First, create a new client + `gem 'rubypress'` -```ruby -wp = Rubypress::Client.new(:host => "yourwordpresssite.com", - :username => "yourwordpressuser@wordpress.com", - :password => "yourwordpresspassword") -``` +2. Create a new client -Then, make requests based off of the [WordPress XML RPC API Documentation][wp-api]. -For example, to get info on the wordpress site: + ```ruby + > wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") + ``` -```ruby -> wp.getOptions +3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) -=> {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"}, ...} -``` + ```ruby + > wp.getOptions -(just a small excerpt of actual options for the sake - of the whole [brevity thing]) - -To make a new post: + => {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} + ``` + (just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) -```ruby -wp.newPost(:blog_id => "your_blog_id", - :content => { - :post_status => "publish", - :post_date => Time.now, - :post_content => "What an awesome post", - :post_title => "Woo Title" - }) -``` + ```ruby + > wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) + => "24" + ``` -(returns a post ID if post was successful) + (returns a post ID if post was successful) -To make further requests, check out the documentation. -For even further clarification on what requests are available, take a look -in the spec folder. +To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. NOTE: If your `xmlrpc.php` is not on the host root directory, you need to specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to/blog`: @@ -85,18 +70,16 @@ Pull requests welcome. ## Credits * Zach Feldman [@zachfeldman](http://zfeldman.com) -* Dan Collis-Puro (dan@collispuro.com) +* Dan Collis-Puro [@djcp](https://github.com/djcp) ## Contributors -* Abdelkader Boudih [@seuros](https://github.com/seuros) +* Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) +* Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) ## License Licensed under the same terms as WordPress itself - GPLv2. -[wp-api]:http://codex.wordpress.org/XML-RPC_WordPress_API -[brevity thing]:http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg - +[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/ed093654d3f4ac89d05750e3def34190 "githalytics.com")](http://githalytics.com/zachfeldman/rubypress) --> \ No newline at end of file From 4ff9fec1381894cdda5720b634c9e229be5fdc20 Mon Sep 17 00:00:00 2001 From: pacop Date: Tue, 3 Dec 2013 00:24:03 +0100 Subject: [PATCH 27/70] added :filename to uploadFile Added :filename to uploadFile, so you only give a valid filename. See #7 --- lib/rubypress/media.rb | 1 + spec/media_spec.rb | 9 +++++++++ spec/spec_helper.rb | 1 + 3 files changed, 11 insertions(+) diff --git a/lib/rubypress/media.rb b/lib/rubypress/media.rb index 9887aeb..51bf6a4 100644 --- a/lib/rubypress/media.rb +++ b/lib/rubypress/media.rb @@ -18,6 +18,7 @@ def uploadFile(options = {}) default_options = { :data => {} }.deep_merge!(options) + default_options[:data][:bits] = XMLRPC::Base64.new(File.read(default_options.delete(:filename))) if options.include?(:filename) and File.readable?(options[:filename]) execute('uploadFile', default_options) end diff --git a/spec/media_spec.rb b/spec/media_spec.rb index ed52ca0..92d7ee4 100644 --- a/spec/media_spec.rb +++ b/spec/media_spec.rb @@ -2,6 +2,11 @@ let(:attachment_id){ 129 } let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} + let(:tmp) do + tmp = Tempfile.new(file[:name]) + File.open(tmp, 'wb').write(file[:bits]) + tmp + end it "#getMediaItem" do VCR.use_cassette("getMediaItem") do @@ -19,6 +24,10 @@ VCR.use_cassette("uploadFile") do CLIENT.uploadFile({:data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") end + + VCR.use_cassette("uploadFile") do + CLIENT.uploadFile({:filename => tmp, :data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") + end end end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2875fab..6bacede 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'rspec' require 'rubypress' +require 'tempfile' require_relative 'vcr_setup' RSpec.configure do |config| From df56eca02da4d1e63e860a3d2c7db37f090988cf Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Mon, 2 Dec 2013 23:03:03 -0500 Subject: [PATCH 28/70] Added our good friend Travis CI. --- .travis.yml | 8 ++++++++ README.md | 3 +++ 2 files changed, 11 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..32d7f3a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,8 @@ +language: ruby +rvm: +- ruby-2.0.0-p353 +env: + global: + - secure: EtfvMbqvxv0TTqC54x9IsBz5reJtBvmfRTAZbtZhvq6D6VNOsN2mCH7xkwR0qwIH8x66r1TJ+yTmcNfEPQWBZprFbGegGlZVhaKHwEqBaKJX11eaRA7PK50VxNyxmIqmVMhp3Cp8+x+L6augOEsP6ISWZndXYESxynWl+dzCz1g= + - secure: PF0+XvqhUtIAq4QKQD/iYod3heXzkB/O3lsy9aajbvQ4L8IM1ofMSvRDxTvrVyHycok7QGDhiBylrTBo51NK0VOtwA16Ig6P5EKLWSLEAVk0D9Z5RujshVnghRghp8kQWuupUhk/0u525bgADfwTSazx6jwPDimDanRdIjNO/tg= + - secure: M9bNHH+NYvUbmCaDGbrLIeI9t7ihWvS5vkYQ31pmDUbfTpBbJmFjX9GoKXAuXfiHAPQXZx1cUdVusZqWOJ1RQtvnngrdjZjXhA3ufitgShAMskWnAECWGFBCbr13Qv/IOl0y2qGvLiD5EWxog/A0BWCaiqJku6phzD7W4b4RwmE= diff --git a/README.md b/README.md index bb9cfd2..3fc96e6 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Gem Version](https://badge.fury.io/rb/rubypress.png)](http://badge.fury.io/rb/rubypress) +[![Build Status](https://travis-ci.org/zachfeldman/rubypress.png)](https://travis-ci.org/zachfeldman/rubypress) + This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API) as released in version 3.4. WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. @@ -76,6 +78,7 @@ Pull requests welcome. * Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) +* Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) ## License From e2190cec4aa994dbc9acde28ebcc6b04ed479e48 Mon Sep 17 00:00:00 2001 From: pseudomuto Date: Sat, 18 Jan 2014 13:23:14 -0500 Subject: [PATCH 29/70] moving spec files --- spec/{cassettes => }/options_spec.rb | 0 spec/{cassettes => }/users_spec.rb | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename spec/{cassettes => }/options_spec.rb (100%) rename spec/{cassettes => }/users_spec.rb (100%) diff --git a/spec/cassettes/options_spec.rb b/spec/options_spec.rb similarity index 100% rename from spec/cassettes/options_spec.rb rename to spec/options_spec.rb diff --git a/spec/cassettes/users_spec.rb b/spec/users_spec.rb similarity index 100% rename from spec/cassettes/users_spec.rb rename to spec/users_spec.rb From 8f031fff46188daa288a425859770f2c857ef677 Mon Sep 17 00:00:00 2001 From: pseudomuto Date: Sat, 18 Jan 2014 13:27:50 -0500 Subject: [PATCH 30/70] loading .env if it exists for rspec --- .gitignore | 3 ++- spec/spec_helper.rb | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 1dfc830..5ce0695 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.tmp -*.swp \ No newline at end of file +*.swp +.env diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6bacede..628dda9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,9 +5,28 @@ require 'tempfile' require_relative 'vcr_setup' -RSpec.configure do |config| +def load_env(filename = '.env') + return unless File.exists?(filename) + + File.foreach(filename) do |line| + next if line.chomp.size == 0 + + setting = line.split('=') + key = setting.shift + ENV[key] = setting.join('').chomp + end +end +RSpec.configure do |config| + load_env end -CLIENT = Rubypress::Client.new(:host => ENV['WORDPRESS_HOST'], :port => 80, :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false) -STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ \ No newline at end of file +CLIENT = Rubypress::Client.new( + :host => ENV['WORDPRESS_HOST'], + :port => 80, + :username => ENV['WORDPRESS_USERNAME'], + :password => ENV['WORDPRESS_PASSWORD'], + :use_ssl => false +) + +STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ From 3683fcbfb500423850ca4d0c90f261c59c083389 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 21 Jan 2014 22:41:45 -0500 Subject: [PATCH 31/70] README updates compliments of @pseudomoto. --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 3fc96e6..1fcfd10 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,22 @@ Pull requests welcome. * Make sure to add tests for it. This is important so we don't break it in a future version unintentionally. * Submit a pull request +### Environment Variables + +The test suite requires that the following environment variables + +* WORDPRESS_HOST +* WORDPRESS_USERNAME +* WORDPRESS_PASSWORD ++ +Optionally, you can create a file in the working directory calle + +``` +WORDPRESS_HOST=myhostedwordpresssite.net +WORDPRESS_USERNAME=yourwordpressuser@wordpress.com +WORDPRESS_PASSWORD=yourwordpresspassword +``` + ## Credits * Zach Feldman [@zachfeldman](http://zfeldman.com) @@ -79,6 +95,7 @@ Pull requests welcome. * Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) +* David Muto [@pseudomoto](https://github.com/pseudomoto) (Added ability to use a .env file.) ## License From 83df0c232ab060495f41b2d375017c188e51b8de Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 21 Jan 2014 22:45:18 -0500 Subject: [PATCH 32/70] Minor version bump for .env file addition. --- rubypress.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rubypress.gemspec b/rubypress.gemspec index 15ee3c1..001c098 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "1.0.2" + s.version = "1.0.3" s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] From 6390ecade441966d5387f1789a8db388c2bd18d1 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 22 Jan 2014 10:51:39 -0500 Subject: [PATCH 33/70] Minor README updates. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1fcfd10..f028963 100644 --- a/README.md +++ b/README.md @@ -76,8 +76,8 @@ The test suite requires that the following environment variables * WORDPRESS_HOST * WORDPRESS_USERNAME * WORDPRESS_PASSWORD -+ -Optionally, you can create a file in the working directory calle + +Optionally, you can create a file in the working directory called _.env_ and add the following to it: ``` WORDPRESS_HOST=myhostedwordpresssite.net @@ -85,6 +85,8 @@ WORDPRESS_USERNAME=yourwordpressuser@wordpress.com WORDPRESS_PASSWORD=yourwordpresspassword ``` +When RSpec runs it will set the environment variables for you. + ## Credits * Zach Feldman [@zachfeldman](http://zfeldman.com) From 1b75eb939286d7ef5f542d44b787474cb589c1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teemu=20P=C3=A4=C3=A4kk=C3=B6nen?= Date: Fri, 24 Jan 2014 13:18:27 +0200 Subject: [PATCH 34/70] Add support for HTTP auth --- lib/rubypress/client.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 5238e1d..2af8b4c 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -12,7 +12,7 @@ module Rubypress class Client attr_reader :connection - attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, :debug + attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, :debug, :http_user, :http_password def initialize(options = {}) { @@ -23,13 +23,15 @@ def initialize(options = {}) :username => nil, :password => nil, :default_post_fields => %w(post terms custom_fields), - :debug => false + :debug => false, + :http_user => nil, + :http_password => nil }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self end def connection - server = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,nil,nil,self.use_ssl,nil) + server = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,self.http_user,self.http_password,self.use_ssl,nil) server.http_header_extra = {'accept-encoding' => 'identity'} @connection = server end From 1215e24131fb72ac909c93e58ba39ea427f9b6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Teemu=20P=C3=A4=C3=A4kk=C3=B6nen?= Date: Wed, 29 Jan 2014 15:25:29 +0200 Subject: [PATCH 35/70] Write tests for HTTP Auth --- spec/cassettes/httpAuthInvalid.yml | 63 ++++++++++ spec/cassettes/httpAuthNone.yml | 63 ++++++++++ spec/cassettes/httpAuthValid.yml | 183 +++++++++++++++++++++++++++++ spec/client_spec.rb | 13 +- spec/http_auth_spec.rb | 31 +++++ spec/spec_helper.rb | 14 ++- spec/vcr_setup.rb | 8 +- 7 files changed, 370 insertions(+), 5 deletions(-) create mode 100644 spec/cassettes/httpAuthInvalid.yml create mode 100644 spec/cassettes/httpAuthNone.yml create mode 100644 spec/cassettes/httpAuthValid.yml create mode 100644 spec/http_auth_spec.rb diff --git a/spec/cassettes/httpAuthInvalid.yml b/spec/cassettes/httpAuthInvalid.yml new file mode 100644 index 0000000..70999d7 --- /dev/null +++ b/spec/cassettes/httpAuthInvalid.yml @@ -0,0 +1,63 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HTTP_USER:WORDPRESS_HTTP_PASSWORD@WORDPRESS_HOST/xmlrpc.php + body: + encoding: UTF-8 + string: | + wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + headers: + User-Agent: + - XMLRPC::Client (Ruby 2.0.0) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '304' + Connection: + - keep-alive + Accept-Encoding: + - identity + Accept: + - '*/*' + response: + status: + code: 401 + message: Authorization Required + headers: + Date: + - Wed, 29 Jan 2014 13:10:25 GMT + Server: + - Apache/2.2.16 (Debian) + Www-Authenticate: + - Basic realm="Demo WP" + Vary: + - Accept-Encoding + Content-Length: + - '484' + Keep-Alive: + - timeout=1, max=50 + Connection: + - Keep-Alive + Content-Type: + - text/html; charset=iso-8859-1 + body: + encoding: UTF-8 + string: | + + + 401 Authorization Required + +

Authorization Required

+

This server could not verify that you + are authorized to access the document + requested. Either you supplied the wrong + credentials (e.g., bad password), or your + browser doesn't understand how to supply + the credentials required.

+
+
Apache/2.2.16 (Debian) Server at WORDPRESS_HOST Port 80
+ + http_version: + recorded_at: Wed, 29 Jan 2014 13:10:24 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/httpAuthNone.yml b/spec/cassettes/httpAuthNone.yml new file mode 100644 index 0000000..11b2304 --- /dev/null +++ b/spec/cassettes/httpAuthNone.yml @@ -0,0 +1,63 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HOST/xmlrpc.php + body: + encoding: UTF-8 + string: | + wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + headers: + User-Agent: + - XMLRPC::Client (Ruby 2.0.0) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '304' + Connection: + - keep-alive + Accept-Encoding: + - identity + Accept: + - '*/*' + response: + status: + code: 401 + message: Authorization Required + headers: + Date: + - Wed, 29 Jan 2014 12:37:14 GMT + Server: + - Apache/2.2.16 (Debian) + Www-Authenticate: + - Basic realm="Demo WP" + Vary: + - Accept-Encoding + Content-Length: + - '484' + Keep-Alive: + - timeout=1, max=50 + Connection: + - Keep-Alive + Content-Type: + - text/html; charset=iso-8859-1 + body: + encoding: UTF-8 + string: | + + + 401 Authorization Required + +

Authorization Required

+

This server could not verify that you + are authorized to access the document + requested. Either you supplied the wrong + credentials (e.g., bad password), or your + browser doesn't understand how to supply + the credentials required.

+
+
Apache/2.2.16 (Debian) Server at WORDPRESS_HOST Port 80
+ + http_version: + recorded_at: Wed, 29 Jan 2014 12:37:13 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/httpAuthValid.yml b/spec/cassettes/httpAuthValid.yml new file mode 100644 index 0000000..ec979f8 --- /dev/null +++ b/spec/cassettes/httpAuthValid.yml @@ -0,0 +1,183 @@ +--- +http_interactions: +- request: + method: post + uri: http://WORDPRESS_HTTP_USER:WORDPRESS_HTTP_PASSWORD@WORDPRESS_HOST/xmlrpc.php + body: + encoding: UTF-8 + string: | + wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + headers: + User-Agent: + - XMLRPC::Client (Ruby 2.0.0) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '304' + Connection: + - keep-alive + Accept-Encoding: + - identity + Accept: + - '*/*' + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 29 Jan 2014 13:24:23 GMT + Server: + - Apache/2.2.16 (Debian) + X-Powered-By: + - PHP/5.3.3-7+squeeze14 + Connection: + - close + Content-Length: + - '8203' + Vary: + - Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 + body: + encoding: UTF-8 + string: | + + + + + + + software_name + descSoftware Name + readonly1 + valueWordPress + + software_version + descSoftware Version + readonly1 + value3.5.1 + + blog_url + descSite URL + readonly1 + valuehttp://WORDPRESS_HOST + + home_url + descHome URL + readonly1 + valuehttp://WORDPRESS_HOST + + image_default_link_type + descImage default link type + readonly1 + valuefile + + image_default_size + descImage default size + readonly1 + value + + image_default_align + descImage default align + readonly1 + value + + template + descTemplate + readonly1 + valuetwentyeleven + + stylesheet + descStylesheet + readonly1 + valuetwentyeleven + + post_thumbnail + descPost Thumbnail + readonly1 + value1 + + time_zone + descTime Zone + readonly0 + value0 + + blog_title + descSite Title + readonly0 + valueDemo WP + + blog_tagline + descSite Tagline + readonly0 + valueJust another WordPress site + + date_format + descDate Format + readonly0 + valueF j, Y + + time_format + descTime Format + readonly0 + valueg:i a + + users_can_register + descAllow new users to sign up + readonly0 + value0 + + thumbnail_size_w + descThumbnail Width + readonly0 + value150 + + thumbnail_size_h + descThumbnail Height + readonly0 + value150 + + thumbnail_crop + descCrop thumbnail to exact dimensions + readonly0 + value1 + + medium_size_w + descMedium size image width + readonly0 + value300 + + medium_size_h + descMedium size image height + readonly0 + value300 + + large_size_w + descLarge size image width + readonly0 + value1024 + + large_size_h + descLarge size image height + readonly0 + value1024 + + default_comment_status + descAllow people to post comments on new articles + readonly0 + valueopen + + default_ping_status + descAllow link notifications from other blogs (pingbacks and trackbacks) + readonly0 + valueopen + + + + + + + http_version: + recorded_at: Wed, 29 Jan 2014 13:24:23 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 0bebbe4..d649bdc 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -11,4 +11,15 @@ expect(CLIENT.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) end -end \ No newline at end of file + it "#httpAuth" do + conn = HTTP_AUTH_CLIENT.connection + + expect( conn.user ).to eq HTTP_AUTH_CLIENT_OPTS[ :http_user ] + expect( conn.password ).to eq HTTP_AUTH_CLIENT_OPTS[ :http_password ] + + expect( conn.user.nil? ).to be_false + expect( conn.password.nil? ).to be_false + + end + +end diff --git a/spec/http_auth_spec.rb b/spec/http_auth_spec.rb new file mode 100644 index 0000000..2165ecd --- /dev/null +++ b/spec/http_auth_spec.rb @@ -0,0 +1,31 @@ +describe "#httpAuth" do + + # Monkey patch Rubypress::Client to allow access to @connection + Rubypress::Client.class_eval do + def rspec_connection + @connection + end + end + + it "#noAuth" do + VCR.use_cassette("httpAuthNone") do + expect{ CLIENT.getOptions }.to raise_error(RuntimeError) + expect( CLIENT.rspec_connection.http_last_response.code ).to eq "401" + end + end + + it "#validAuth" do + VCR.use_cassette("httpAuthValid", :match_requests_on => [:method, :host, :path]) do + HTTP_AUTH_CLIENT.getOptions + expect( HTTP_AUTH_CLIENT.rspec_connection.http_last_response.code ).to eq "200" + end + end + + it "#invalidAuth" do + VCR.use_cassette("httpAuthInvalid", :match_requests_on => [:method, :host, :path]) do + expect{ HTTP_AUTH_CLIENT.getOptions }.to raise_error(RuntimeError) + expect( HTTP_AUTH_CLIENT.rspec_connection.http_last_response.code ).to eq "401" + end + end + +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 628dda9..d4afff7 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -21,12 +21,20 @@ def load_env(filename = '.env') load_env end -CLIENT = Rubypress::Client.new( - :host => ENV['WORDPRESS_HOST'], +CLIENT_OPTS = { :port => 80, + :host => ENV['WORDPRESS_HOST'], :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :use_ssl => false -) +} + +CLIENT = Rubypress::Client.new( CLIENT_OPTS ) + +HTTP_AUTH_CLIENT_OPTS = CLIENT_OPTS.merge( + :http_user => ENV['WORDPRESS_HTTP_USER'] || 'test', + :http_password => ENV['WORDPRESS_HTTP_PASSWORD'] || 'test' ) + +HTTP_AUTH_CLIENT = Rubypress::Client.new( HTTP_AUTH_CLIENT_OPTS ) STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index a1fc8cb..cba28c5 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -12,4 +12,10 @@ c.filter_sensitive_data("WORDPRESS_HOST") do ENV['WORDPRESS_HOST'] end -end \ No newline at end of file + c.filter_sensitive_data("WORDPRESS_HTTP_USER") do + HTTP_AUTH_CLIENT_OPTS[ :http_user ] + end + c.filter_sensitive_data("WORDPRESS_HTTP_PASSWORD") do + HTTP_AUTH_CLIENT_OPTS[ :http_password ] + end +end From 593e4145e9101839c0ec919289723c227e46c1ce Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Sat, 8 Feb 2014 16:17:12 -0500 Subject: [PATCH 36/70] Major testing overhaul to make tests as idempotent as possible. Version bump to 1.0.4. --- .travis.yml | 15 +- README.md | 21 +- rubypress.gemspec | 2 +- sample-dot-env | 10 + spec/cassettes/deleteComment.yml | 58 +- spec/cassettes/deletePost.yml | 56 +- spec/cassettes/deleteTerm.yml | 56 +- spec/cassettes/editComment.yml | 60 +- spec/cassettes/editPost.yml | 58 +- spec/cassettes/editProfile.yml | 56 +- spec/cassettes/editTerm.yml | 56 +- spec/cassettes/getAuthors.yml | 69 +- spec/cassettes/getComment.yml | 88 +- spec/cassettes/getCommentCount.yml | 65 +- spec/cassettes/getCommentStatusList.yml | 64 +- spec/cassettes/getComments.yml | 135 +-- spec/cassettes/getMediaItem.yml | 87 +- spec/cassettes/getMediaLibrary.yml | 254 +++++- spec/cassettes/getOptions.yml | 392 ++++----- spec/cassettes/getPost.yml | 245 ++---- spec/cassettes/getPostFormats.yml | 76 +- spec/cassettes/getPostStatusList.yml | 76 +- spec/cassettes/getPostType.yml | 95 +- spec/cassettes/getPostTypes.yml | 223 ++--- spec/cassettes/getPosts.yml | 1047 ++++++----------------- spec/cassettes/getProfile.yml | 58 +- spec/cassettes/getTaxonomies.yml | 254 +++--- spec/cassettes/getTaxonomy.yml | 120 +-- spec/cassettes/getTerm.yml | 74 +- spec/cassettes/getTerms.yml | 107 +-- spec/cassettes/getUsers.yml | 85 +- spec/cassettes/getUsersBlogs.json | 1 + spec/cassettes/getUsersBlogs.yml | 70 +- spec/cassettes/httpAuthInvalid.yml | 22 +- spec/cassettes/httpAuthNone.yml | 63 -- spec/cassettes/httpAuthValid.yml | 50 +- spec/cassettes/newComment.yml | 60 +- spec/cassettes/newPost.yml | 58 +- spec/cassettes/newTerm.yml | 56 +- spec/cassettes/setOptions.yml | 66 +- spec/cassettes/uploadFile.yml | 71 +- spec/cassettes/uploadFile2.yml | 62 ++ spec/comments_spec.rb | 36 +- spec/http_auth_spec.rb | 17 +- spec/media_spec.rb | 56 +- spec/posts_spec.rb | 23 +- spec/spec_helper.rb | 17 +- spec/taxonomies_spec.rb | 90 +- spec/users_spec.rb | 3 +- spec/vcr_setup.rb | 38 +- 50 files changed, 2361 insertions(+), 2560 deletions(-) create mode 100644 sample-dot-env create mode 100644 spec/cassettes/getUsersBlogs.json delete mode 100644 spec/cassettes/httpAuthNone.yml create mode 100644 spec/cassettes/uploadFile2.yml diff --git a/.travis.yml b/.travis.yml index 32d7f3a..b4908e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,17 @@ language: ruby rvm: - ruby-2.0.0-p353 +git: + depth: 1 env: global: - - secure: EtfvMbqvxv0TTqC54x9IsBz5reJtBvmfRTAZbtZhvq6D6VNOsN2mCH7xkwR0qwIH8x66r1TJ+yTmcNfEPQWBZprFbGegGlZVhaKHwEqBaKJX11eaRA7PK50VxNyxmIqmVMhp3Cp8+x+L6augOEsP6ISWZndXYESxynWl+dzCz1g= - - secure: PF0+XvqhUtIAq4QKQD/iYod3heXzkB/O3lsy9aajbvQ4L8IM1ofMSvRDxTvrVyHycok7QGDhiBylrTBo51NK0VOtwA16Ig6P5EKLWSLEAVk0D9Z5RujshVnghRghp8kQWuupUhk/0u525bgADfwTSazx6jwPDimDanRdIjNO/tg= - - secure: M9bNHH+NYvUbmCaDGbrLIeI9t7ihWvS5vkYQ31pmDUbfTpBbJmFjX9GoKXAuXfiHAPQXZx1cUdVusZqWOJ1RQtvnngrdjZjXhA3ufitgShAMskWnAECWGFBCbr13Qv/IOl0y2qGvLiD5EWxog/A0BWCaiqJku6phzD7W4b4RwmE= + - secure: "Foe5JrG+j5kd3Sy1TY0ovB2yPnncqKlYdPsDfjV95cCy/2iImh1vvKxsdkBrK7/WjcADO7DjF96hItoH53hzmou4+Fz3/Z25h84gClavnqQmpTUWWmyZou+S47uu8st3bujtrKMBwVCkO+eG1mcfhG3V++08dUFjrLnWMmgkTRM=" + - secure: "HeL/ulGnSAQeDR+pxWkOc18EUjVlkRGgeLHzyq9SxrdB6Vy59s+3HASB0PI/doEd0M1HtC5pmuXuldLVGYCjS5HrWmIidwm+w7f9kr6jCs0enqpAfc/4PGpum7LMuAO+J7dbok17hsXDGYIXxaEDftaTvi50gHdnJEbzhciZruY=" + - secure: "NFfr6gan+9NFJ0qN7HkmhgDIwQ45MZNWBeu05TuNs/E9u4sngnkVlBjpBNNdOGGA1ftv2EO2a+o70YWxoZ2fVKBt5Kjd2HozZAmkx1wQoehU0dDQHrS99UMykSaFmjh4sdmU4fDghOSSrr+HzYv+Fn3RaGOy/fG2DnyAIruFKic=" + - secure: "P2tGa/mLy18Q+uZF6y+6UyYAJaSK456EeRpwHZb6aKEkC6OUb5zthQlhqMCOElvCUhY07vqs+OtAA4v/rkMHjxwgPCc4ym1sEqZIzBbYcj9Gry0emtIe7BsRLQVHv/zw2mDAMDKIDdKoASNiiTTENdkCjgy+T6zr8KDL22m/hBE=" + - secure: "g+JDYCPtGPPRb4Zc2sirASHsgs0oCSyHoB92nuXZnl3gxs9j8jzOVIIlrFZ4EBLknPt5PlTz7+d0p48liq/JYT9R2HcybNcYy6AYTtoQuBJq9/5XOp7BAFuJpiGQuDidcTegSS7DlH10SVjwqPIsL97vdOwGwXb8igNkGXgHwE0=" + - secure: "l4LjlUj9eKZfe4GnL+5ELbnaNSmFKIBpzSWELvNyS8rkgS/LxctFixWJSPTIeqeihjEaYeqvIojUOOaIwenlIt71jNfTCbLKigFWdSIGnTt/qn8kpzj4gfuK6aadXoqtAe/1XWc6vfBswvrywWGZKk9TyBlfiJo4hOow9vXTQrc=" + - secure: "hkT4n/WjrrZ+qFRrdTVb3BDTWVEaQqIaSXb/ueEhQKul7voDIRTwcYRL9M4uML9IaWb3QMqYmsED8e8FgDWc2nTaBGWgd9V5vPn0vYDmG/4TQcvcA5pQjuHiwgN0OHbfg650IgUx4ddTIdZOC+ZqjL5IAwjxQZm1E/Ak3cJCL98=" + - secure: "ZM1TRbksrOtXG8VGwkp2brRsME2YdjQTEvRzjZpj3TXtxWDLc+Ng2WsAAbd9UzDJ9wbUREhY9SrmzB0ZV2iTFriuN0gC/tNrp5aRS+oACes7qU9Vodjt0S+Q1+KAiUbL3CcZRKkP6m4F8YDsug687fKGd34Vk7DR56OygWfvEpE=" + - secure: "DCiatNlzhcuMxlHL00ZL/ql+V4vDBOabXaaGpz3OpszO2kI1NvlddOfWScB213JqMyPegkWDjQFyybKPYjNUGgp3alMhlEn6jrvD96tHbdwwfWJc16lSEy1hdVA8KnqEYb0wU5RHBCIxdSM7kdxE3xmTGVJNVXt5narqikMeQ60=" + - secure: "hFdTzn9BWNddcGcf/hvj9Mz3peQgGo6VdRlAVdSrOiiUoArUM2Jhjtyl5Zmsv8yNhooAp9rDxQM6KQc/RmvHWpDnOhlJxO5uWDqOWnRvYEC1CfdTST4InJKWNgJwcXYqshpsMKLAvKNmUZzLSJ6TNPQWTBhgWlfk92adiUIvxuQ=" \ No newline at end of file diff --git a/README.md b/README.md index f028963..13c4fbb 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Pull requests welcome. ### Environment Variables -The test suite requires that the following environment variables +The test suite requires that the following environment variables are set: * WORDPRESS_HOST * WORDPRESS_USERNAME @@ -85,19 +85,30 @@ WORDPRESS_USERNAME=yourwordpressuser@wordpress.com WORDPRESS_PASSWORD=yourwordpresspassword ``` -When RSpec runs it will set the environment variables for you. +or use the sample-dot-env file as a base. .env will not be committed. When RSpec runs it will set the environment variables for you. + +If you'd like to run the tests to test a server with plain HTTP authentication, use these environment vars: + +``` +WORDPRESS_HTTP_LOGIN=yourhttplogin +WORDPRESS_HTTP_PASS=yourhttppass +WORDPRESS_HTTP_USERNAME=yourwordpressusername +WORDPRESS_HTTP_PASSWORD=yourwordpresspassword +WORDPRESS_HTTP_HOST=yourhost.com +WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php +``` ## Credits -* Zach Feldman [@zachfeldman](http://zfeldman.com) -* Dan Collis-Puro [@djcp](https://github.com/djcp) +* Zach Feldman [@zachfeldman](http://zfeldman.com) - current maintainer, majority of codebase +* Dan Collis-Puro [@djcp](https://github.com/djcp) - original project creator ## Contributors * Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) -* David Muto [@pseudomoto](https://github.com/pseudomoto) (Added ability to use a .env file.) +* David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file.) ## License diff --git a/rubypress.gemspec b/rubypress.gemspec index 001c098..8b8ff0e 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "1.0.3" + s.version = "1.0.4" s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] diff --git a/sample-dot-env b/sample-dot-env new file mode 100644 index 0000000..65bbe43 --- /dev/null +++ b/sample-dot-env @@ -0,0 +1,10 @@ +WORDPRESS_HOST= +WORDPRESS_PATH= +WORDPRESS_USERNAME= +WORDPRESS_PASSWORD= +WORDPRESS_HTTP_LOGIN= +WORDPRESS_HTTP_PASS= +WORDPRESS_HTTP_USERNAME= +WORDPRESS_HTTP_PASSWORD= +WORDPRESS_HTTP_HOST= +WORDPRESS_HTTP_PATH= \ No newline at end of file diff --git a/spec/cassettes/deleteComment.yml b/spec/cassettes/deleteComment.yml index 359e83a..042b0ce 100644 --- a/spec/cassettes/deleteComment.yml +++ b/spec/cassettes/deleteComment.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.deleteComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1 - -' + encoding: UTF-8 + string: | + wp.deleteComment0gxB06s8Z13 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '304' + - '292' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:56:10 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:30 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:56:10 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:30 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/deletePost.yml b/spec/cassettes/deletePost.yml index 7ee79f6..c40420b 100644 --- a/spec/cassettes/deletePost.yml +++ b/spec/cassettes/deletePost.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.deletePost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD137 - -' + encoding: UTF-8 + string: | + wp.deletePost0gxB06s8Z40 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '303' + - '297' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:16:35 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:46 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:16:35 GMT + recorded_at: Sat, 08 Feb 2014 23:06:46 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/deleteTerm.yml b/spec/cassettes/deleteTerm.yml index 57a6346..aa2346e 100644 --- a/spec/cassettes/deleteTerm.yml +++ b/spec/cassettes/deleteTerm.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.deleteTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory173470052 - -' + encoding: UTF-8 + string: | + wp.deleteTerm0gxB06s8Zcategory12 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '349' + - '337' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:42:07 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:07:00 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:42:07 GMT + recorded_at: Sat, 08 Feb 2014 23:07:01 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editComment.yml b/spec/cassettes/editComment.yml index dba3798..be7b04e 100644 --- a/spec/cassettes/editComment.yml +++ b/spec/cassettes/editComment.yml @@ -2,48 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.editComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1comment_parentcontentThis - is a test thing here.authorJohn - Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov - -' + encoding: UTF-8 + string: | + wp.editComment0gxB06s8Z13comment_parentcontentThis is a test thing here.authorJohn Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '788' + - '776' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:54:50 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:25 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:54:50 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:27 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editPost.yml b/spec/cassettes/editPost.yml index 3347451..d44ddaf 100644 --- a/spec/cassettes/editPost.yml +++ b/spec/cassettes/editPost.yml @@ -2,48 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.editPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134post_typepostpost_statusdraftpost_title5 - Ways to Know You''re Coolpost_contentI - don''t always write tests, but when I do, I use RSpec. - -' + encoding: UTF-8 + string: | + wp.editPost0gxB06s8Z40post_typepostpost_statusdraftpost_title5 Ways to Know You're Coolpost_contentI don't always write tests, but when I do, I use RSpec. headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '713' + - '707' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:13:52 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:45 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:13:52 GMT + recorded_at: Sat, 08 Feb 2014 23:06:46 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editProfile.yml b/spec/cassettes/editProfile.yml index 98a77d0..bac9eb0 100644 --- a/spec/cassettes/editProfile.yml +++ b/spec/cassettes/editProfile.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.editProfile0WORDPRESS_USERNAMEWORDPRESS_PASSWORDfirst_nameJohnson - -' + encoding: UTF-8 + string: | + wp.editProfile0gxB06s8Zfirst_nameJohnson headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '388' + - '375' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:45:48 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:07:03 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:45:48 GMT + recorded_at: Sat, 08 Feb 2014 23:07:04 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/editTerm.yml b/spec/cassettes/editTerm.yml index 4a705d8..93a04ec 100644 --- a/spec/cassettes/editTerm.yml +++ b/spec/cassettes/editTerm.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.editTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORD576440namegazellestaxonomycategory - -' + encoding: UTF-8 + string: | + wp.editTerm0gxB06s8Z12namegazellestaxonomycategory headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '488' + - '479' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:40:09 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:59 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 1\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 1 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:40:09 GMT + recorded_at: Sat, 08 Feb 2014 23:07:00 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getAuthors.yml b/spec/cassettes/getAuthors.yml index a04beaa..06fb30b 100644 --- a/spec/cassettes/getAuthors.yml +++ b/spec/cassettes/getAuthors.yml @@ -2,53 +2,62 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getAuthors0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getAuthors0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '276' + - '263' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:46:25 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '763' + - Sat, 08 Feb 2014 23:07:04 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '458' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n user_id46917508\n - \ user_logincontently\n - \ display_namecontently\n\n - \ \n user_id33483367\n - \ user_loginzachfeldman\n - \ display_namezachfeldman\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + user_id1 + user_login + display_name + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:46:25 GMT + recorded_at: Sat, 08 Feb 2014 23:07:05 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getComment.yml b/spec/cassettes/getComment.yml index c153cfd..01195d1 100644 --- a/spec/cassettes/getComment.yml +++ b/spec/cassettes/getComment.yml @@ -2,61 +2,71 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD1 - -' + encoding: UTF-8 + string: | + wp.getComment0gxB06s8Z13 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '301' + - '289' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:28:07 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '1482' + - Sat, 08 Feb 2014 23:06:28 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '1431' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n date_created_gmt20130604T20:07:46\n - \ user_id46917508\n - \ comment_id1\n - \ parent0\n - \ statusapprove\n - \ contentComments are fun!\n - \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-1\n - \ post_id134\n - \ post_title2013 Hair Color: Get the&nbsp;Look\n - \ authorcontently\n - \ author_urlhttp://WORDPRESS_HOST\n - \ author_emailWORDPRESS_USERNAME\n - \ author_ip184.75.98.7\n - \ type\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + date_created_gmt20140208T23:06:24 + user_id1 + comment_id13 + parent0 + statusapprove + contentThis is a test thing here. + linkhttp:///wordpress3dot7noauth/?p=1#comment-13 + post_id1 + post_titleHello world! + authorJohn Adams + author_urlhttp://johnadamsforpresidentnow.com + author_emailjohnadams@whitehouse.gov + author_ip174.109.227.206 + type + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:28:07 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:29 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getCommentCount.yml b/spec/cassettes/getCommentCount.yml index b6f1443..5fa4683 100644 --- a/spec/cassettes/getCommentCount.yml +++ b/spec/cassettes/getCommentCount.yml @@ -2,48 +2,61 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getCommentCount0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134 - -' + encoding: UTF-8 + string: | + wp.getCommentCount0gxB06s8Z1 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '308' + - '293' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:27:15 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:27 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '467' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n approved1\n - \ awaiting_moderation0\n - \ spam0\n total_comments1\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + approved2 + awaiting_moderation0 + spam0 + total_comments2 + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:27:15 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:28 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getCommentStatusList.yml b/spec/cassettes/getCommentStatusList.yml index 9750825..e19b1ab 100644 --- a/spec/cassettes/getCommentStatusList.yml +++ b/spec/cassettes/getCommentStatusList.yml @@ -2,48 +2,60 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getCommentStatusList0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getCommentStatusList0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '286' + - '273' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:56:42 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:31 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '408' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n holdUnapproved\n - \ approveApproved\n - \ spamSpam\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + holdUnapproved + approveApproved + spamSpam + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:56:42 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:32 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getComments.yml b/spec/cassettes/getComments.yml index 573c8b7..7075724 100644 --- a/spec/cassettes/getComments.yml +++ b/spec/cassettes/getComments.yml @@ -2,89 +2,90 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getComments0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getComments0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '301' + - '288' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:49:29 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '4159' + - Sat, 08 Feb 2014 23:06:29 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '2839' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n date_created_gmt20130604T20:47:50\n - \ user_id46917508\n - \ comment_id3\n - \ parent0\n - \ statusapprove\n - \ contentThis is a test thing here.\n - \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-3\n - \ post_id134\n - \ post_title2013 Hair Color: Get the&nbsp;Look\n - \ authorcontently\n - \ author_urlhttp://WORDPRESS_HOST\n - \ author_emailWORDPRESS_USERNAME\n - \ author_ip184.75.98.7\n - \ type\n\n - \ \n date_created_gmt20130604T20:46:25\n - \ user_id46917508\n - \ comment_id2\n - \ parent0\n - \ statusapprove\n - \ contentThis is a test comment.\n - \ linkhttp://WORDPRESS_HOST/about/comment-page-1/#comment-2\n - \ post_id1\n - \ post_titleAbout\n - \ authorcontently\n - \ author_urlhttp://WORDPRESS_HOST\n - \ author_emailWORDPRESS_USERNAME\n - \ author_ip184.75.98.7\n - \ type\n\n - \ \n date_created_gmt20130604T20:07:46\n - \ user_id46917508\n - \ comment_id1\n - \ parent0\n - \ statusapprove\n - \ contentComments are fun!\n - \ linkhttp://WORDPRESS_HOST/2013/05/30/2013-hair-color-get-the-look/comment-page-1/#comment-1\n - \ post_id134\n - \ post_title2013 Hair Color: Get the&nbsp;Look\n - \ authorcontently\n - \ author_urlhttp://WORDPRESS_HOST\n - \ author_emailWORDPRESS_USERNAME\n - \ author_ip184.75.98.7\n - \ type\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + date_created_gmt20140208T23:06:24 + user_id1 + comment_id13 + parent0 + statusapprove + contentThis is a test thing here. + linkhttp:///wordpress3dot7noauth/?p=1#comment-13 + post_id1 + post_titleHello world! + authorJohn Adams + author_urlhttp://johnadamsforpresidentnow.com + author_emailjohnadams@whitehouse.gov + author_ip174.109.227.206 + type + + + date_created_gmt20140202T16:53:06 + user_id0 + comment_id1 + parent0 + statusapprove + contentHi, this is a comment. + To delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them. + linkhttp:///wordpress3dot7noauth/?p=1#comment-1 + post_id1 + post_titleHello world! + authorMr WordPress + author_urlhttp://wordpress.org/ + author_email + author_ip + type + + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:49:29 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:30 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getMediaItem.yml b/spec/cassettes/getMediaItem.yml index e3bd1a7..311da69 100644 --- a/spec/cassettes/getMediaItem.yml +++ b/spec/cassettes/getMediaItem.yml @@ -2,65 +2,66 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getMediaItem0WORDPRESS_USERNAMEWORDPRESS_PASSWORD129 - -' + encoding: UTF-8 + string: | + wp.getMediaItem0gxB06s8Z38 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '305' + - '299' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 21:07:35 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '2166' + - Sat, 08 Feb 2014 23:06:39 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '1061' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n attachment_id129\n - \ date_created_gmt20130529T19:47:11\n - \ parent128\n linkhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg\n - \ title8yI9E3I\n - \ caption\n - \ description\n - \ metadata\n width1848\n - \ height2970\n file/home/wpcom/public_html/wp-content/blogs.dir/3dd/47989391/files/2013/05/8yi9e3i.jpg\n - \ sizes\n\n - \ image_meta\n aperture0\n - \ credit\n camera\n - \ caption\n - \ created_timestamp0\n - \ copyright\n - \ focal_length0\n - \ iso0\n shutter_speed0\n - \ title\n\n\n - \ thumbnailhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg?w=93\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + attachment_id38 + date_created_gmt20140208T23:06:37 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file16.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file16.png + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 21:07:35 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:39 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getMediaLibrary.yml b/spec/cassettes/getMediaLibrary.yml index 1e5b264..354be36 100644 --- a/spec/cassettes/getMediaLibrary.yml +++ b/spec/cassettes/getMediaLibrary.yml @@ -2,65 +2,233 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getMediaLibrary0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getMediaLibrary0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '305' + - '292' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 21:08:52 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '2213' + - Sat, 08 Feb 2014 23:06:40 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '14905' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n attachment_id129\n - \ date_created_gmt20130529T19:47:11\n - \ parent128\n linkhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg\n - \ title8yI9E3I\n - \ caption\n - \ description\n - \ metadata\n width1848\n - \ height2970\n file/home/wpcom/public_html/wp-content/blogs.dir/3dd/47989391/files/2013/05/8yi9e3i.jpg\n - \ sizes\n\n - \ image_meta\n aperture0\n - \ credit\n camera\n - \ caption\n - \ created_timestamp0\n - \ copyright\n - \ focal_length0\n - \ iso0\n shutter_speed0\n - \ title\n\n\n - \ thumbnailhttp://cthisisatest.files.wordpress.com/2013/05/8yi9e3i.jpg?w=93\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + attachment_id39 + date_created_gmt20140208T23:06:38 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file17.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file17.png + + + attachment_id38 + date_created_gmt20140208T23:06:37 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file16.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file16.png + + + attachment_id35 + date_created_gmt20140208T21:04:42 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file15.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file15.png + + + attachment_id34 + date_created_gmt20140208T21:04:41 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file14.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file14.png + + + attachment_id31 + date_created_gmt20140208T21:03:05 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file13.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file13.png + + + attachment_id30 + date_created_gmt20140208T21:03:05 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file12.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file12.png + + + attachment_id29 + date_created_gmt20140208T21:02:46 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file11.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file11.png + + + attachment_id28 + date_created_gmt20140208T21:02:45 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file10.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file10.png + + + attachment_id25 + date_created_gmt20140208T21:01:08 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file9.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file9.png + + + attachment_id22 + date_created_gmt20140208T20:28:40 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file8.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file8.png + + + attachment_id19 + date_created_gmt20140208T20:16:21 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file7.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file7.png + + + attachment_id16 + date_created_gmt20140208T20:01:42 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file6.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file6.png + + + attachment_id15 + date_created_gmt20140208T19:46:58 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file5.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file5.png + + + attachment_id10 + date_created_gmt20140208T19:39:47 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file4.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file4.png + + + attachment_id7 + date_created_gmt20140208T19:30:43 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file3.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file3.png + + + attachment_id4 + date_created_gmt20140202T17:03:20 + parent0 + linkhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file2.png + titletest_file.png + caption + description + metadata + thumbnailhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file2.png + + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 21:08:52 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:40 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getOptions.yml b/spec/cassettes/getOptions.yml index 86e7fb8..3bf3f71 100644 --- a/spec/cassettes/getOptions.yml +++ b/spec/cassettes/getOptions.yml @@ -2,244 +2,192 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getOptions0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '313' + - '300' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 21:20:10 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '8893' + - Sat, 08 Feb 2014 23:06:40 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '9019' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: ASCII-8BIT - string: !binary |- - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv - ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 - ZT4KICAgICAgPHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPnNvZnR3YXJlX25h - bWU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNj - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPlNvZnR3YXJlIE5hbWU8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25h - bWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5n - PldvcmRQcmVzczwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0 - PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zb2Z0d2FyZV92 - ZXJzaW9uPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ - ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Tb2Z0d2FyZSBWZXJzaW9uPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv - bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ - PHN0cmluZz4zLjYtYmV0YTMtMjQzNzU8L3N0cmluZz48L3ZhbHVlPjwvbWVt - YmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h - bWU+YmxvZ191cmw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 - bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPldvcmRQcmVzcyBBZGRy - ZXNzIChVUkwpPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy - PjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29s - ZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwv - bmFtZT48dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1Q8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+aG9tZV91cmw8L25hbWU+PHZhbHVlPjxz - dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPlNpdGUgQWRkcmVzcyAoVVJMKTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJv - b2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQ - UkVTU19IT1NUPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmltYWdlX2RlZmF1 - bHRfbGlua190eXBlPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+ - PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5JbWFnZSBkZWZhdWx0 - IGxpbmsgdHlwZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9v - bGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+ZmlsZTwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5pbWFnZV9kZWZhdWx0X3NpemU8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPklt - YWdlIGRlZmF1bHQgc2l6ZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+ - MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy - PjxuYW1lPmltYWdlX2RlZmF1bHRfYWxpZ248L25hbWU+PHZhbHVlPjxzdHJ1 - Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5n - PkltYWdlIGRlZmF1bHQgYWxpZ248L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29s - ZWFuPjE8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT50ZW1wbGF0ZTwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8 - bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVtcGxh - dGU8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - cmVhZG9ubHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjE8L2Jvb2xlYW4+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPnB1Yi9idWVubzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i - ZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5zdHlsZXNoZWV0PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+ - PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5TdHlsZXNoZWV0PC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRv - bmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+ - PHN0cmluZz5wdWIvYnVlbm88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8 - L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z - dF90aHVtYm5haWw8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 - bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlBvc3QgVGh1bWJuYWls - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJl - YWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFs - dWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0 - cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGltZV96 - b25lPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVz - YzwvbmFtZT48dmFsdWU+PHN0cmluZz5UaW1lIFpvbmU8L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9ubHk8L25hbWU+ - PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+YmxvZ190aXRsZTwvbmFtZT48dmFs - dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl - PjxzdHJpbmc+U2l0ZSBUaXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xl - YW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h - bWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y3RoaXNpc2F0ZXN0PC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2dfdGFnbGluZTwvbmFtZT48dmFs - dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl - PjxzdHJpbmc+U2l0ZSBUYWdsaW5lPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9v - bGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5TbWlsZSEgWW914oCZ - cmUgYXQgdGhlIGJlc3QgV29yZFByZXNzLmNvbSBzaXRlIGV2ZXI8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+ZGF0ZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxz - dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPkRhdGUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4w - PC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52 - YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5GIGosIFk8L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+dGltZV9mb3JtYXQ8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPlRp - bWUgRm9ybWF0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy - PjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29s - ZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwv - bmFtZT48dmFsdWU+PHN0cmluZz5nOmkgYTwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT51c2Vyc19jYW5fcmVnaXN0ZXI8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+ - CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFs - bG93IG5ldyB1c2VycyB0byBzaWduIHVwPC9zdHJpbmc+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48 - Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVh - bj48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfdzwvbmFtZT48dmFs - dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl - PjxzdHJpbmc+VGh1bWJuYWlsIFdpZHRoPC9zdHJpbmc+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48 - Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4xNTA8L2ludD48L3Zh - bHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+dGh1bWJuYWlsX3NpemVfaDwvbmFtZT48dmFsdWU+PHN0 - cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJp - bmc+VGh1bWJuYWlsIEhlaWdodDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT5yZWFkb25seTwvbmFtZT48dmFsdWU+PGJvb2xl - YW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h - bWU+dmFsdWU8L25hbWU+PHZhbHVlPjxpbnQ+MTUwPC9pbnQ+PC92YWx1ZT48 - L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy - PjxuYW1lPnRodW1ibmFpbF9jcm9wPC9uYW1lPjx2YWx1ZT48c3RydWN0Pgog - IDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Dcm9w - IHRodW1ibmFpbCB0byBleGFjdCBkaW1lbnNpb25zPC9zdHJpbmc+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2 - YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+ - PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPm1lZGl1bV9zaXplX3c8L25hbWU+PHZhbHVlPjxz - dHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNjPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPk1lZGl1bSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1lPjx2YWx1 - ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4zMDA8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+bWVkaXVtX3NpemVfaDwvbmFtZT48dmFs - dWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25hbWU+PHZhbHVl - PjxzdHJpbmc+TWVkaXVtIHNpemUgaW1hZ2UgaGVpZ2h0PC9zdHJpbmc+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1l - Pjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4z - MDA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGFyZ2Vfc2l6ZV93PC9uYW1l - Pjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwvbmFtZT48 - dmFsdWU+PHN0cmluZz5MYXJnZSBzaXplIGltYWdlIHdpZHRoPC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9u - YW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmlu - Zz4xMDI0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxhcmdlX3NpemVfaDwv - bmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmRlc2M8L25h - bWU+PHZhbHVlPjxzdHJpbmc+TGFyZ2Ugc2l6ZSBpbWFnZSBoZWlnaHQ8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cmVhZG9u - bHk8L25hbWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZhbHVlPC9uYW1lPjx2YWx1ZT48 - c3RyaW5nPjEwMjQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVj - dD48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVmYXVsdF9j - b21tZW50X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVy - PjxuYW1lPmRlc2M8L25hbWU+PHZhbHVlPjxzdHJpbmc+QWxsb3cgcGVvcGxl - IHRvIHBvc3QgY29tbWVudHMgb24gbmV3IGFydGljbGVzPC9zdHJpbmc+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJlYWRvbmx5PC9uYW1l - Pjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5v - cGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlZmF1bHRfcGluZ19zdGF0 - dXM8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5kZXNj - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPkFsbG93IGxpbmsgbm90aWZpY2F0aW9u - cyBmcm9tIG90aGVyIGJsb2dzIChwaW5nYmFja3MgYW5kIHRyYWNrYmFja3Mp - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnJl - YWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFs - dWU+PHN0cmluZz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9z - dHJ1Y3Q+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmJsb2df - cHVibGljPC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ - ZGVzYzwvbmFtZT48dmFsdWU+PHN0cmluZz5Qcml2YWN5IGFjY2Vzczwvc3Ry - aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5yZWFkb25s - eTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxz - dHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0Pjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT53b3JkcHJlc3MuY29t - PC9uYW1lPjx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+ZGVzYzwv - bmFtZT48dmFsdWU+PHN0cmluZz5UaGlzIGlzIGEgd29yZHByZXNzLmNvbSBi - bG9nPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnJlYWRvbmx5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9ib29sZWFuPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48 - dmFsdWU+PGJvb2xlYW4+MTwvYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgo8 - L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD4KICAgICAgPC92 - YWx1ZT4KICAgIDwvcGFyYW0+CiAgPC9wYXJhbXM+CjwvbWV0aG9kUmVzcG9u - c2U+Cg== + encoding: UTF-8 + string: | + + + + + + + software_name + descSoftware Name + readonly1 + valueWordPress + + software_version + descSoftware Version + readonly1 + value3.7.1 + + blog_url + descWordPress Address (URL) + readonly1 + valuehttp:///wordpress3dot7noauth + + home_url + descSite Address (URL) + readonly1 + valuehttp:///wordpress3dot7noauth + + login_url + descLogin Address (URL) + readonly1 + valuehttp:///wordpress3dot7noauth/wp-login.php + + _url + descThe URL to the area + readonly1 + valuehttp:///wordpress3dot7noauth/wp-/ + + image_default_link_type + descImage default link type + readonly1 + valuefile + + image_default_size + descImage default size + readonly1 + value + + image_default_align + descImage default align + readonly1 + value + + template + descTemplate + readonly1 + valuetwentythirteen + + stylesheet + descStylesheet + readonly1 + valuetwentythirteen + + post_thumbnail + descPost Thumbnail + readonly1 + value1 + + time_zone + descTime Zone + readonly0 + value0 + + blog_title + descSite Title + readonly0 + valueWordpress 3 Dot 7 No Auth + + blog_tagline + descSite Tagline + readonly0 + valueThis is a great tagline + + date_format + descDate Format + readonly0 + valueF j, Y + + time_format + descTime Format + readonly0 + valueg:i a + + users_can_register + descAllow new users to sign up + readonly0 + value0 + + thumbnail_size_w + descThumbnail Width + readonly0 + value150 + + thumbnail_size_h + descThumbnail Height + readonly0 + value150 + + thumbnail_crop + descCrop thumbnail to exact dimensions + readonly0 + value1 + + medium_size_w + descMedium size image width + readonly0 + value300 + + medium_size_h + descMedium size image height + readonly0 + value300 + + large_size_w + descLarge size image width + readonly0 + value1024 + + large_size_h + descLarge size image height + readonly0 + value1024 + + default_comment_status + descAllow people to post comments on new articles + readonly0 + valueopen + + default_ping_status + descAllow link notifications from other blogs (pingbacks and trackbacks) + readonly0 + valueopen + + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 21:20:10 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:41 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPost.yml b/spec/cassettes/getPost.yml index f37c64c..c90cf9d 100644 --- a/spec/cassettes/getPost.yml +++ b/spec/cassettes/getPost.yml @@ -2,195 +2,96 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134posttermscustom_fields - -' + encoding: UTF-8 + string: | + wp.getPost0gxB06s8Z40posttermscustom_fields headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '461' + - '455' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:03:32 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '6714' + - Sat, 08 Feb 2014 23:06:43 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '3183' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: ASCII-8BIT - string: !binary |- - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv - ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 - ZT4KICAgICAgPHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPnBvc3RfaWQ8L25h - bWU+PHZhbHVlPjxzdHJpbmc+MTM0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxz - dHJpbmc+MjAxMyBIYWlyIENvbG9yOiBHZXQgdGhlIExvb2s8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9u - YW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUzMFQxMzo1MToz - NDwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+cG9zdF9kYXRlX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1l - Lmlzbzg2MDE+MjAxMzA1MzBUMTM6NTE6MzQ8L2RhdGVUaW1lLmlzbzg2MDE+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZp - ZWQ8L25hbWU+PHZhbHVlPjxkYXRlVGltZS5pc284NjAxPjIwMTMwNTMwVDEz - OjUxOjM1PC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5wb3N0X21vZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+ - PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzBUMTM6NTE6MzU8L2RhdGVUaW1l - Lmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBv - c3Rfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPnB1Ymxpc2g8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90eXBl - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnBvc3Q8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9uYW1lPC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPjIwMTMtaGFpci1jb2xvci1nZXQtdGhlLWxvb2s8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRo - b3I8L25hbWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwv - bmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48 - c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5wb3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3Am - Z3Q7Jmx0O2kmZ3Q7QnkgU2FyYWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0 - OyZsdDtwJmd0OyZsdDtpJmd0OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3Am - Z3Q7VG9ucyBvZiBnb3JnZW91cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4g - Z3JhY2luZyB0aGUgcmVkIGNhcnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291 - bGQgc2F5IHRoZXkgYXJlIGRlZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAy - MDEzIGhhaXIgY29sb3IgdHJlbmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMg - dG8ga2VlcCBpbiBtaW5kIHdoZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRo - ZSBuZXcgeWVhciEmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJl - IC0gVGhlIHJlYWxseSBib2xkIG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRp - cHMgaXMgZGVmaW5pdGVseSBvbiB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFk - aWVzIGFyZSBjaG9vc2luZyB0byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9t - IHJvb3QgdG8gdGlwIGEgbXVjaCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhy - ZWY9JnF1b3Q7aHR0cDovL3d3dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtl - dXAvdGVkLWdpYnNvbi1vbi1zcHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zl - ci1hbmQtdW5kZXJodHRwOi8vJnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQg - R2lic29uJmx0Oy9hJmd0Oywgb3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMs - IHRoZSBzdGFyayBvbWJyZSB0cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3Qu - ICZxdW90O0nigJltIG92ZXIgb21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFy - ay4gVGhlcmXigJlzIGEgd2F5IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxv - b2sgc28gdGhhdCBpdOKAmXMgc2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBj - b250cmFzdGluZywgaXTigJlzIG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJv - dXQgYSBzbW9vdGhlciB0cmFuc2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBp - cyAgZ3JhZHVhbCwgeW91IGNhbiB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8g - ZGlkIHRoZSBjb2xvciBpcyBhbiBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3 - aXRob3V0IG11Y2ggaW4gdGhlIHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0 - IHdvcmsuJnF1b3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBC - b2xkLCBjcmVhdGl2ZSBjb2xvciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24g - dGhlIHdpbGQgc2lkZSwgYWRkaW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVs - eSB0aGUgd2F5IHRvIGdvLiBBbmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBi - cmlnaHQgY29wcGVyIC0gdHVycXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBn - cmVlbiBhcmUgYWxsIHRoZSByYWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4n - dCByZWFkeSB0byBnbyBmdWxsLW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2Eg - aHJlZj0mcXVvdDtodHRwOi8vdGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAx - Mi8wMS9jaGFsay1pdC11cC9odHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRo - ZSB0aXBzIG9mIHlvdXIgaGFpciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7 - L3AmZ3Q7Jmx0O3AmZ3Q7My4gRGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIg - aG90IGxvb2sgZm9yIFNwcmluZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9 - JnF1b3Q7aHR0cDovL3d3dy5mYXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1w - ZXRlci1zb20tc3MtMTMtMjkxNDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVs - aWNhdGUgcGFzdGVscyB0aHJvdWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4g - SXQncyBhIGdyZWF0IHdheSB0byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5l - eHBlY3RlZCwgYnV0IGl0J3Mgbm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBz - b21lIG9mIHRoZSBib2xkZXIgaHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsm - bHQ7cCZndDs0LiBTdW4tZmxlY2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwg - d2lsbCBnb3JnZW91cywganVzdC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4t - ZmxlY2tlZCBodWVzIGV2ZXIgZ28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5v - dCwgbXkgZnJpZW5kcy4gU3VuLWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1h - a2UgYW55IGRyYWIgY29sb3IgcG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUg - bW9zdCBjb21wbGV4aW9ucy4mbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0 - OzUuIENvb2wgdG9uZXMgLSBPbiB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9u - ZXMgYXJlIG1ha2luZyBhIGh1Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNy - aXNwIGFuZCBjbGVhbiBzaGFkZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAy - MDEzLCZxdW90OyBDbGVtZW50cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdp - bGwgYWxzbyBzZWUsIGZvciB0aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJz - IG9mIHRoZSAgbGlnaHRlciBzaGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhl - IGFsbW9zdCB0b25lbGVzcyBhbmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNj - b3JkaW5nIHRvICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29t - LmF1L2xpZmVzdHlsZS9iZWF1dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEw - NC0yYzd6NC5odG1saHR0cDovLyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0 - Oy9hJmd0Oy4gT24gdGhlIG9wcG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwg - YmUgc3VwZXIgZGFyaywgd2l0aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxh - Y2sgc2hhZGVzLiBJbiBteSBvcGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBj - YW4gdHJ1bHkgcHVsbCBvZmYgdGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3Ms - IHRob3VnaC4mbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBs - b29rcyB0byBiZSBhIHN1cGVyIGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZs - dDsvcCZndDsmbHQ7cCZndDtGQUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBj - b2xvcnMgYXJlIHBpY2tpbmcgdXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0 - IHJlYWR5IHRvIG1ha2UgdGhlIGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0 - aGUgZW5kcyBvZiB5b3VyIGhhaXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5 - IGZ1biBlZmZlY3Qgd2l0aCBzcGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24u - Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9w - Jmd0OyZsdDtwJmd0OyZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0 - O2JyJmd0OyZsdDsvcCZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJp - bmc+MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5wb3N0X21pbWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFt - ZT48dmFsdWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8w - NS8zMC8yMDEzLWhhaXItY29sb3ItZ2V0LXRoZS1sb29rLzwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5ndWlkPC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPmh0dHA6Ly9XT1JEUFJFU1NfSE9TVC8/cD0xMzQ8L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bWVudV9v - cmRlcjwvbmFtZT48dmFsdWU+PGludD4wPC9pbnQ+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPmNvbW1lbnRfc3RhdHVzPC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPm9wZW48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cGluZ19zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5zdGlja3k8L25hbWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdGh1bWJuYWls - PC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+CjwvZGF0YT48L2FycmF5Pjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2Zvcm1hdDwv - bmFtZT48dmFsdWU+PHN0cmluZz5zdGFuZGFyZDwvc3RyaW5nPjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50ZXJtczwvbmFtZT48dmFsdWU+ - PGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5h - bWU+dGVybV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPm5hbWU8L25hbWU+PHZh - bHVlPjxzdHJpbmc+VW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zbHVnPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPnVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+dGVybV9ncm91cDwvbmFtZT48dmFsdWU+PHN0cmlu - Zz4wPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnRlcm1fdGF4b25vbXlfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3Ry - aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50YXhvbm9t - eTwvbmFtZT48dmFsdWU+PHN0cmluZz5jYXRlZ29yeTwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5kZXNjcmlwdGlvbjwvbmFt - ZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+cGFyZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Y291 - bnQ8L25hbWU+PHZhbHVlPjxpbnQ+NDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+ - Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jdXN0b21fZmllbGRzPC9uYW1lPjx2 - YWx1ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJl - cj48bmFtZT5pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4zOTY8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+a2V5PC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPmphYmJlcl9wdWJsaXNoZWQ8L3N0cmluZz48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVl - PjxzdHJpbmc+MTM2OTkyMTg5Nzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9t - ZW1iZXI+Cjwvc3RydWN0PgogICAgICA8L3ZhbHVlPgogICAgPC9wYXJhbT4K - ICA8L3BhcmFtcz4KPC9tZXRob2RSZXNwb25zZT4K + encoding: UTF-8 + string: | + + + + + + + post_id40 + post_title5 Ways to Know You're Cool + post_date20140208T23:06:43 + post_date_gmt20140208T23:06:43 + post_modified20140208T23:06:43 + post_modified_gmt20140208T23:06:43 + post_statusdraft + post_typepost + post_name + post_author1 + post_password + post_excerpt + post_contentI don't always write tests, but when I do, I use RSpec. + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=40 + guidhttp:///wordpress3dot7noauth/?p=40 + menu_order0 + comment_statusclosed + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:03:32 GMT + recorded_at: Sat, 08 Feb 2014 23:06:44 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostFormats.yml b/spec/cassettes/getPostFormats.yml index dd6e7b9..26b3925 100644 --- a/spec/cassettes/getPostFormats.yml +++ b/spec/cassettes/getPostFormats.yml @@ -2,57 +2,67 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPostFormats0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getPostFormats0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '304' + - '291' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:20:13 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:51 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '934' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n standardStandard\n - \ asideAside\n - \ chatChat\n - \ galleryGallery\n - \ linkLink\n - \ imageImage\n - \ quoteQuote\n - \ statusStatus\n - \ videoVideo\n - \ audioAudio\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + standardStandard + asideAside + chatChat + galleryGallery + linkLink + imageImage + quoteQuote + statusStatus + videoVideo + audioAudio + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:20:13 GMT + recorded_at: Sat, 08 Feb 2014 23:06:52 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostStatusList.yml b/spec/cassettes/getPostStatusList.yml index 4444966..e8df632 100644 --- a/spec/cassettes/getPostStatusList.yml +++ b/spec/cassettes/getPostStatusList.yml @@ -2,57 +2,67 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPostFormats0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getPostFormats0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '280' + - '267' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:20:54 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:52 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '934' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n standardStandard\n - \ asideAside\n - \ chatChat\n - \ galleryGallery\n - \ linkLink\n - \ imageImage\n - \ quoteQuote\n - \ statusStatus\n - \ videoVideo\n - \ audioAudio\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + standardStandard + asideAside + chatChat + galleryGallery + linkLink + imageImage + quoteQuote + statusStatus + videoVideo + audioAudio + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:20:54 GMT + recorded_at: Sat, 08 Feb 2014 23:06:53 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostType.yml b/spec/cassettes/getPostType.yml index 589ba97..65621fd 100644 --- a/spec/cassettes/getPostType.yml +++ b/spec/cassettes/getPostType.yml @@ -2,65 +2,76 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPostType0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost - -' + encoding: UTF-8 + string: | + wp.getPostType0gxB06s8Zpost headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '350' + - '337' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:19:02 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '1627' + - Sat, 08 Feb 2014 23:06:47 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '1547' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n namepost\n - \ labelPosts\n - \ hierarchical0\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ has_archive0\n - \ supports\n title1\n - \ editor1\n - \ author1\n - \ thumbnail1\n - \ excerpt1\n - \ trackbacks1\n - \ custom-fields1\n - \ comments1\n - \ revisions1\n - \ post-formats1\n - \ geo-location1\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + namepost + labelPosts + hierarchical0 + public1 + show_ui1 + _builtin1 + has_archive0 + supports + title1 + editor1 + author1 + thumbnail1 + excerpt1 + trackbacks1 + custom-fields1 + comments1 + revisions1 + post-formats1 + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:19:03 GMT + recorded_at: Sat, 08 Feb 2014 23:06:48 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPostTypes.yml b/spec/cassettes/getPostTypes.yml index c53cb0a..7dd1779 100644 --- a/spec/cassettes/getPostTypes.yml +++ b/spec/cassettes/getPostTypes.yml @@ -2,133 +2,136 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPostTypes0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getPostTypes0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '339' + - '326' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:19:19 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '7887' + - Sat, 08 Feb 2014 23:06:48 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '5438' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n post\n - \ namepost\n - \ labelPosts\n - \ hierarchical0\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ has_archive0\n - \ supports\n title1\n - \ editor1\n - \ author1\n - \ thumbnail1\n - \ excerpt1\n - \ trackbacks1\n - \ custom-fields1\n - \ comments1\n - \ revisions1\n - \ post-formats1\n - \ geo-location1\n\n\n - \ page\n namepage\n - \ labelPages\n - \ hierarchical1\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ has_archive0\n - \ supports\n title1\n - \ editor1\n - \ author1\n - \ thumbnail1\n - \ page-attributes1\n - \ custom-fields1\n - \ comments1\n - \ revisions1\n\n\n - \ attachment\n nameattachment\n - \ labelMedia\n - \ hierarchical0\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ has_archive0\n - \ supports\n title1\n - \ author1\n - \ comments1\n\n\n - \ revision\n namerevision\n - \ labelRevisions\n - \ hierarchical0\n - \ public0\n - \ show_ui0\n - \ _builtin1\n - \ has_archive0\n - \ supports\n author1\n\n\n - \ nav_menu_item\n namenav_menu_item\n - \ labelNavigation Menu Items\n - \ hierarchical0\n - \ public0\n - \ show_ui0\n - \ _builtin1\n - \ has_archive0\n - \ supports\n title1\n - \ editor1\n\n\n - \ safecss\n namesafecss\n - \ labelCustom CSS\n - \ hierarchical0\n - \ public0\n - \ show_ui0\n - \ _builtin0\n - \ has_archive0\n - \ supports\n revisions1\n\n\n - \ custom_dns\n namecustom_dns\n - \ labelCustom DNS\n - \ hierarchical0\n - \ public0\n - \ show_ui0\n - \ _builtin0\n - \ has_archive0\n - \ supports\n revisions1\n\n\n - \ feedback\n namefeedback\n - \ labelFeedbacks\n - \ hierarchical0\n - \ public0\n - \ show_ui1\n - \ _builtin0\n - \ has_archive0\n - \ supports\n title1\n - \ editor1\n\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + post + namepost + labelPosts + hierarchical0 + public1 + show_ui1 + _builtin1 + has_archive0 + supports + title1 + editor1 + author1 + thumbnail1 + excerpt1 + trackbacks1 + custom-fields1 + comments1 + revisions1 + post-formats1 + + + page + namepage + labelPages + hierarchical1 + public1 + show_ui1 + _builtin1 + has_archive0 + supports + title1 + editor1 + author1 + thumbnail1 + page-attributes1 + custom-fields1 + comments1 + revisions1 + + + attachment + nameattachment + labelMedia + hierarchical0 + public1 + show_ui1 + _builtin1 + has_archive0 + supports + title1 + author1 + comments1 + + + revision + namerevision + labelRevisions + hierarchical0 + public0 + show_ui0 + _builtin1 + has_archive0 + supports + author1 + + + nav_menu_item + namenav_menu_item + labelNavigation Menu Items + hierarchical0 + public0 + show_ui0 + _builtin1 + has_archive0 + supports + title1 + editor1 + + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:19:19 GMT + recorded_at: Sat, 08 Feb 2014 23:06:49 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getPosts.yml b/spec/cassettes/getPosts.yml index b291437..4f8c399 100644 --- a/spec/cassettes/getPosts.yml +++ b/spec/cassettes/getPosts.yml @@ -2,831 +2,262 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getPosts0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost_typepostorderbypost_dateorderascfieldsposttermscustom_fields - -' + encoding: UTF-8 + string: | + wp.getPosts0gxB06s8Zpost_typepostorderbypost_dateorderascfieldsposttermscustom_fields headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '726' + - '713' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:05:41 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '35468' + - Sat, 08 Feb 2014 23:06:44 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '15421' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: ASCII-8BIT - string: !binary |- - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv - ZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1 - ZT4KICAgICAgPGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3RydWN0PgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4zPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rf - dGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+Um9iIGFzIFBNPC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZGF0ZTwv - bmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA0MTZUMTg6MTM6 - MTg8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPnBvc3RfZGF0ZV9nbXQ8L25hbWU+PHZhbHVlPjxkYXRlVGlt - ZS5pc284NjAxPjIwMTMwNDE2VDE4OjEzOjE4PC9kYXRlVGltZS5pc284NjAx - PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21vZGlm - aWVkPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDQxNlQx - ODoxMzoxOTwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+cG9zdF9tb2RpZmllZF9nbXQ8L25hbWU+PHZhbHVl - PjxkYXRlVGltZS5pc284NjAxPjIwMTMwNDE2VDE4OjEzOjE5PC9kYXRlVGlt - ZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w - b3N0X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5wdWJsaXNoPC9zdHJp - bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfdHlw - ZTwvbmFtZT48dmFsdWU+PHN0cmluZz5wb3N0PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbmFtZTwvbmFtZT48dmFs - dWU+PHN0cmluZz5yb2ItYXMtcG08L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+PHZhbHVlPjxz - dHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFsdWU+PHN0cmlu - Zz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2NvbnRlbnQ8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2kmZ3Q7QnkgQ2lu - ZHkgQm9rbWEmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0O1JvYiBhcyBQ - TSBpcyBhbWF6YmFsbHMhISZsdDsvcCZndDsmbHQ7ZGl2IGlkPSZxdW90O3N1 - bW1hcnkmcXVvdDsmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsm - bHQ7L2RpdiZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X21pbWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFs - dWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8wNC8xNi9y - b2ItYXMtcG0vPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVy - PjxuYW1lPmd1aWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQ - UkVTU19IT1NULz9wPTM8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+bWVudV9vcmRlcjwvbmFtZT48dmFsdWU+PGludD4wPC9p - bnQ+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmNvbW1lbnRf - c3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9wZW48L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGluZ19zdGF0dXM8L25h - bWU+PHZhbHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT5zdGlja3k8L25hbWU+PHZhbHVlPjxib29s - ZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPnBvc3RfdGh1bWJuYWlsPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+ - CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5wb3N0X2Zvcm1hdDwvbmFtZT48dmFsdWU+PHN0cmluZz5zdGFuZGFy - ZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50 - ZXJtczwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3Ry - dWN0PgogIDxtZW1iZXI+PG5hbWU+dGVybV9pZDwvbmFtZT48dmFsdWU+PHN0 - cmluZz4xPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPm5hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+VW5jYXRlZ29yaXplZDwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zbHVn - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybV9ncm91cDwv - bmFtZT48dmFsdWU+PHN0cmluZz4wPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnRlcm1fdGF4b25vbXlfaWQ8L25hbWU+PHZh - bHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT50YXhvbm9teTwvbmFtZT48dmFsdWU+PHN0cmluZz5jYXRl - Z29yeTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5kZXNjcmlwdGlvbjwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGFyZW50PC9uYW1l - Pjx2YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+Y291bnQ8L25hbWU+PHZhbHVlPjxpbnQ+NDwvaW50 - PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+CjwvZGF0YT48 - L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jdXN0 - b21fZmllbGRzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVl - PjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5pZDwvbmFtZT48dmFsdWU+PHN0 - cmluZz4zPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPmtleTwvbmFtZT48dmFsdWU+PHN0cmluZz5qYWJiZXJfcHVibGlzaGVk - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnZh - bHVlPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjEzNjYxMzU5OTk8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9h - cnJheT48L3ZhbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgogIDx2 - YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48 - dmFsdWU+PHN0cmluZz44PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - WU9VIEFSRSBFRElURUQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUu - aXNvODYwMT4yMDEzMDUxMFQyMDoyNDozMDwvZGF0ZVRpbWUuaXNvODYwMT48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlX2dt - dDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MTBUMjA6 - MjQ6MzA8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxkYXRl - VGltZS5pc284NjAxPjIwMTMwNTEwVDIwOjI0OjMwPC9kYXRlVGltZS5pc284 - NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21v - ZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAx - MzA1MTBUMjA6MjQ6MzA8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPmRyYWZ0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnBvc3RfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz5w - b3N0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnBvc3RfbmFtZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25h - bWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48 - dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5n - Pjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w - b3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGhpcyBhIGdyZWF0 - IHRlc3QuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9taW1l - X3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxpbms8L25hbWU+PHZhbHVlPjxz - dHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTg8L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Z3VpZDwvbmFtZT48dmFs - dWU+PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9ODwvc3RyaW5n - PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51X29yZGVy - PC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZhbHVlPjxz - dHJpbmc+Y2xvc2VkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPnBpbmdfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9w - ZW48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - c3RpY2t5PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3RodW1ibmFpbDwv - bmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgo8L2RhdGE+PC9hcnJheT48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9mb3JtYXQ8L25h - bWU+PHZhbHVlPjxzdHJpbmc+c3RhbmRhcmQ8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybXM8L25hbWU+PHZhbHVlPjxh - cnJheT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1l - PnRlcm1faWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5uYW1lPC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPlVuY2F0ZWdvcml6ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+c2x1ZzwvbmFtZT48dmFsdWU+PHN0cmlu - Zz51bmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnRlcm1fZ3JvdXA8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT50 - ZXJtX3RheG9ub215X2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGF4b25vbXk8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+Y2F0ZWdvcnk8L3N0cmluZz48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ZGVzY3JpcHRpb248L25hbWU+ - PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnBhcmVudDwvbmFtZT48dmFsdWU+PHN0cmluZz4wPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmNvdW50 - PC9uYW1lPjx2YWx1ZT48aW50PjQ8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgo8 - L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+Y3VzdG9tX2ZpZWxkczwvbmFtZT48dmFs - dWU+PGFycmF5PjxkYXRhPgo8L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwvbWVt - YmVyPgo8L3N0cnVjdD48L3ZhbHVlPgogIDx2YWx1ZT48c3RydWN0PgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xMjg8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z - dF90aXRsZTwvbmFtZT48dmFsdWU+PHN0cmluZz5Xb3JkUHJlc3MgVGVzdDwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X2RhdGU8L25hbWU+PHZhbHVlPjxkYXRlVGltZS5pc284NjAxPjIwMTMwNTI5 - VDE5OjQ3OjI0PC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT5wb3N0X2RhdGVfZ210PC9uYW1lPjx2YWx1ZT48 - ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUyOVQxOTo0NzoyNDwvZGF0ZVRpbWUu - aXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z - dF9tb2RpZmllZDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAx - MzA1MjlUMTk6NDc6MjQ8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWRfZ210PC9uYW1l - Pjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEzMDUyOVQxOTo0NzoyNDwv - ZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+cG9zdF9zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+cHVibGlz - aDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w - b3N0X3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+cG9zdDwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X25hbWU8L25h - bWU+PHZhbHVlPjxzdHJpbmc+d29yZHByZXNzLXRlc3Q8L3N0cmluZz48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25h - bWU+PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48 - dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5n - Pjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5w - b3N0X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+VGVzdGluZyB0ZXN0 - IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv - cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt - IGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 - bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk - b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv - ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz - aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg - YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l - dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7C - oFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRl - c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp - bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg - dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC5UZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g - aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz - dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g - ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s - b3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Ig - c2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0 - IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt - ZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu - wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu - ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 - ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0 - IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv - cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt - IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw - c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt - IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LlRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l - dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7C - oFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRl - c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp - bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg - dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz - dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs - b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4NCg0KJmFtcDtuYnNwOw0KDQpU - ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0 - IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxv - cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt - IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw - c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt - IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRl - c3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rp - bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg - dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz - dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs - b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl - bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp - cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 - bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk - b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv - ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz - aXQgYW1ldC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt - ZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu - wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU - ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g - aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz - dW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxv - cmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVt - IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw - c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt - IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3Rp - bmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3Rpbmcg - dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz - dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs - b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl - bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp - cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 - bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk - b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv - ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz - aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg - YW1ldC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQu - wqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU - ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g - aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz - dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g - ZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu - ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVt - IGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlw - c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt - IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3Rpbmcg - dGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVz - dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs - b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl - bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp - cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 - bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk - b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv - ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz - aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg - YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l - dC5UZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBU - ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g - aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz - dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g - ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s - b3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu - ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 - ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0Lg0KDQpUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlw - c3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3Vt - IGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRv - bG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9y - IHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNp - dCBhbWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu - ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LlRlc3RpbmcgdGVz - dCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBs - b3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3Jl - bSBpcHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBp - cHN1bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1 - bSBkb2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBk - b2xvciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xv - ciBzaXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBz - aXQgYW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQg - YW1ldC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l - dC7CoFRlc3RpbmcgdGVzdCBsb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC5U - ZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0 - aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5n - IHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRl - c3QgbG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3Qg - bG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9y - ZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0g - aXBzdW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBz - dW0gZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0g - ZG9sb3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9s - b3Igc2l0IGFtZXQuwqBUZXN0aW5nIHRlc3QgbG9yZW0gaXBzdW0gZG9sb3Ig - c2l0IGFtZXQuVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBh - bWV0LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 - LsKgVGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKg - VGVzdGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVz - dGluZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGlu - ZyB0ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0 - ZXN0IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LsKgVGVzdGluZyB0ZXN0 - IGxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiZsdDthIGhyZWY9JnF1b3Q7 - aHR0cDovL2N0aGlzaXNhdGVzdC5maWxlcy53b3JkcHJlc3MuY29tLzIwMTMv - MDUvOHlpOWUzaS5qcGcmcXVvdDsmZ3Q7Jmx0O2ltZyBjbGFzcz0mcXVvdDth - bGlnbnJpZ2h0IHNpemUtbWVkaXVtIHdwLWltYWdlLTEyOSZxdW90OyBhbHQ9 - JnF1b3Q7OHlJOUUzSSZxdW90OyBzcmM9JnF1b3Q7aHR0cDovL2N0aGlzaXNh - dGVzdC5maWxlcy53b3JkcHJlc3MuY29tLzIwMTMvMDUvOHlpOWUzaS5qcGc/ - dz0xODYmcXVvdDsgd2lkdGg9JnF1b3Q7MTg2JnF1b3Q7IGhlaWdodD0mcXVv - dDszMDAmcXVvdDsgLyZndDsmbHQ7L2EmZ3Q7PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9taW1lX3R5cGU8L25hbWU+PHZhbHVlPjxzdHJp - bmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - Pmxpbms8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19I - T1NULzIwMTMvMDUvMjkvd29yZHByZXNzLXRlc3QvPC9zdHJpbmc+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmd1aWQ8L25hbWU+PHZhbHVl - PjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTEyODwvc3RyaW5n - PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51X29yZGVy - PC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZhbHVlPjxz - dHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT5waW5nX3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5vcGVu - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnN0 - aWNreTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5haWw8L25h - bWU+PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0PC9uYW1l - Pjx2YWx1ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1ZT48YXJy - YXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT50 - ZXJtX2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48dmFsdWU+ - PHN0cmluZz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - dW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVy - bV90YXhvbm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9ub215PC9u - YW1lPjx2YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3Ry - aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jb3VudDwv - bmFtZT48dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KPC9z - dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+PHZhbHVl - PjxhcnJheT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxu - YW1lPmlkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjM4ODwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5rZXk8L25hbWU+PHZhbHVl - PjxzdHJpbmc+amFiYmVyX3B1Ymxpc2hlZDwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0 - cmluZz4xMzY5ODU2ODQ2PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9z - dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJl - cj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVt - YmVyPjxuYW1lPnBvc3RfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTMyPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rf - dGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MjAxMyBIYWlyIENvbG9yOiBH - ZXQgdGhlIExvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNv - ODYwMT4yMDEzMDUyOVQyMzowMTozMjwvZGF0ZVRpbWUuaXNvODYwMT48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlX2dtdDwv - bmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MjlUMjM6MDE6 - MzI8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxkYXRlVGlt - ZS5pc284NjAxPjIwMTMwNTI5VDIzOjAxOjMyPC9kYXRlVGltZS5pc284NjAx - PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21vZGlm - aWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1 - MjlUMjM6MDE6MzI8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2YWx1ZT48 - c3RyaW5nPmRyYWZ0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt - YmVyPjxuYW1lPnBvc3RfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz5wb3N0 - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBv - c3RfbmFtZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+ - PHZhbHVlPjxzdHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFs - dWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X2NvbnRlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2km - Z3Q7QnkgU2FyYWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0 - OyZsdDtpJmd0OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7VG9ucyBv - ZiBnb3JnZW91cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4gZ3JhY2luZyB0 - aGUgcmVkIGNhcnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291bGQgc2F5IHRo - ZXkgYXJlIGRlZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAyMDEzIGhhaXIg - Y29sb3IgdHJlbmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMgdG8ga2VlcCBp - biBtaW5kIHdoZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRoZSBuZXcgeWVh - ciEmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJlIC0gVGhlIHJl - YWxseSBib2xkIG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRpcHMgaXMgZGVm - aW5pdGVseSBvbiB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFkaWVzIGFyZSBj - aG9vc2luZyB0byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9tIHJvb3QgdG8g - dGlwIGEgbXVjaCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhyZWY9JnF1b3Q7 - aHR0cDovL3d3dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtldXAvdGVkLWdp - YnNvbi1vbi1zcHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zlci1hbmQtdW5k - ZXJodHRwOi8vJnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQgR2lic29uJmx0 - Oy9hJmd0Oywgb3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMsIHRoZSBzdGFy - ayBvbWJyZSB0cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3QuICZxdW90O0ni - gJltIG92ZXIgb21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFyay4gVGhlcmXi - gJlzIGEgd2F5IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxvb2sgc28gdGhh - dCBpdOKAmXMgc2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBjb250cmFzdGlu - ZywgaXTigJlzIG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJvdXQgYSBzbW9v - dGhlciB0cmFuc2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBpcyAgZ3JhZHVh - bCwgeW91IGNhbiB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8gZGlkIHRoZSBj - b2xvciBpcyBhbiBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3aXRob3V0IG11 - Y2ggaW4gdGhlIHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0IHdvcmsuJnF1 - b3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBCb2xkLCBjcmVh - dGl2ZSBjb2xvciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24gdGhlIHdpbGQg - c2lkZSwgYWRkaW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVseSB0aGUgd2F5 - IHRvIGdvLiBBbmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBicmlnaHQgY29w - cGVyIC0gdHVycXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBncmVlbiBhcmUg - YWxsIHRoZSByYWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4ndCByZWFkeSB0 - byBnbyBmdWxsLW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2EgaHJlZj0mcXVv - dDtodHRwOi8vdGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAxMi8wMS9jaGFs - ay1pdC11cC9odHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRoZSB0aXBzIG9m - IHlvdXIgaGFpciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0 - O3AmZ3Q7My4gRGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIgaG90IGxvb2sg - Zm9yIFNwcmluZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9JnF1b3Q7aHR0 - cDovL3d3dy5mYXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1wZXRlci1zb20t - c3MtMTMtMjkxNDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVsaWNhdGUgcGFz - dGVscyB0aHJvdWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4gSXQncyBhIGdy - ZWF0IHdheSB0byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5leHBlY3RlZCwg - YnV0IGl0J3Mgbm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBzb21lIG9mIHRo - ZSBib2xkZXIgaHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDs0 - LiBTdW4tZmxlY2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwgd2lsbCBnb3Jn - ZW91cywganVzdC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4tZmxlY2tlZCBo - dWVzIGV2ZXIgZ28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5vdCwgbXkgZnJp - ZW5kcy4gU3VuLWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1ha2UgYW55IGRy - YWIgY29sb3IgcG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUgbW9zdCBjb21w - bGV4aW9ucy4mbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OzUuIENvb2wg - dG9uZXMgLSBPbiB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9uZXMgYXJlIG1h - a2luZyBhIGh1Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNyaXNwIGFuZCBj - bGVhbiBzaGFkZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAyMDEzLCZxdW90 - OyBDbGVtZW50cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdpbGwgYWxzbyBz - ZWUsIGZvciB0aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJzIG9mIHRoZSAg - bGlnaHRlciBzaGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhlIGFsbW9zdCB0 - b25lbGVzcyBhbmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNjb3JkaW5nIHRv - ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29tLmF1L2xpZmVz - dHlsZS9iZWF1dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEwNC0yYzd6NC5o - dG1saHR0cDovLyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0Oy9hJmd0Oy4g - T24gdGhlIG9wcG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwgYmUgc3VwZXIg - ZGFyaywgd2l0aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxhY2sgc2hhZGVz - LiBJbiBteSBvcGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBjYW4gdHJ1bHkg - cHVsbCBvZmYgdGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3MsIHRob3VnaC4m - bHQ7L3AmZ3Q7Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBsb29rcyB0byBi - ZSBhIHN1cGVyIGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZsdDsvcCZndDsm - bHQ7cCZndDtGQUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBjb2xvcnMgYXJl - IHBpY2tpbmcgdXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0IHJlYWR5IHRv - IG1ha2UgdGhlIGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0aGUgZW5kcyBv - ZiB5b3VyIGhhaXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5IGZ1biBlZmZl - Y3Qgd2l0aCBzcGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24uJmx0O2JyJmd0 - OyZsdDsvcCZndDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtw - Jmd0OyZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZs - dDsvcCZndDs8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+cG9zdF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3Ry - aW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21p - bWVfdHlwZTwvbmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVl - PjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFsdWU+ - PHN0cmluZz5odHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9MTMyPC9zdHJpbmc+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmd1aWQ8L25hbWU+ - PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NULz9wPTEzMjwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5tZW51 - X29yZGVyPC9uYW1lPjx2YWx1ZT48aW50PjA8L2ludD48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+Y29tbWVudF9zdGF0dXM8L25hbWU+PHZh - bHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5waW5nX3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmlu - Zz5vcGVuPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxu - YW1lPnN0aWNreTwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5h - aWw8L25hbWU+PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+ - PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0 - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1 - ZT48YXJyYXk+PGRhdGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48 - bmFtZT50ZXJtX2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48 - L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48 - dmFsdWU+PHN0cmluZz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxz - dHJpbmc+dW5jYXRlZ29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5h - bWU+dGVybV90YXhvbm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9z - dHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9u - b215PC9uYW1lPjx2YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92 - YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9u - YW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - MDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5j - b3VudDwvbmFtZT48dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJl - cj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+ - PHZhbHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48 - L21lbWJlcj4KPC9zdHJ1Y3Q+PC92YWx1ZT4KICA8dmFsdWU+PHN0cnVjdD4K - ICA8bWVtYmVyPjxuYW1lPnBvc3RfaWQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - MTM0PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnBvc3RfdGl0bGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MjAxMyBIYWlyIENv - bG9yOiBHZXQgdGhlIExvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRlPC9uYW1lPjx2YWx1ZT48ZGF0ZVRp - bWUuaXNvODYwMT4yMDEzMDUzMFQxMzo1MTozNDwvZGF0ZVRpbWUuaXNvODYw - MT48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9kYXRl - X2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzBU - MTM6NTE6MzQ8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnBvc3RfbW9kaWZpZWQ8L25hbWU+PHZhbHVlPjxk - YXRlVGltZS5pc284NjAxPjIwMTMwNTMwVDEzOjUxOjM1PC9kYXRlVGltZS5p - c284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X21vZGlmaWVkX2dtdDwvbmFtZT48dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+ - MjAxMzA1MzBUMTM6NTE6MzU8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3Rfc3RhdHVzPC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPnB1Ymxpc2g8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+cG9zdF90eXBlPC9uYW1lPjx2YWx1ZT48c3Ry - aW5nPnBvc3Q8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+ - PG5hbWU+cG9zdF9uYW1lPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjIwMTMtaGFp - ci1jb2xvci1nZXQtdGhlLWxvb2s8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+cG9zdF9hdXRob3I8L25hbWU+PHZhbHVlPjxz - dHJpbmc+NDY5MTc1MDg8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxt - ZW1iZXI+PG5hbWU+cG9zdF9wYXNzd29yZDwvbmFtZT48dmFsdWU+PHN0cmlu - Zz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - cG9zdF9leGNlcnB0PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2NvbnRlbnQ8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+Jmx0O3AmZ3Q7Jmx0O2kmZ3Q7QnkgU2Fy - YWggSmFtZXMmbHQ7L2kmZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OyZsdDtpJmd0 - OyZsdDsvaSZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7VG9ucyBvZiBnb3JnZW91 - cyBzaGFkZXMgb2YgaGFpciBoYXZlIGJlZW4gZ3JhY2luZyB0aGUgcmVkIGNh - cnBldHMgdGhpcyBtb250aCwgYW5kIEkgd291bGQgc2F5IHRoZXkgYXJlIGRl - ZmluaXRlbHkgaW4gbGluZSB3aXRoIHRoZSAyMDEzIGhhaXIgY29sb3IgdHJl - bmRzLiBIZXJlIGFyZSBhIGZldyBjb2xvcnMgdG8ga2VlcCBpbiBtaW5kIHdo - ZW4gZGViYXRpbmcgYSBjaGFuZ2UgZm9yIHRoZSBuZXcgeWVhciEmbHQ7L3Am - Z3Q7Jmx0O3AmZ3Q7MS4gU3VidGxlIG9tYnJlIC0gVGhlIHJlYWxseSBib2xk - IG9tYnJlIHdpdGggYmxlYWNoZWQtb3V0IHRpcHMgaXMgZGVmaW5pdGVseSBv - biB0aGUgd2F5IG91dC4gSW5zdGVhZCwgbGFkaWVzIGFyZSBjaG9vc2luZyB0 - byBrZWVwIHRoZSB0cmFuc2lzdGlvbiBmcm9tIHJvb3QgdG8gdGlwIGEgbXVj - aCBtb3JlIHN1YnRsZSBvbmUuICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3 - dy5lbGxlLmNvbS9uZXdzL2JlYXV0eS1tYWtldXAvdGVkLWdpYnNvbi1vbi1z - cHJpbmctMjAxMy10cmVuZHMtaGUtaXMtb3Zlci1hbmQtdW5kZXJodHRwOi8v - JnF1b3Q7Jmd0O0FjY29yZGluZyB0byBUZWQgR2lic29uJmx0Oy9hJmd0Oywg - b3duZXIgb2YgVGVkIEdpYnNvbiBzYWxvbnMsIHRoZSBzdGFyayBvbWJyZSB0 - cmVuZCBzaG91bGQgYmUgcHV0IHRvIHJlc3QuICZxdW90O0nigJltIG92ZXIg - b21icsOpIHdoZW4gaXTigJlzIHRvbyBzdGFyay4gVGhlcmXigJlzIGEgd2F5 - IHRvIHdlYXIgdGhlIGhhaXIgIGNvbG9yIGxvb2sgc28gdGhhdCBpdOKAmXMg - c2V4eSwgYnV0IHdoZW4gaXTigJlzIHRvbyBjb250cmFzdGluZywgaXTigJlz - IG5vdCAgcmlnaHQuIEl04oCZcyBhbGwgYWJvdXQgYSBzbW9vdGhlciB0cmFu - c2l0aW9uLiBXaGVuIHRoZSBncmFkaWVudCBpcyAgZ3JhZHVhbCwgeW91IGNh - biB0ZWxsIHRoYXQgdGhlIHBlcnNvbiB3aG8gZGlkIHRoZSBjb2xvciBpcyBh - biBleHBlcnQuICBEYXJrIHRvIGJsb25kZSB3aXRob3V0IG11Y2ggaW4gdGhl - IHdheSBvZiBldm9sdXRpb24gZG9lc27igJl0IHdvcmsuJnF1b3Q7Jmx0O2Jy - Jmd0OyZsdDsvcCZndDsmbHQ7cCZndDsyLiBCb2xkLCBjcmVhdGl2ZSBjb2xv - ciAtIElmIHlvdSBsaWtlIHRvIHdhbGsgb24gdGhlIHdpbGQgc2lkZSwgYWRk - aW5nIGJvbGQgY29sb3IgaXMgZGVmaW5pdGVseSB0aGUgd2F5IHRvIGdvLiBB - bmQgd2UncmUgbm90IHRhbGtpbmcganVzdCBicmlnaHQgY29wcGVyIC0gdHVy - cXVvaXNlLCBsYXZlbmRlciwgZW1lcmFsZCBncmVlbiBhcmUgYWxsIHRoZSBy - YWdlIHJpZ2h0IG5vdy4gSWYgeW91IGFyZW4ndCByZWFkeSB0byBnbyBmdWxs - LW9uIGNyYXp5IGNvbG9yLCB0cnkgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8v - dGhlYmVhdXR5ZGVwYXJ0bWVudC5jb20vMjAxMi8wMS9jaGFsay1pdC11cC9o - dHRwOi8vJnF1b3Q7Jmd0O2NoYWxraW5nIHRoZSB0aXBzIG9mIHlvdXIgaGFp - ciZsdDsvYSZndDshICZsdDticiZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7My4g - RGVsaWNhdGUgcGFzdGVscyAtIEFub3RoZXIgaG90IGxvb2sgZm9yIFNwcmlu - ZyAyMDEzIGlzIHVzaW5nICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5m - YXNoaW9uaXNpbmcuY29tL3J1bndheS9iLS1wZXRlci1zb20tc3MtMTMtMjkx - NDEuaHRtbGh0dHA6Ly8mcXVvdDsmZ3Q7ZGVsaWNhdGUgcGFzdGVscyB0aHJv - dWdob3V0IHRoZSBoYWlyJmx0Oy9hJmd0Oy4gSXQncyBhIGdyZWF0IHdheSB0 - byB0cnkgc29tZXRoaW5nIG5ldyBhbmQgdW5leHBlY3RlZCwgYnV0IGl0J3Mg - bm90IHNvIGluIHlvdXIgZmFjZSwgbGlrZSBzb21lIG9mIHRoZSBib2xkZXIg - aHVlcy4gJmx0O2JyJmd0OyZsdDsvcCZndDsmbHQ7cCZndDs0LiBTdW4tZmxl - Y2tlZCBjb2xvciAtIEkgYXNrIG9mIHlvdSwgd2lsbCBnb3JnZW91cywganVz - dC1iYWNrLWZyb20tdGhlLWJlYWNoLCBzdW4tZmxlY2tlZCBodWVzIGV2ZXIg - Z28gb3V0IG9mIHN0eWxlPyBJIHRoaW5rIG5vdCwgbXkgZnJpZW5kcy4gU3Vu - LWZsZWNrZWQgaGlnaGxpZ2h0cyB3aWxsIG1ha2UgYW55IGRyYWIgY29sb3Ig - cG9wLCBhbmQgcmVhbGx5IGFjY2VudHVhdGUgbW9zdCBjb21wbGV4aW9ucy4m - bHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OzUuIENvb2wgdG9uZXMgLSBP - biB0aGUgZmxpcCBzaWRlLCBjb29sZXIgdG9uZXMgYXJlIG1ha2luZyBhIGh1 - Z2UgY29tZWJhY2suICZxdW90O0Nvb2wsIGNyaXNwIGFuZCBjbGVhbiBzaGFk - ZXMgYXJlIGdvaW5nIHRvIGJlIGhvdCBpbiAyMDEzLCZxdW90OyBDbGVtZW50 - cyAgYW50aWNpcGF0ZXMuICZxdW90O1dlIHdpbGwgYWxzbyBzZWUsIGZvciB0 - aGUgbW9yZSBhZHZlbnR1cm91cyB3ZWFyZXJzIG9mIHRoZSAgbGlnaHRlciBz - aGFkZXMsIGEgcmFyZSByZXR1cm4gdG8gdGhlIGFsbW9zdCB0b25lbGVzcyBh - bmQgd2hpdGUgYmxvbmRlcywmcXVvdDsgYWNjb3JkaW5nIHRvICZsdDthIGhy - ZWY9JnF1b3Q7aHR0cDovL3d3dy5zbWguY29tLmF1L2xpZmVzdHlsZS9iZWF1 - dHkvaGFpci10cmVuZHMtMjAxMy0yMDEzMDEwNC0yYzd6NC5odG1saHR0cDov - LyZxdW90OyZndDtNYXR0IENsZW1lbnRzJmx0Oy9hJmd0Oy4gT24gdGhlIG9w - cG9zaXRlIHNwZWN0cnVtLCBkYXJrIHdpbGwgYmUgc3VwZXIgZGFyaywgd2l0 - aCBsb3RzIG9mIGlua3kgYW5kIGNvYWwgYmxhY2sgc2hhZGVzLiBJbiBteSBv - cGluaW9uLCBvbmx5IGEgY2hvc2VuIGZldyBjYW4gdHJ1bHkgcHVsbCBvZmYg - dGhvc2Ugc3VwZXIgaW50ZW5zZSBibGFja3MsIHRob3VnaC4mbHQ7L3AmZ3Q7 - Jmx0O3AmZ3Q7QWxsIGluIGFsbCwgMjAxMyBsb29rcyB0byBiZSBhIHN1cGVy - IGZ1biB5ZWFyIGZvciBoYWlyIGNvbG9yLiZsdDsvcCZndDsmbHQ7cCZndDtG - QUNFQk9PSyBUSVA6IEJvbGQsIGJyaWdodCBjb2xvcnMgYXJlIHBpY2tpbmcg - dXAgc3RlYW0sIGJ1dCBpZiB5b3UgYXJlbid0IHJlYWR5IHRvIG1ha2UgdGhl - IGNvbW1pdG1lbnQsIHRyeSBjaGFsa2luZyB0aGUgZW5kcyBvZiB5b3VyIGhh - aXIhIFlvdSBjYW4gY3JlYXRlIGEgcmVhbGx5IGZ1biBlZmZlY3Qgd2l0aCBz - cGVuZGluZyBob3VycyBhdCB0aGUgc2Fsb24uJmx0O2JyJmd0OyZsdDsvcCZn - dDsmbHQ7cCZndDsmbHQ7YnImZ3Q7Jmx0Oy9wJmd0OyZsdDtwJmd0OyZsdDti - ciZndDsmbHQ7L3AmZ3Q7Jmx0O3AmZ3Q7Jmx0O2JyJmd0OyZsdDsvcCZndDs8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9z - dF9wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X21pbWVfdHlwZTwv - bmFtZT48dmFsdWU+PHN0cmluZz48L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+bGluazwvbmFtZT48dmFsdWU+PHN0cmluZz5o - dHRwOi8vV09SRFBSRVNTX0hPU1QvMjAxMy8wNS8zMC8yMDEzLWhhaXItY29s - b3ItZ2V0LXRoZS1sb29rLzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5ndWlkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPmh0dHA6 - Ly9XT1JEUFJFU1NfSE9TVC8/cD0xMzQ8L3N0cmluZz48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+bWVudV9vcmRlcjwvbmFtZT48dmFsdWU+ - PGludD4wPC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PmNvbW1lbnRfc3RhdHVzPC9uYW1lPjx2YWx1ZT48c3RyaW5nPm9wZW48L3N0 - cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGluZ19z - dGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+b3Blbjwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5zdGlja3k8L25hbWU+PHZh - bHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnBvc3RfdGh1bWJuYWlsPC9uYW1lPjx2YWx1ZT48YXJy - YXk+PGRhdGE+CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAg - PG1lbWJlcj48bmFtZT5wb3N0X2Zvcm1hdDwvbmFtZT48dmFsdWU+PHN0cmlu - Zz5zdGFuZGFyZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJl - cj48bmFtZT50ZXJtczwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPgogIDx2 - YWx1ZT48c3RydWN0PgogIDxtZW1iZXI+PG5hbWU+dGVybV9pZDwvbmFtZT48 - dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPm5hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+VW5jYXRl - Z29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5zbHVnPC9uYW1lPjx2YWx1ZT48c3RyaW5nPnVuY2F0ZWdvcml6ZWQ8 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVy - bV9ncm91cDwvbmFtZT48dmFsdWU+PHN0cmluZz4wPC9zdHJpbmc+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRlcm1fdGF4b25vbXlfaWQ8 - L25hbWU+PHZhbHVlPjxzdHJpbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT50YXhvbm9teTwvbmFtZT48dmFsdWU+PHN0 - cmluZz5jYXRlZ29yeTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT5kZXNjcmlwdGlvbjwvbmFtZT48dmFsdWU+PHN0cmluZz48 - L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cGFy - ZW50PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwv - bWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+Y291bnQ8L25hbWU+PHZhbHVlPjxp - bnQ+NDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ - CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5jdXN0b21fZmllbGRzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGE+ - CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5pZDwvbmFtZT48 - dmFsdWU+PHN0cmluZz4zOTY8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgog - IDxtZW1iZXI+PG5hbWU+a2V5PC9uYW1lPjx2YWx1ZT48c3RyaW5nPmphYmJl - cl9wdWJsaXNoZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+dmFsdWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+MTM2OTkyMTg5 - Nzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0PjwvdmFsdWU+ - CjwvZGF0YT48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+Cjwvc3RydWN0Pjwv - dmFsdWU+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X2lkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjEzNzwvc3RyaW5nPjwvdmFsdWU+ - PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3RpdGxlPC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPk5ldyB0aXRsZTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i - ZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2RhdGU8L25hbWU+PHZhbHVlPjxk - YXRlVGltZS5pc284NjAxPjIwMTMwNTMxVDEzOjI2OjM1PC9kYXRlVGltZS5p - c284NjAxPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X2RhdGVfZ210PC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4yMDEz - MDUzMVQxMzoyNjozNTwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9tb2RpZmllZDwvbmFtZT48dmFs - dWU+PGRhdGVUaW1lLmlzbzg2MDE+MjAxMzA1MzFUMTg6Mzk6NTg8L2RhdGVU - aW1lLmlzbzg2MDE+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1l - PnBvc3RfbW9kaWZpZWRfZ210PC9uYW1lPjx2YWx1ZT48ZGF0ZVRpbWUuaXNv - ODYwMT4yMDEzMDUzMVQxODozOTo1ODwvZGF0ZVRpbWUuaXNvODYwMT48L3Zh - bHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF9zdGF0dXM8L25h - bWU+PHZhbHVlPjxzdHJpbmc+cHVibGlzaDwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X3R5cGU8L25hbWU+PHZhbHVl - PjxzdHJpbmc+cG9zdDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1l - bWJlcj48bmFtZT5wb3N0X25hbWU8L25hbWU+PHZhbHVlPjxzdHJpbmc+YXQt - bGFzdDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt - ZT5wb3N0X2F1dGhvcjwvbmFtZT48dmFsdWU+PHN0cmluZz40NjkxNzUwODwv - c3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0 - X3Bhc3N3b3JkPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjwvc3RyaW5nPjwvdmFs - dWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5wb3N0X2V4Y2VycHQ8L25h - bWU+PHZhbHVlPjxzdHJpbmc+PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnBvc3RfY29udGVudDwvbmFtZT48dmFsdWU+PHN0 - cmluZz5IZXkgdGhpcyBpcyBjb250ZW50PC9zdHJpbmc+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfcGFyZW50PC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPjA8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1i - ZXI+PG5hbWU+cG9zdF9taW1lX3R5cGU8L25hbWU+PHZhbHVlPjxzdHJpbmc+ - PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPmxp - bms8L25hbWU+PHZhbHVlPjxzdHJpbmc+aHR0cDovL1dPUkRQUkVTU19IT1NU - LzIwMTMvMDUvMzEvYXQtbGFzdC88L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVy - PgogIDxtZW1iZXI+PG5hbWU+Z3VpZDwvbmFtZT48dmFsdWU+PHN0cmluZz5o - dHRwOi8vV09SRFBSRVNTX0hPU1QvP3A9MTM3PC9zdHJpbmc+PC92YWx1ZT48 - L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPm1lbnVfb3JkZXI8L25hbWU+PHZh - bHVlPjxpbnQ+MDwvaW50PjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5jb21tZW50X3N0YXR1czwvbmFtZT48dmFsdWU+PHN0cmluZz5jbG9z - ZWQ8L3N0cmluZz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+ - cGluZ19zdGF0dXM8L25hbWU+PHZhbHVlPjxzdHJpbmc+Y2xvc2VkPC9zdHJp - bmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnN0aWNreTwv - bmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVhbj48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+cG9zdF90aHVtYm5haWw8L25hbWU+PHZh - bHVlPjxhcnJheT48ZGF0YT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21l - bWJlcj4KICA8bWVtYmVyPjxuYW1lPnBvc3RfZm9ybWF0PC9uYW1lPjx2YWx1 - ZT48c3RyaW5nPnN0YW5kYXJkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4K - ICA8bWVtYmVyPjxuYW1lPnRlcm1zPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRh - dGE+CiAgPHZhbHVlPjxzdHJ1Y3Q+CiAgPG1lbWJlcj48bmFtZT50ZXJtX2lk - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjE8L3N0cmluZz48L3ZhbHVlPjwvbWVt - YmVyPgogIDxtZW1iZXI+PG5hbWU+bmFtZTwvbmFtZT48dmFsdWU+PHN0cmlu - Zz5VbmNhdGVnb3JpemVkPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPnNsdWc8L25hbWU+PHZhbHVlPjxzdHJpbmc+dW5jYXRl - Z29yaXplZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT50ZXJtX2dyb3VwPC9uYW1lPjx2YWx1ZT48c3RyaW5nPjA8L3N0cmlu - Zz48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dGVybV90YXhv - bm9teV9pZDwvbmFtZT48dmFsdWU+PHN0cmluZz4xPC9zdHJpbmc+PC92YWx1 - ZT48L21lbWJlcj4KICA8bWVtYmVyPjxuYW1lPnRheG9ub215PC9uYW1lPjx2 - YWx1ZT48c3RyaW5nPmNhdGVnb3J5PC9zdHJpbmc+PC92YWx1ZT48L21lbWJl - cj4KICA8bWVtYmVyPjxuYW1lPmRlc2NyaXB0aW9uPC9uYW1lPjx2YWx1ZT48 - c3RyaW5nPjwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48 - bmFtZT5wYXJlbnQ8L25hbWU+PHZhbHVlPjxzdHJpbmc+MDwvc3RyaW5nPjwv - dmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5jb3VudDwvbmFtZT48 - dmFsdWU+PGludD40PC9pbnQ+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ - PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj4KICA8 - bWVtYmVyPjxuYW1lPmN1c3RvbV9maWVsZHM8L25hbWU+PHZhbHVlPjxhcnJh - eT48ZGF0YT4KICA8dmFsdWU+PHN0cnVjdD4KICA8bWVtYmVyPjxuYW1lPmlk - PC9uYW1lPjx2YWx1ZT48c3RyaW5nPjQwMzwvc3RyaW5nPjwvdmFsdWU+PC9t - ZW1iZXI+CiAgPG1lbWJlcj48bmFtZT5rZXk8L25hbWU+PHZhbHVlPjxzdHJp - bmc+amFiYmVyX3B1Ymxpc2hlZDwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+ - CiAgPG1lbWJlcj48bmFtZT52YWx1ZTwvbmFtZT48dmFsdWU+PHN0cmluZz4x - MzcwMDIxMTk1PC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KPC9zdHJ1Y3Q+ - PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj4KPC9z - dHJ1Y3Q+PC92YWx1ZT4KPC9kYXRhPjwvYXJyYXk+CiAgICAgIDwvdmFsdWU+ - CiAgICA8L3BhcmFtPgogIDwvcGFyYW1zPgo8L21ldGhvZFJlc3BvbnNlPgo= + encoding: UTF-8 + string: | + + + + + + + + post_id1 + post_titleHello world! + post_date20140202T16:53:06 + post_date_gmt20140202T16:53:06 + post_modified20140202T16:53:06 + post_modified_gmt20140202T16:53:06 + post_statuspublish + post_typepost + post_namehello-world + post_author1 + post_password + post_excerpt + post_contentWelcome to WordPress. This is your first post. Edit or delete it, then start blogging! + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=1 + guidhttp:///wordpress3dot7noauth/?p=1 + menu_order0 + comment_statusopen + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + post_id5 + post_title5 Ways to Know You're Cool + post_date20140202T17:03:24 + post_date_gmt20140202T17:03:24 + post_modified20140202T17:03:24 + post_modified_gmt20140202T17:03:24 + post_statusdraft + post_typepost + post_name + post_author1 + post_password + post_excerpt + post_contentI don't always write tests, but when I do, I use RSpec. + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=5 + guidhttp:///wordpress3dot7noauth/?p=5 + menu_order0 + comment_statusclosed + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + post_id8 + post_title5 Ways to Know You're Cool + post_date20140208T19:30:47 + post_date_gmt20140208T19:30:47 + post_modified20140208T19:30:47 + post_modified_gmt20140208T19:30:47 + post_statusdraft + post_typepost + post_name + post_author1 + post_password + post_excerpt + post_contentI don't always write tests, but when I do, I use RSpec. + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=8 + guidhttp:///wordpress3dot7noauth/?p=8 + menu_order0 + comment_statusclosed + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + post_id11 + post_title5 Ways to Know You're Cool + post_date20140208T19:43:25 + post_date_gmt20140208T19:43:25 + post_modified20140208T19:43:25 + post_modified_gmt20140208T19:43:25 + post_statusdraft + post_typepost + post_name + post_author1 + post_password + post_excerpt + post_contentI don't always write tests, but when I do, I use RSpec. + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=11 + guidhttp:///wordpress3dot7noauth/?p=11 + menu_order0 + comment_statusclosed + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + post_id40 + post_title5 Ways to Know You're Cool + post_date20140208T23:06:43 + post_date_gmt20140208T23:06:43 + post_modified20140208T23:06:43 + post_modified_gmt20140208T23:06:43 + post_statusdraft + post_typepost + post_name + post_author1 + post_password + post_excerpt + post_contentI don't always write tests, but when I do, I use RSpec. + post_parent0 + post_mime_type + linkhttp:///wordpress3dot7noauth/?p=40 + guidhttp:///wordpress3dot7noauth/?p=40 + menu_order0 + comment_statusclosed + ping_statusopen + sticky0 + post_thumbnail + + post_formatstandard + terms + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + custom_fields + + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:05:41 GMT + recorded_at: Sat, 08 Feb 2014 23:06:45 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getProfile.yml b/spec/cassettes/getProfile.yml index 36aed68..b42a89d 100644 --- a/spec/cassettes/getProfile.yml +++ b/spec/cassettes/getProfile.yml @@ -2,46 +2,58 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getProfile0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getProfile0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '313' + - '300' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:44:54 GMT + - Sat, 08 Feb 2014 23:07:03 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close + Content-Length: + - '249' + Vary: + - User-Agent,Accept-Encoding Content-Type: - text/xml; charset=UTF-8 - Content-Length: - - '256' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n user_id46917508\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + user_id1 + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:44:54 GMT + recorded_at: Sat, 08 Feb 2014 23:07:03 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTaxonomies.yml b/spec/cassettes/getTaxonomies.yml index 4a15439..9331768 100644 --- a/spec/cassettes/getTaxonomies.yml +++ b/spec/cassettes/getTaxonomies.yml @@ -2,134 +2,168 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getTaxonomies0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getTaxonomies0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '279' + - '266' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:22:25 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:57 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '8329' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n namecategory\n - \ labelCategories\n - \ hierarchical1\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ labels\n nameCategories\n - \ singular_nameCategory\n - \ search_itemsSearch Categories\n - \ popular_items\n - \ all_itemsAll Categories\n - \ parent_itemParent Category\n - \ parent_item_colonParent Category:\n - \ edit_itemEdit Category\n - \ view_itemView Category\n - \ update_itemUpdate Category\n - \ add_new_itemAdd New Category\n - \ new_item_nameNew Category Name\n - \ separate_items_with_commas\n - \ add_or_remove_items\n - \ choose_from_most_used\n - \ not_found\n - \ menu_nameCategories\n - \ name_admin_barcategory\n\n - \ cap\n manage_termsmanage_categories\n - \ edit_termsmanage_categories\n - \ delete_termsmanage_categories\n - \ assign_termsedit_posts\n\n - \ object_type\n post\n\n\n - \ \n namepost_tag\n - \ labelTags\n - \ hierarchical0\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ labels\n nameTags\n - \ singular_nameTag\n - \ search_itemsSearch Tags\n - \ popular_itemsPopular Tags\n - \ all_itemsAll Tags\n - \ parent_item\n - \ parent_item_colon\n - \ edit_itemEdit Tag\n - \ view_itemView Tag\n - \ update_itemUpdate Tag\n - \ add_new_itemAdd New Tag\n - \ new_item_nameNew Tag Name\n - \ separate_items_with_commasSeparate tags - with commas\n add_or_remove_itemsAdd - or remove tags\n choose_from_most_usedChoose - from the most used tags\n not_foundNo - tags found.\n menu_nameTags\n - \ name_admin_barpost_tag\n\n - \ cap\n manage_termsmanage_categories\n - \ edit_termsmanage_categories\n - \ delete_termsmanage_categories\n - \ assign_termsedit_posts\n\n - \ object_type\n post\n\n\n - \ \n namepost_format\n - \ labelFormat\n - \ hierarchical0\n - \ public1\n - \ show_ui0\n - \ _builtin1\n - \ labels\n nameFormat\n - \ singular_nameFormat\n - \ search_itemsSearch Tags\n - \ popular_itemsPopular Tags\n - \ all_itemsFormat\n - \ parent_item\n - \ parent_item_colon\n - \ edit_itemEdit Tag\n - \ view_itemView Tag\n - \ update_itemUpdate Tag\n - \ add_new_itemAdd New Tag\n - \ new_item_nameNew Tag Name\n - \ separate_items_with_commasSeparate tags - with commas\n add_or_remove_itemsAdd - or remove tags\n choose_from_most_usedChoose - from the most used tags\n not_foundNo - tags found.\n menu_nameFormat\n - \ name_admin_barFormat\n\n - \ cap\n manage_termsmanage_categories\n - \ edit_termsmanage_categories\n - \ delete_termsmanage_categories\n - \ assign_termsedit_posts\n\n - \ object_type\n post\n\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + namecategory + labelCategories + hierarchical1 + public1 + show_ui1 + _builtin1 + labels + nameCategories + singular_nameCategory + search_itemsSearch Categories + popular_items + all_itemsAll Categories + parent_itemParent Category + parent_item_colonParent Category: + edit_itemEdit Category + view_itemView Category + update_itemUpdate Category + add_new_itemAdd New Category + new_item_nameNew Category Name + separate_items_with_commas + add_or_remove_items + choose_from_most_used + not_found + menu_nameCategories + name__barcategory + + cap + manage_termsmanage_categories + edit_termsmanage_categories + delete_termsmanage_categories + assign_termsedit_posts + + object_type + post + + + + namepost_tag + labelTags + hierarchical0 + public1 + show_ui1 + _builtin1 + labels + nameTags + singular_nameTag + search_itemsSearch Tags + popular_itemsPopular Tags + all_itemsAll Tags + parent_item + parent_item_colon + edit_itemEdit Tag + view_itemView Tag + update_itemUpdate Tag + add_new_itemAdd New Tag + new_item_nameNew Tag Name + separate_items_with_commasSeparate tags with commas + add_or_remove_itemsAdd or remove tags + choose_from_most_usedChoose from the most used tags + not_foundNo tags found. + menu_nameTags + name__barpost_tag + + cap + manage_termsmanage_categories + edit_termsmanage_categories + delete_termsmanage_categories + assign_termsedit_posts + + object_type + post + + + + namepost_format + labelFormat + hierarchical0 + public1 + show_ui0 + _builtin1 + labels + nameFormat + singular_nameFormat + search_itemsSearch Tags + popular_itemsPopular Tags + all_itemsFormat + parent_item + parent_item_colon + edit_itemEdit Tag + view_itemView Tag + update_itemUpdate Tag + add_new_itemAdd New Tag + new_item_nameNew Tag Name + separate_items_with_commasSeparate tags with commas + add_or_remove_itemsAdd or remove tags + choose_from_most_usedChoose from the most used tags + not_foundNo tags found. + menu_nameFormat + name__barFormat + + cap + manage_termsmanage_categories + edit_termsmanage_categories + delete_termsmanage_categories + assign_termsedit_posts + + object_type + post + + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:22:25 GMT + recorded_at: Sat, 08 Feb 2014 23:06:57 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTaxonomy.yml b/spec/cassettes/getTaxonomy.yml index c238ad8..fb645fa 100644 --- a/spec/cassettes/getTaxonomy.yml +++ b/spec/cassettes/getTaxonomy.yml @@ -2,76 +2,92 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getTaxonomy0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory - -' + encoding: UTF-8 + string: | + wp.getTaxonomy0gxB06s8Zcategory headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '317' + - '304' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:23:07 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:54 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '2846' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n namecategory\n - \ labelCategories\n - \ hierarchical1\n - \ public1\n - \ show_ui1\n - \ _builtin1\n - \ labels\n nameCategories\n - \ singular_nameCategory\n - \ search_itemsSearch Categories\n - \ popular_items\n - \ all_itemsAll Categories\n - \ parent_itemParent Category\n - \ parent_item_colonParent Category:\n - \ edit_itemEdit Category\n - \ view_itemView Category\n - \ update_itemUpdate Category\n - \ add_new_itemAdd New Category\n - \ new_item_nameNew Category Name\n - \ separate_items_with_commas\n - \ add_or_remove_items\n - \ choose_from_most_used\n - \ not_found\n - \ menu_nameCategories\n - \ name_admin_barcategory\n\n - \ cap\n manage_termsmanage_categories\n - \ edit_termsmanage_categories\n - \ delete_termsmanage_categories\n - \ assign_termsedit_posts\n\n - \ object_type\n post\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + namecategory + labelCategories + hierarchical1 + public1 + show_ui1 + _builtin1 + labels + nameCategories + singular_nameCategory + search_itemsSearch Categories + popular_items + all_itemsAll Categories + parent_itemParent Category + parent_item_colonParent Category: + edit_itemEdit Category + view_itemView Category + update_itemUpdate Category + add_new_itemAdd New Category + new_item_nameNew Category Name + separate_items_with_commas + add_or_remove_items + choose_from_most_used + not_found + menu_nameCategories + name__barcategory + + cap + manage_termsmanage_categories + edit_termsmanage_categories + delete_termsmanage_categories + assign_termsedit_posts + + object_type + post + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:23:07 GMT + recorded_at: Sat, 08 Feb 2014 23:06:55 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTerm.yml b/spec/cassettes/getTerm.yml index b0fbf6f..fba7a10 100644 --- a/spec/cassettes/getTerm.yml +++ b/spec/cassettes/getTerm.yml @@ -2,56 +2,66 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory1 - -' + encoding: UTF-8 + string: | + wp.getTerm0gxB06s8Zcategory1 headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '338' + - '325' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:27:17 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:58 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '865' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n term_id1\n - \ nameUncategorized\n - \ sluguncategorized\n - \ term_group0\n - \ term_taxonomy_id1\n - \ taxonomycategory\n - \ description\n - \ parent0\n - \ count2\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:27:17 GMT + recorded_at: Sat, 08 Feb 2014 23:06:58 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getTerms.yml b/spec/cassettes/getTerms.yml index 8763408..9f70a95 100644 --- a/spec/cassettes/getTerms.yml +++ b/spec/cassettes/getTerms.yml @@ -2,74 +2,79 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getTerms0WORDPRESS_USERNAMEWORDPRESS_PASSWORDcategory - -' + encoding: UTF-8 + string: | + wp.getTerms0gxB06s8Zcategory headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '338' + - '325' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:27:36 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '2345' + - Sat, 08 Feb 2014 23:06:59 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '1629' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n term_id490\n - \ nameAnimals\n - \ sluganimals\n - \ term_group0\n - \ term_taxonomy_id3\n - \ taxonomycategory\n - \ description\n - \ parent0\n - \ count0\n\n - \ \n term_id1\n - \ nameUncategorized\n - \ sluguncategorized\n - \ term_group0\n - \ term_taxonomy_id1\n - \ taxonomycategory\n - \ description\n - \ parent0\n - \ count2\n\n - \ \n term_id576440\n - \ nameZebras\n - \ slugzebras\n - \ term_group0\n - \ term_taxonomy_id4\n - \ taxonomycategory\n - \ description\n - \ parent490\n - \ count0\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + term_id12 + nameGeraffes + sluggeraffes + term_group0 + term_taxonomy_id12 + taxonomycategory + description + parent0 + count0 + + + term_id1 + nameUncategorized + sluguncategorized + term_group0 + term_taxonomy_id1 + taxonomycategory + description + parent0 + count1 + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:27:36 GMT + recorded_at: Sat, 08 Feb 2014 23:06:59 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getUsers.yml b/spec/cassettes/getUsers.yml index 953e8c6..2d1fe3c 100644 --- a/spec/cassettes/getUsers.yml +++ b/spec/cassettes/getUsers.yml @@ -2,58 +2,73 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getUsers0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getUsers0gxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '298' + - '285' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:43:58 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '1283' + - Sat, 08 Feb 2014 23:07:02 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '1237' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n user_id46917508\n - \ usernamecontently\n - \ first_name\n - \ last_name\n - \ registered20130305T15:25:34\n - \ bio\n emailWORDPRESS_USERNAME\n - \ nicknamecontently\n - \ nicenamecontently\n - \ urlhttp://WORDPRESS_HOST\n - \ display_namecontently\n - \ roles\n administrator\n\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + user_id1 + username + first_nameJohnson + last_name + registered20140202T16:53:06 + bio + emailzachfeldman@gmail.com + nickname + nicename + url + display_name + roles + istrator + + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:43:58 GMT + recorded_at: Sat, 08 Feb 2014 23:07:02 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/getUsersBlogs.json b/spec/cassettes/getUsersBlogs.json new file mode 100644 index 0000000..d116887 --- /dev/null +++ b/spec/cassettes/getUsersBlogs.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"post","uri":"http://","body":{"encoding":"UTF-8","base64_string":"PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxtZXRob2RDYWxsPjxtZXRob2ROYW1l\nPndwLmdldFVzZXJzQmxvZ3M8L21ldGhvZE5hbWU+PHBhcmFtcz48cGFyYW0+\nPHZhbHVlPjxzdHJpbmc+PFdPUkRQUkVTU19VU0VSTkFNRT48L3N0cmluZz48\nL3ZhbHVlPjwvcGFyYW0+PHBhcmFtPjx2YWx1ZT48c3RyaW5nPmd4QjA2czha\nPC9zdHJpbmc+PC92YWx1ZT48L3BhcmFtPjwvcGFyYW1zPjwvbWV0aG9kQ2Fs\nbD4K\n"},"headers":{"User-Agent":["XMLRPC::Client (Ruby 2.0.0)"],"Content-Type":["text/xml; charset=utf-8"],"Content-Length":["213"],"Connection":["keep-alive"],"Accept-Encoding":["identity"],"Accept":["*/*"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Date":["Wed, 12 Feb 2014 03:53:17 GMT"],"Server":["Apache/2.2.22"],"X-Powered-By":["PHP/5.3.27"],"Connection":["close"],"Content-Length":["707"],"Vary":["User-Agent,Accept-Encoding"],"Content-Type":["text/xml; charset=UTF-8"]},"body":{"encoding":"UTF-8","base64_string":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1ldGhv\nZFJlc3BvbnNlPgogIDxwYXJhbXM+CiAgICA8cGFyYW0+CiAgICAgIDx2YWx1\nZT4KICAgICAgPGFycmF5PjxkYXRhPgogIDx2YWx1ZT48c3RydWN0PgogIDxt\nZW1iZXI+PG5hbWU+aXNBZG1pbjwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MTwv\nYm9vbGVhbj48L3ZhbHVlPjwvbWVtYmVyPgogIDxtZW1iZXI+PG5hbWU+dXJs\nPC9uYW1lPjx2YWx1ZT48c3RyaW5nPmh0dHA6Ly88V09SRFBSRVNTX0hPU1Q+\nL3dvcmRwcmVzczNkb3Q3bm9hdXRoLzwvc3RyaW5nPjwvdmFsdWU+PC9tZW1i\nZXI+CiAgPG1lbWJlcj48bmFtZT5ibG9naWQ8L25hbWU+PHZhbHVlPjxzdHJp\nbmc+MTwvc3RyaW5nPjwvdmFsdWU+PC9tZW1iZXI+CiAgPG1lbWJlcj48bmFt\nZT5ibG9nTmFtZTwvbmFtZT48dmFsdWU+PHN0cmluZz5Xb3JkcHJlc3MgMyBE\nb3QgNyBObyBBdXRoPC9zdHJpbmc+PC92YWx1ZT48L21lbWJlcj4KICA8bWVt\nYmVyPjxuYW1lPnhtbHJwYzwvbmFtZT48dmFsdWU+PHN0cmluZz5odHRwOi8v\nPFdPUkRQUkVTU19IT1NUPjxXT1JEUFJFU1NfUEFUSD48L3N0cmluZz48L3Zh\nbHVlPjwvbWVtYmVyPgo8L3N0cnVjdD48L3ZhbHVlPgo8L2RhdGE+PC9hcnJh\neT4KICAgICAgPC92YWx1ZT4KICAgIDwvcGFyYW0+CiAgPC9wYXJhbXM+Cjwv\nbWV0aG9kUmVzcG9uc2U+Cg==\n"},"http_version":null},"recorded_at":"Wed, 12 Feb 2014 03:53:18 GMT"}],"recorded_with":"VCR 2.5.0"} \ No newline at end of file diff --git a/spec/cassettes/getUsersBlogs.yml b/spec/cassettes/getUsersBlogs.yml index e7f9412..f384675 100644 --- a/spec/cassettes/getUsersBlogs.yml +++ b/spec/cassettes/getUsersBlogs.yml @@ -2,52 +2,64 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.getUsersBlogsWORDPRESS_USERNAMEWORDPRESS_PASSWORD - -' + encoding: UTF-8 + string: | + wp.getUsersBlogsgxB06s8Z headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '226' + - '213' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:43:12 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '680' + - Wed, 12 Feb 2014 03:52:16 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '707' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n \n isAdmin1\n - \ urlhttp://WORDPRESS_HOST/\n - \ blogid47989391\n - \ blogNamecthisisatest\n - \ xmlrpchttps://WORDPRESS_HOST/xmlrpc.php\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + + isAdmin1 + urlhttp:///wordpress3dot7noauth/ + blogid1 + blogNameWordpress 3 Dot 7 No Auth + xmlrpchttp:// + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:43:12 GMT + recorded_at: Wed, 12 Feb 2014 03:52:17 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/httpAuthInvalid.yml b/spec/cassettes/httpAuthInvalid.yml index 70999d7..c23e507 100644 --- a/spec/cassettes/httpAuthInvalid.yml +++ b/spec/cassettes/httpAuthInvalid.yml @@ -2,18 +2,18 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HTTP_USER:WORDPRESS_HTTP_PASSWORD@WORDPRESS_HOST/xmlrpc.php + uri: http://:wrongpass@ body: encoding: UTF-8 string: | - wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + wp.getOptions0 headers: User-Agent: - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '304' + - '300' Connection: - keep-alive Accept-Encoding: @@ -26,17 +26,17 @@ http_interactions: message: Authorization Required headers: Date: - - Wed, 29 Jan 2014 13:10:25 GMT + - Sat, 08 Feb 2014 23:06:36 GMT Server: - - Apache/2.2.16 (Debian) + - Apache/2.2.22 Www-Authenticate: - - Basic realm="Demo WP" + - Basic realm="protected area" Vary: - Accept-Encoding Content-Length: - - '484' + - '474' Keep-Alive: - - timeout=1, max=50 + - timeout=5, max=100 Connection: - Keep-Alive Content-Type: @@ -56,8 +56,8 @@ http_interactions: browser doesn't understand how to supply the credentials required.


-
Apache/2.2.16 (Debian) Server at WORDPRESS_HOST Port 80
+
Apache/2.2.22 Server at Port 80
- http_version: - recorded_at: Wed, 29 Jan 2014 13:10:24 GMT + http_version: + recorded_at: Sat, 08 Feb 2014 23:06:36 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/httpAuthNone.yml b/spec/cassettes/httpAuthNone.yml deleted file mode 100644 index 11b2304..0000000 --- a/spec/cassettes/httpAuthNone.yml +++ /dev/null @@ -1,63 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: http://WORDPRESS_HOST/xmlrpc.php - body: - encoding: UTF-8 - string: | - wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD - headers: - User-Agent: - - XMLRPC::Client (Ruby 2.0.0) - Content-Type: - - text/xml; charset=utf-8 - Content-Length: - - '304' - Connection: - - keep-alive - Accept-Encoding: - - identity - Accept: - - '*/*' - response: - status: - code: 401 - message: Authorization Required - headers: - Date: - - Wed, 29 Jan 2014 12:37:14 GMT - Server: - - Apache/2.2.16 (Debian) - Www-Authenticate: - - Basic realm="Demo WP" - Vary: - - Accept-Encoding - Content-Length: - - '484' - Keep-Alive: - - timeout=1, max=50 - Connection: - - Keep-Alive - Content-Type: - - text/html; charset=iso-8859-1 - body: - encoding: UTF-8 - string: | - - - 401 Authorization Required - -

Authorization Required

-

This server could not verify that you - are authorized to access the document - requested. Either you supplied the wrong - credentials (e.g., bad password), or your - browser doesn't understand how to supply - the credentials required.

-
-
Apache/2.2.16 (Debian) Server at WORDPRESS_HOST Port 80
- - http_version: - recorded_at: Wed, 29 Jan 2014 12:37:13 GMT -recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/httpAuthValid.yml b/spec/cassettes/httpAuthValid.yml index ec979f8..4c0ad99 100644 --- a/spec/cassettes/httpAuthValid.yml +++ b/spec/cassettes/httpAuthValid.yml @@ -2,18 +2,18 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HTTP_USER:WORDPRESS_HTTP_PASSWORD@WORDPRESS_HOST/xmlrpc.php + uri: http://:@ body: encoding: UTF-8 string: | - wp.getOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORD + wp.getOptions0 headers: User-Agent: - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '304' + - '300' Connection: - keep-alive Accept-Encoding: @@ -26,17 +26,17 @@ http_interactions: message: OK headers: Date: - - Wed, 29 Jan 2014 13:24:23 GMT + - Sat, 08 Feb 2014 23:06:34 GMT Server: - - Apache/2.2.16 (Debian) + - Apache/2.2.22 X-Powered-By: - - PHP/5.3.3-7+squeeze14 + - PHP/5.3.27 Connection: - close Content-Length: - - '8203' + - '8987' Vary: - - Accept-Encoding + - User-Agent,Accept-Encoding Content-Type: - text/xml; charset=UTF-8 body: @@ -56,17 +56,27 @@ http_interactions: software_version descSoftware Version readonly1 - value3.5.1 + value3.7.1 blog_url - descSite URL + descWordPress Address (URL) readonly1 - valuehttp://WORDPRESS_HOST + valuehttp:///wordpress3dot7 home_url - descHome URL + descSite Address (URL) readonly1 - valuehttp://WORDPRESS_HOST + valuehttp:///wordpress3dot7 + + login_url + descLogin Address (URL) + readonly1 + valuehttp:///wordpress3dot7/wp-login.php + + _url + descThe URL to the area + readonly1 + valuehttp:///wordpress3dot7/wp-/ image_default_link_type descImage default link type @@ -86,12 +96,12 @@ http_interactions: template descTemplate readonly1 - valuetwentyeleven + valuetwentythirteen stylesheet descStylesheet readonly1 - valuetwentyeleven + valuetwentythirteen post_thumbnail descPost Thumbnail @@ -106,12 +116,12 @@ http_interactions: blog_title descSite Title readonly0 - valueDemo WP + valueWordpress 3 Dot 7 blog_tagline descSite Tagline readonly0 - valueJust another WordPress site + valueThis is a great tagline date_format descDate Format @@ -126,7 +136,7 @@ http_interactions: users_can_register descAllow new users to sign up readonly0 - value0 + value0 thumbnail_size_w descThumbnail Width @@ -178,6 +188,6 @@ http_interactions: - http_version: - recorded_at: Wed, 29 Jan 2014 13:24:23 GMT + http_version: + recorded_at: Sat, 08 Feb 2014 23:06:36 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/newComment.yml b/spec/cassettes/newComment.yml index 1da9362..77f5f11 100644 --- a/spec/cassettes/newComment.yml +++ b/spec/cassettes/newComment.yml @@ -2,48 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.newComment0WORDPRESS_USERNAMEWORDPRESS_PASSWORD134comment_parentcontentThis - is a test thing here.authorJohn - Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov - -' + encoding: UTF-8 + string: | + wp.newComment0gxB06s8Z1comment_parentcontentThis is a test thing here.authorJohn Adamsauthor_urlhttp://johnadamsforpresidentnow.comauthor_emailjohnadams@whitehouse.gov headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '789' + - '774' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 20:47:54 GMT + - Sat, 08 Feb 2014 23:06:22 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close + Content-Length: + - '171' + Vary: + - User-Agent,Accept-Encoding Content-Type: - text/xml; charset=UTF-8 - Content-Length: - - '170' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 3\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 13 + + + + http_version: - recorded_at: Tue, 04 Jun 2013 20:47:54 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:25 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/newPost.yml b/spec/cassettes/newPost.yml index edb5875..3a74e67 100644 --- a/spec/cassettes/newPost.yml +++ b/spec/cassettes/newPost.yml @@ -2,48 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.newPost0WORDPRESS_USERNAMEWORDPRESS_PASSWORDpost_typepostpost_statusdraftpost_title5 - Ways to Know You''re Coolpost_contentI - don''t always write tests, but when I do, I use RSpec. - -' + encoding: UTF-8 + string: | + wp.newPost0gxB06s8Zpost_typepostpost_statusdraftpost_title5 Ways to Know You're Coolpost_contentI don't always write tests, but when I do, I use RSpec. headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '685' + - '672' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:10:17 GMT + - Sat, 08 Feb 2014 23:06:43 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close + Content-Length: + - '177' + Vary: + - User-Agent,Accept-Encoding Content-Type: - text/xml; charset=UTF-8 - Content-Length: - - '178' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 147\n \n \n - \ \n\n" + encoding: UTF-8 + string: | + + + + + + 40 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:10:17 GMT + recorded_at: Sat, 08 Feb 2014 23:06:43 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/newTerm.yml b/spec/cassettes/newTerm.yml index 697a454..94e641d 100644 --- a/spec/cassettes/newTerm.yml +++ b/spec/cassettes/newTerm.yml @@ -2,46 +2,56 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.newTerm0WORDPRESS_USERNAMEWORDPRESS_PASSWORDnameGeraffestaxonomycategory - -' + encoding: UTF-8 + string: | + wp.newTerm0gxB06s8ZnameGeraffestaxonomycategory headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '457' + - '444' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 15:29:21 GMT + - Sat, 08 Feb 2014 23:06:53 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close + Content-Length: + - '177' + Vary: + - User-Agent,Accept-Encoding Content-Type: - text/xml; charset=UTF-8 - Content-Length: - - '184' - Connection: - - keep-alive - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n 173470052\n \n - \ \n \n\n" + encoding: UTF-8 + string: | + + + + + + 12 + + + + http_version: - recorded_at: Wed, 05 Jun 2013 15:29:21 GMT + recorded_at: Sat, 08 Feb 2014 23:06:54 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/setOptions.yml b/spec/cassettes/setOptions.yml index f2ead6c..3c5a0f0 100644 --- a/spec/cassettes/setOptions.yml +++ b/spec/cassettes/setOptions.yml @@ -2,52 +2,62 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.setOptions0WORDPRESS_USERNAMEWORDPRESS_PASSWORDblog_taglineThis - is a great tagline - -' + encoding: UTF-8 + string: | + wp.setOptions0gxB06s8Zblog_taglineThis is a great tagline headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '405' + - '392' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Wed, 05 Jun 2013 14:49:57 GMT - Content-Type: - - text/xml; charset=UTF-8 + - Sat, 08 Feb 2014 23:06:41 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close Content-Length: - '504' - Connection: - - keep-alive Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n blog_tagline\n - \ descSite Tagline\n - \ readonly0\n - \ valueThis is a great tagline\n\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + blog_tagline + descSite Tagline + readonly0 + valueThis is a great tagline + + + + + + http_version: - recorded_at: Wed, 05 Jun 2013 14:49:57 GMT + recorded_at: Sat, 08 Feb 2014 23:06:42 GMT recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/uploadFile.yml b/spec/cassettes/uploadFile.yml index 015e74a..f0121cf 100644 --- a/spec/cassettes/uploadFile.yml +++ b/spec/cassettes/uploadFile.yml @@ -2,54 +2,61 @@ http_interactions: - request: method: post - uri: http://WORDPRESS_HOST/xmlrpc.php + uri: http:// body: - encoding: US-ASCII - string: ! 'wp.uploadFile0WORDPRESS_USERNAMEWORDPRESS_PASSWORDidnametest_file.pngbits"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe - ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 - \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ - \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\x00\x00\x00\x00IEND\xAEB`\x82" - -' + encoding: UTF-8 + string: | + wp.uploadFile0gxB06s8Zidnametest_file.pngbits"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\x00\x00\x00\x00IEND\xAEB`\x82" headers: User-Agent: - - XMLRPC::Client (Ruby 1.9.3) + - XMLRPC::Client (Ruby 2.0.0) Content-Type: - text/xml; charset=utf-8 Content-Length: - - '997' + - '984' Connection: - keep-alive + Accept-Encoding: + - identity Accept: - - ! '*/*' + - '*/*' response: status: code: 200 message: OK headers: - Server: - - nginx Date: - - Tue, 04 Jun 2013 21:17:46 GMT - Content-Type: - - text/xml; charset=UTF-8 - Content-Length: - - '526' + - Sat, 08 Feb 2014 23:06:37 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 Connection: - - keep-alive + - close + Content-Length: + - '551' Vary: - - Accept-Encoding - X-Hacker: - - If you're reading this, you should visit automattic.com/jobs and apply to - join the fun, mention this header. + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 body: - encoding: US-ASCII - string: ! "\n\n \n - \ \n \n \n id146\n - \ filetest_file.png\n - \ urlhttp://cthisisatest.files.wordpress.com/2013/06/test_file.png\n - \ type\n\n - \ \n \n \n\n" + encoding: UTF-8 + string: | + + + + + + + id38 + filetest_file.png + urlhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file16.png + type + + + + + http_version: - recorded_at: Tue, 04 Jun 2013 21:17:46 GMT -recorded_with: VCR 2.4.0 + recorded_at: Sat, 08 Feb 2014 23:06:37 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/cassettes/uploadFile2.yml b/spec/cassettes/uploadFile2.yml new file mode 100644 index 0000000..a3e1a0c --- /dev/null +++ b/spec/cassettes/uploadFile2.yml @@ -0,0 +1,62 @@ +--- +http_interactions: +- request: + method: post + uri: http:// + body: + encoding: UTF-8 + string: | + wp.uploadFile0gxB06s8Zidnametest_file.pngbits + headers: + User-Agent: + - XMLRPC::Client (Ruby 2.0.0) + Content-Type: + - text/xml; charset=utf-8 + Content-Length: + - '504' + Connection: + - keep-alive + Accept-Encoding: + - identity + Accept: + - '*/*' + response: + status: + code: 200 + message: OK + headers: + Date: + - Sat, 08 Feb 2014 23:06:38 GMT + Server: + - Apache/2.2.22 + X-Powered-By: + - PHP/5.3.27 + Connection: + - close + Content-Length: + - '551' + Vary: + - User-Agent,Accept-Encoding + Content-Type: + - text/xml; charset=UTF-8 + body: + encoding: UTF-8 + string: | + + + + + + + id39 + filetest_file.png + urlhttp:///wordpress3dot7noauth/wp-content/uploads/2014/02/test_file17.png + type + + + + + + http_version: + recorded_at: Sat, 08 Feb 2014 23:06:38 GMT +recorded_with: VCR 2.5.0 diff --git a/spec/comments_spec.rb b/spec/comments_spec.rb index 110c9c2..37a5040 100644 --- a/spec/comments_spec.rb +++ b/spec/comments_spec.rb @@ -1,18 +1,32 @@ +require_relative 'spec_helper' + describe "#comments" do - let(:post_id){ 134 } - let(:comment_id){ 1 } + let(:post_id){ 1 } let(:comment){ {:comment_parent => "", :content => "This is a test thing here.", :author => "John Adams", :author_url => "http://johnadamsforpresidentnow.com", :author_email => "johnadams@whitehouse.gov"} } + it "#newComment" do + VCR.use_cassette("newComment") do + COMMENT_ID = CLIENT.newComment({:post_id => post_id, :comment => comment}) + COMMENT_ID.class.should eq(Fixnum) + end + end + + it "#editComment" do + VCR.use_cassette("editComment") do + CLIENT.editComment({:comment_id => COMMENT_ID, :comment => comment}).class.should eq(TrueClass) + end + end + it "#getCommentCount" do VCR.use_cassette("getCommentCount") do - CLIENT.getCommentCount({:post_id => post_id}).should include("approved" => "1") + CLIENT.getCommentCount({:post_id => post_id}).should include("approved") end end it "#getComment" do VCR.use_cassette("getComment") do - CLIENT.getComment({:comment_id => comment_id}).should include("comment_id" => "1") + CLIENT.getComment({:comment_id => COMMENT_ID}).should include("content" => "This is a test thing here.") end end @@ -22,21 +36,9 @@ end end - it "#newComment" do - VCR.use_cassette("newComment") do - CLIENT.newComment({:post_id => post_id, :comment => comment}).class.should eq(Fixnum) - end - end - - it "#editComment" do - VCR.use_cassette("editComment") do - CLIENT.editComment({:comment_id => comment_id, :comment => comment}).class.should eq(TrueClass) - end - end - it "#deleteComment" do VCR.use_cassette("deleteComment") do - CLIENT.deleteComment({:comment_id => comment_id}).class.should eq(TrueClass) + CLIENT.deleteComment({:comment_id => COMMENT_ID}).class.should eq(TrueClass) end end diff --git a/spec/http_auth_spec.rb b/spec/http_auth_spec.rb index 2165ecd..c53109d 100644 --- a/spec/http_auth_spec.rb +++ b/spec/http_auth_spec.rb @@ -1,31 +1,26 @@ +require_relative 'spec_helper' + describe "#httpAuth" do - # Monkey patch Rubypress::Client to allow access to @connection Rubypress::Client.class_eval do def rspec_connection @connection end end - it "#noAuth" do - VCR.use_cassette("httpAuthNone") do - expect{ CLIENT.getOptions }.to raise_error(RuntimeError) - expect( CLIENT.rspec_connection.http_last_response.code ).to eq "401" - end - end - it "#validAuth" do - VCR.use_cassette("httpAuthValid", :match_requests_on => [:method, :host, :path]) do + VCR.use_cassette("httpAuthValid") do HTTP_AUTH_CLIENT.getOptions expect( HTTP_AUTH_CLIENT.rspec_connection.http_last_response.code ).to eq "200" end end it "#invalidAuth" do - VCR.use_cassette("httpAuthInvalid", :match_requests_on => [:method, :host, :path]) do + VCR.use_cassette("httpAuthInvalid") do + HTTP_AUTH_CLIENT.http_password = "wrongpass" expect{ HTTP_AUTH_CLIENT.getOptions }.to raise_error(RuntimeError) expect( HTTP_AUTH_CLIENT.rspec_connection.http_last_response.code ).to eq "401" end end -end +end \ No newline at end of file diff --git a/spec/media_spec.rb b/spec/media_spec.rb index 92d7ee4..a4cd180 100644 --- a/spec/media_spec.rb +++ b/spec/media_spec.rb @@ -1,33 +1,37 @@ - describe "#media" do - - let(:attachment_id){ 129 } - let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} - let(:tmp) do - tmp = Tempfile.new(file[:name]) - File.open(tmp, 'wb').write(file[:bits]) - tmp - end +require_relative 'spec_helper' + +describe "#media" do + + let(:file){ {:id => "", :name => "test_file.png", :bits => '"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\n\b\x03\x00\x00\x00\xBA\xEC?\x8F\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xC9e<\x00\x00\x00\fPLTE\xAC\xAC\xAC\x87\x87\x87aaa\xFF\xFF\xFF\xF2\xB3\r\x90\x00\x00\x00\x04tRNS\xFF\xFF\xFF\x00@*\xA9\xF4\x00\x00\x004IDATx\xDAl\x8D1\x12\x00 \f\xC2\x02\xFE\xFF\xCF\x82\x0Eu0\x03\x97r\xD7\x96U\xDC\xE0\x98;\xE1@\xDB$ \xA7\xACJ\x1F\xD5h\xD0]{\x8E\xCD\x8B-\xC0\x00/\x88\x00\xDF$\xC9\x85\\\x00\x00\x00\x00IEND\xAEB`\x82"'}} + let(:tmp) do + tmp = Tempfile.new(file[:name]) + File.open(tmp, 'wb').write(file[:bits]) + tmp + end - it "#getMediaItem" do - VCR.use_cassette("getMediaItem") do - CLIENT.getMediaItem({:attachment_id => attachment_id}).should include("title" => "8yI9E3I") - end + + it "#uploadFile" do + VCR.use_cassette("uploadFile") do + attachment = CLIENT.uploadFile({:data => file}) + ATTACHMENT_ID = attachment["id"] + attachment.should include("file" => "test_file.png") end - it "#getMediaLibrary" do - VCR.use_cassette("getMediaLibrary") do - CLIENT.getMediaLibrary[0].should include("attachment_id"=>"129") - end + VCR.use_cassette("uploadFile2") do + CLIENT.uploadFile({:filename => tmp, :data => file}).should include("file" => "test_file.png") end + end - it "#uploadFile" do - VCR.use_cassette("uploadFile") do - CLIENT.uploadFile({:data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") - end + it "#getMediaItem" do + VCR.use_cassette("getMediaItem") do + CLIENT.getMediaItem({:attachment_id => ATTACHMENT_ID}).should include("title" => "test_file.png") + end + end - VCR.use_cassette("uploadFile") do - CLIENT.uploadFile({:filename => tmp, :data => file}).should include("url" => "http://cthisisatest.files.wordpress.com/2013/06/test_file.png") - end - end + it "#getMediaLibrary" do + VCR.use_cassette("getMediaLibrary") do + CLIENT.getMediaLibrary[0].should include("title" => "test_file.png") + end + end - end \ No newline at end of file +end \ No newline at end of file diff --git a/spec/posts_spec.rb b/spec/posts_spec.rb index b6c59c8..86e29d4 100644 --- a/spec/posts_spec.rb +++ b/spec/posts_spec.rb @@ -1,12 +1,19 @@ +require_relative 'spec_helper' + describe "#post" do - let(:post_id){ 134 } let(:post){ {:post_type => "post", :post_status => "draft", :post_title => "5 Ways to Know You're Cool", :post_content => "I don't always write tests, but when I do, I use RSpec."} } - let(:post_id_to_delete){ 137 } + + it "#newPost" do + VCR.use_cassette("newPost") do + POST_ID = CLIENT.newPost({:content => post}) + POST_ID.should =~ STRING_NUMBER_REGEX + end + end it "#getPost" do VCR.use_cassette("getPost") do - CLIENT.getPost({:post_id => post_id}).should include("post_id" => "134") + CLIENT.getPost({:post_id => POST_ID}).should include("post_id" => POST_ID) end end @@ -16,21 +23,15 @@ end end - it "#newPost" do - VCR.use_cassette("newPost") do - CLIENT.newPost({:content => post}).should =~ STRING_NUMBER_REGEX - end - end - it "#editPost" do VCR.use_cassette("editPost") do - CLIENT.editPost({:post_id => post_id, :content => post}).should eq(true) + CLIENT.editPost({:post_id => POST_ID, :content => post}).should eq(true) end end it "#deletePost" do VCR.use_cassette("deletePost") do - CLIENT.deletePost({:post_id => post_id_to_delete}).should eq(true) + CLIENT.deletePost({:post_id => POST_ID}).should eq(true) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d4afff7..57526ee 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -26,15 +26,22 @@ def load_env(filename = '.env') :host => ENV['WORDPRESS_HOST'], :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], + :path => ENV['WORDPRESS_PATH'], :use_ssl => false } -CLIENT = Rubypress::Client.new( CLIENT_OPTS ) - HTTP_AUTH_CLIENT_OPTS = CLIENT_OPTS.merge( - :http_user => ENV['WORDPRESS_HTTP_USER'] || 'test', - :http_password => ENV['WORDPRESS_HTTP_PASSWORD'] || 'test' ) + :http_user => ENV['WORDPRESS_HTTP_LOGIN'] || 'test', + :http_password => ENV['WORDPRESS_HTTP_PASS'] || 'test', + :host => ENV['WORDPRESS_HTTP_HOST'], + :username => ENV['WORDPRESS_HTTP_USERNAME'], + :password => ENV['WORDPRESS_HTTP_PASSWORD'], + :path=> ENV['WORDPRESS_HTTP_PATH'] +) + + +CLIENT = Rubypress::Client.new( CLIENT_OPTS ) HTTP_AUTH_CLIENT = Rubypress::Client.new( HTTP_AUTH_CLIENT_OPTS ) -STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ +STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ \ No newline at end of file diff --git a/spec/taxonomies_spec.rb b/spec/taxonomies_spec.rb index 3e12501..bfb39bc 100644 --- a/spec/taxonomies_spec.rb +++ b/spec/taxonomies_spec.rb @@ -1,51 +1,51 @@ +require_relative 'spec_helper' + describe "#taxonomies" do - let(:term){ {:name => "Geraffes", :taxonomy => "category"} } - let(:term_id_to_edit){ 576440 } - let(:edited_term){ {:name => "gazelles", :taxonomy => "category"} } - let(:term_id_to_delete){ 173470052 } - let(:term_id_to_delete_taxonomy){ "category" } - - it "#getTaxonomy" do - VCR.use_cassette("getTaxonomy") do - CLIENT.getTaxonomy.should include("label" => "Categories") - end + let(:term){ {:name => "Geraffes", :taxonomy => "category"} } + let(:edited_term){ {:name => "gazelles", :taxonomy => "category"} } + + it "#newTerm" do + VCR.use_cassette("newTerm") do + TERM_ID = CLIENT.newTerm({:content => term}) + TERM_ID.should =~ STRING_NUMBER_REGEX + end + end + + it "#getTaxonomy" do + VCR.use_cassette("getTaxonomy") do + CLIENT.getTaxonomy.should include("label" => "Categories") + end + end + + it "#getTaxonomies" do + VCR.use_cassette("getTaxonomies") do + CLIENT.getTaxonomies[0].should include("name"=>"category") + end + end + + it "#getTerm" do + VCR.use_cassette("getTerm") do + CLIENT.getTerm({:term_id => 1}).should include("name"=>"Uncategorized") + end + end + + it "#getTerms" do + VCR.use_cassette("getTerms") do + CLIENT.getTerms[0].should include("taxonomy"=>"category") + end + end + + it "#editTerm" do + VCR.use_cassette("editTerm") do + CLIENT.editTerm({:term_id => TERM_ID, :content => edited_term}).should eq(true) end + end - it "#getTaxonomies" do - VCR.use_cassette("getTaxonomies") do - CLIENT.getTaxonomies[0].should include("name"=>"category") - end + it "#deleteTerm" do + VCR.use_cassette("deleteTerm") do + CLIENT.deleteTerm({:term_id => TERM_ID, :taxonomy => "category"}).should eq(true) end + end - it "#getTerm" do - VCR.use_cassette("getTerm") do - CLIENT.getTerm({:term_id => 1}).should include("name"=>"Uncategorized") - end - end - - it "#getTerms" do - VCR.use_cassette("getTerms") do - CLIENT.getTerms[0].should include("taxonomy"=>"category") - end - end - - it "#newTerm" do - VCR.use_cassette("newTerm") do - CLIENT.newTerm({:content => term}).should =~ STRING_NUMBER_REGEX - end - end - - it "#editTerm" do - VCR.use_cassette("editTerm") do - CLIENT.editTerm({:term_id => term_id_to_edit, :content => edited_term}).should eq(true) - end - end - - it "#deleteTerm" do - VCR.use_cassette("deleteTerm") do - CLIENT.deleteTerm({:term_id => term_id_to_delete, :taxonomy => term_id_to_delete_taxonomy}).should eq(true) - end - end - - end \ No newline at end of file +end \ No newline at end of file diff --git a/spec/users_spec.rb b/spec/users_spec.rb index 1f4c0fd..beef056 100644 --- a/spec/users_spec.rb +++ b/spec/users_spec.rb @@ -3,7 +3,8 @@ let(:edited_profile_content){ {:first_name => "Johnson"} } it "#getUsersBlogs" do - VCR.use_cassette("getUsersBlogs") do + #:update_content_length_header => true, :preserve_exact_body_bytes => true, :serialize_with => :json + VCR.use_cassette("getUsersBlogs", :tag => :getUsersBlogs) do CLIENT.getUsersBlogs[0].should include("blogid") end end diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index cba28c5..4eaaa75 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -1,21 +1,31 @@ require 'vcr' +sensitive_data = [ + 'WORDPRESS_HOST', + 'WORDPRESS_PATH', + 'WORDPRESS_USERNAME', + 'WORDPRESS_HTTP_PASSWORD', + 'WORDPRESS_HTTP_LOGIN', + 'WORDPRESS_HTTP_PASS', + 'WORDPRESS_HTTP_USERNAME', + 'WORDPRESS_HTTP_PASSWORD', + 'WORDPRESS_HTTP_HOST', + 'WORDPRESS_HTTP_PATH' +] + VCR.configure do |c| c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock - c.filter_sensitive_data("WORDPRESS_USERNAME") do - ENV['WORDPRESS_USERNAME'] - end - c.filter_sensitive_data("WORDPRESS_PASSWORD") do - ENV['WORDPRESS_PASSWORD'] - end - c.filter_sensitive_data("WORDPRESS_HOST") do - ENV['WORDPRESS_HOST'] - end - c.filter_sensitive_data("WORDPRESS_HTTP_USER") do - HTTP_AUTH_CLIENT_OPTS[ :http_user ] - end - c.filter_sensitive_data("WORDPRESS_HTTP_PASSWORD") do - HTTP_AUTH_CLIENT_OPTS[ :http_password ] + sensitive_data.each do |data| + c.filter_sensitive_data("<#{data}>") do + CGI::escape(ENV[data]) + end + c.filter_sensitive_data("<#{data}>") do + ENV[data] + end end + c.default_cassette_options = { match_requests_on: [:method] } + c.before_playback(:getUsersBlogs){|interaction| + interaction.response.headers['Content-Length'] = 711 + } end From a8b948e631d89ac9b2ee733b18c004ee939b4553 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 12 Feb 2014 10:14:03 -0500 Subject: [PATCH 37/70] Add Teemu to the README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 13c4fbb..99d23fb 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) * David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file.) +* Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) ## License From 6faad9d854dc49f10ac7088e1b98f938dba3c481 Mon Sep 17 00:00:00 2001 From: pseudomuto Date: Thu, 13 Mar 2014 16:41:08 +0000 Subject: [PATCH 38/70] retrying requests that time out --- Gemfile | 4 +++- Gemfile.lock | 26 ++++++++++++++++++-------- README.md | 6 +++++- lib/rubypress/client.rb | 12 +++++++++--- lib/rubypress/xml_rpc_retryable.rb | 21 +++++++++++++++++++++ spec/client_spec.rb | 24 +++++++++++++++++++++++- spec/spec_helper.rb | 2 +- spec/users_spec.rb | 9 ++++----- 8 files changed, 84 insertions(+), 20 deletions(-) create mode 100644 lib/rubypress/xml_rpc_retryable.rb diff --git a/Gemfile b/Gemfile index 8ff466f..84b38c9 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,7 @@ source "http://rubygems.org" +gem "retryable-rb", require: false + group :development do gem "rspec" gem "rdoc" @@ -8,4 +10,4 @@ group :development do gem "simplecov" gem "webmock" gem "vcr" -end \ No newline at end of file +end diff --git a/Gemfile.lock b/Gemfile.lock index d993564..ff42637 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,8 +2,9 @@ GEM remote: http://rubygems.org/ specs: addressable (2.3.4) + coderay (1.1.0) crack (0.3.2) - diff-lcs (1.2.4) + diff-lcs (1.2.5) git (1.2.5) jeweler (1.8.4) bundler (~> 1.0) @@ -11,22 +12,29 @@ GEM rake rdoc json (1.8.0) + method_source (0.8.2) multi_json (1.7.6) + pry (0.9.12.6) + coderay (~> 1.0) + method_source (~> 0.8) + slop (~> 3.4) rake (10.0.4) rdoc (4.0.1) json (~> 1.4) - rspec (2.13.0) - rspec-core (~> 2.13.0) - rspec-expectations (~> 2.13.0) - rspec-mocks (~> 2.13.0) - rspec-core (2.13.1) - rspec-expectations (2.13.0) + retryable-rb (1.1.0) + rspec (2.14.1) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) + rspec-core (2.14.8) + rspec-expectations (2.14.5) diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.13.1) + rspec-mocks (2.14.6) simplecov (0.7.1) multi_json (~> 1.0) simplecov-html (~> 0.7.1) simplecov-html (0.7.1) + slop (3.5.0) vcr (2.5.0) webmock (1.11.0) addressable (>= 2.2.7) @@ -38,7 +46,9 @@ PLATFORMS DEPENDENCIES bundler jeweler + pry rdoc + retryable-rb rspec simplecov vcr diff --git a/README.md b/README.md index 99d23fb..2cf15af 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,10 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS (returns a post ID if post was successful) +4. Automatically retry timeouts + + When creating the client, you can optionally pass `:retry_timeouts => true` to rescue Timeout::Error and Net::ReadTimeout errors and retry the call. + To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. NOTE: If your `xmlrpc.php` is not on the host root directory, you need to @@ -116,4 +120,4 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php Licensed under the same terms as WordPress itself - GPLv2. \ No newline at end of file +[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/ed093654d3f4ac89d05750e3def34190 "githalytics.com")](http://githalytics.com/zachfeldman/rubypress) --> diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 2af8b4c..c60d91a 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -1,18 +1,22 @@ require 'yaml' require 'erb' +require 'retryable' + require_relative 'posts' require_relative 'taxonomies' require_relative 'media' require_relative 'comments' require_relative 'options' require_relative 'users' +require_relative 'xml_rpc_retryable' module Rubypress class Client attr_reader :connection - attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, :debug, :http_user, :http_password + attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields + attr_accessor :debug, :http_user, :http_password, :retry_timeouts def initialize(options = {}) { @@ -25,7 +29,8 @@ def initialize(options = {}) :default_post_fields => %w(post terms custom_fields), :debug => false, :http_user => nil, - :http_password => nil + :http_password => nil, + :retry_timeouts => false }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self end @@ -33,6 +38,8 @@ def initialize(options = {}) def connection server = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,self.http_user,self.http_password,self.use_ssl,nil) server.http_header_extra = {'accept-encoding' => 'identity'} + server.extend(XMLRPCRetryable) if retry_timeouts + @connection = server end @@ -64,7 +71,6 @@ def execute(method, options) include Options include Users - end end diff --git a/lib/rubypress/xml_rpc_retryable.rb b/lib/rubypress/xml_rpc_retryable.rb new file mode 100644 index 0000000..da2027c --- /dev/null +++ b/lib/rubypress/xml_rpc_retryable.rb @@ -0,0 +1,21 @@ +module Rubypress + module XMLRPCRetryable + include Retryable + + RETRY_EXCEPTIONS = [ + Timeout::Error, + Net::ReadTimeout + ] + + def self.extended(instance) + instance.singleton_class.send(:alias_method, :call_without_retry, :call) + instance.singleton_class.send(:alias_method, :call, :call_with_retry) + end + + def call_with_retry(method, *args) + retryable on: RETRY_EXCEPTIONS do + call_without_retry(method, *args) + end + end + end +end diff --git a/spec/client_spec.rb b/spec/client_spec.rb index d649bdc..ba24ef2 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -11,6 +11,29 @@ expect(CLIENT.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) end + it '#execute only sets up retries for the current instance' do + retryable_connection = Rubypress::Client.new(CLIENT_OPTS.merge(retry_timeouts: true)).connection + standard_connection = Rubypress::Client.new(CLIENT_OPTS).connection + + expect(retryable_connection).to respond_to(:call_with_retry) + expect(standard_connection).to_not respond_to(:call_with_retry) + end + + it '#execute retries timeouts when retry_timeouts option is true' do + client = Rubypress::Client.new(CLIENT_OPTS.merge(retry_timeouts: true)) + connection = client.connection + client.stub(:connection).and_return(connection) + + expect(connection).to receive(:call_without_retry).twice.and_raise(Timeout::Error) + expect { client.execute('newComment', {}) }.to raise_error(Timeout::Error) + end + + it '#execute does not retry timeouts by default' do + client = Rubypress::Client.new(CLIENT_OPTS) + expect(client).to_not receive(:call_with_retry) + expect { client.execute('newComment', {}) }.to raise_error(VCR::Errors::UnhandledHTTPRequestError) + end + it "#httpAuth" do conn = HTTP_AUTH_CLIENT.connection @@ -21,5 +44,4 @@ expect( conn.password.nil? ).to be_false end - end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 57526ee..2f5702b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -44,4 +44,4 @@ def load_env(filename = '.env') HTTP_AUTH_CLIENT = Rubypress::Client.new( HTTP_AUTH_CLIENT_OPTS ) -STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ \ No newline at end of file +STRING_NUMBER_REGEX = /^[-+]?[0-9]+$/ diff --git a/spec/users_spec.rb b/spec/users_spec.rb index beef056..542ec7b 100644 --- a/spec/users_spec.rb +++ b/spec/users_spec.rb @@ -3,11 +3,10 @@ let(:edited_profile_content){ {:first_name => "Johnson"} } it "#getUsersBlogs" do - #:update_content_length_header => true, :preserve_exact_body_bytes => true, :serialize_with => :json VCR.use_cassette("getUsersBlogs", :tag => :getUsersBlogs) do CLIENT.getUsersBlogs[0].should include("blogid") end - end + end it "#getUsers" do VCR.use_cassette("getUsers") do @@ -19,7 +18,7 @@ VCR.use_cassette("getProfile") do CLIENT.getProfile.should include("user_id") end - end + end it "#editProfile" do VCR.use_cassette("editProfile") do @@ -31,6 +30,6 @@ VCR.use_cassette("getAuthors") do CLIENT.getAuthors[0].should include("user_id") end - end + end -end \ No newline at end of file +end From f3844895857a7751ddcb558953271986b9569b86 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 15 Apr 2014 10:12:28 -0400 Subject: [PATCH 39/70] Minor README update, remove pry from Gemfile.lock, version bump to 1.0.5 --- Gemfile.lock | 8 -------- README.md | 2 +- rubypress.gemspec | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ff42637..79039b5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,7 +2,6 @@ GEM remote: http://rubygems.org/ specs: addressable (2.3.4) - coderay (1.1.0) crack (0.3.2) diff-lcs (1.2.5) git (1.2.5) @@ -12,12 +11,7 @@ GEM rake rdoc json (1.8.0) - method_source (0.8.2) multi_json (1.7.6) - pry (0.9.12.6) - coderay (~> 1.0) - method_source (~> 0.8) - slop (~> 3.4) rake (10.0.4) rdoc (4.0.1) json (~> 1.4) @@ -34,7 +28,6 @@ GEM multi_json (~> 1.0) simplecov-html (~> 0.7.1) simplecov-html (0.7.1) - slop (3.5.0) vcr (2.5.0) webmock (1.11.0) addressable (>= 2.2.7) @@ -46,7 +39,6 @@ PLATFORMS DEPENDENCIES bundler jeweler - pry rdoc retryable-rb rspec diff --git a/README.md b/README.md index 2cf15af..8aa0f08 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php * Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) -* David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file.) +* David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file and to retry failed requests) * Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) ## License diff --git a/rubypress.gemspec b/rubypress.gemspec index 8b8ff0e..475ebb8 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "rubypress" - s.version = "1.0.4" + s.version = "1.0.5" s.platform = Gem::Platform::RUBY s.author = "Zach Feldman" s.email = ["zachfeldman@gmail.com"] From 44b82b4304815ac65176f7e4da4fc45820f35e93 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Tue, 15 Apr 2014 23:14:27 +0000 Subject: [PATCH 40/70] Gemfile.lock should not be included Fixed dependency error --- .gitignore | 1 + Gemfile | 14 +------------- Gemfile.lock | 47 ----------------------------------------------- rubypress.gemspec | 41 ++++++++++++++++++++++++++--------------- 4 files changed, 28 insertions(+), 75 deletions(-) delete mode 100644 Gemfile.lock diff --git a/.gitignore b/.gitignore index 5ce0695..ecac060 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.tmp *.swp .env +Gemfile.lock diff --git a/Gemfile b/Gemfile index 84b38c9..465fcf5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,13 +1 @@ -source "http://rubygems.org" - -gem "retryable-rb", require: false - -group :development do - gem "rspec" - gem "rdoc" - gem "bundler" - gem "jeweler" - gem "simplecov" - gem "webmock" - gem "vcr" -end +source 'http://rubygems.org' diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 79039b5..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,47 +0,0 @@ -GEM - remote: http://rubygems.org/ - specs: - addressable (2.3.4) - crack (0.3.2) - diff-lcs (1.2.5) - git (1.2.5) - jeweler (1.8.4) - bundler (~> 1.0) - git (>= 1.2.5) - rake - rdoc - json (1.8.0) - multi_json (1.7.6) - rake (10.0.4) - rdoc (4.0.1) - json (~> 1.4) - retryable-rb (1.1.0) - rspec (2.14.1) - rspec-core (~> 2.14.0) - rspec-expectations (~> 2.14.0) - rspec-mocks (~> 2.14.0) - rspec-core (2.14.8) - rspec-expectations (2.14.5) - diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.14.6) - simplecov (0.7.1) - multi_json (~> 1.0) - simplecov-html (~> 0.7.1) - simplecov-html (0.7.1) - vcr (2.5.0) - webmock (1.11.0) - addressable (>= 2.2.7) - crack (>= 0.3.2) - -PLATFORMS - ruby - -DEPENDENCIES - bundler - jeweler - rdoc - retryable-rb - rspec - simplecov - vcr - webmock diff --git a/rubypress.gemspec b/rubypress.gemspec index 475ebb8..189e3b9 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -1,19 +1,30 @@ -$LOAD_PATH.push File.expand_path("../lib", __FILE__) +$LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| - s.name = "rubypress" - s.version = "1.0.5" - s.platform = Gem::Platform::RUBY - s.author = "Zach Feldman" - s.email = ["zachfeldman@gmail.com"] - s.homepage = "https://github.com/zachfeldman/rubypress" - s.summary = "Easily access WordPress installations through the WordPress XML-RPC API." - s.description = "Easily access WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API in Ruby." - s.license = "GPLv2" - - s.required_ruby_version = ">= 1.9.2" + s.name = 'rubypress' + s.version = '1.0.5' + s.platform = Gem::Platform::RUBY + s.author = 'Zach Feldman' + s.email = ['zachfeldman@gmail.com'] + s.homepage = 'https://github.com/zachfeldman/rubypress' + s.summary = 'Easily access WordPress installations through the WordPress XML-RPC API.' + s.description = 'Easily access WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API in Ruby.' + s.license = 'GPLv2' + + s.required_ruby_version = '>= 1.9.2' + + s.files = 'lib/rubypress.rb' + s.files += Dir['lib/rubypress/**'] + + s.add_dependency 'retryable-rb' + + s.add_development_dependency 'rspec' + s.add_development_dependency 'rdoc' + s.add_development_dependency 'bundler' + s.add_development_dependency 'jeweler' + s.add_development_dependency 'simplecov' + s.add_development_dependency 'webmock' + s.add_development_dependency 'vcr' + - s.files = "lib/rubypress.rb" - s.files += Dir["lib/rubypress/**"] - end From 5af2573a399876d5d0d170ae544e3ee418544e91 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Tue, 15 Apr 2014 23:20:18 +0000 Subject: [PATCH 41/70] removed duplicate 'attr_accessor' --- lib/rubypress/client.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index c60d91a..0e7585a 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -15,8 +15,8 @@ module Rubypress class Client attr_reader :connection - attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields - attr_accessor :debug, :http_user, :http_password, :retry_timeouts + attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, + :debug, :http_user, :http_password, :retry_timeouts def initialize(options = {}) { From 02814f296e11bdbb59029f72f54e8eb7d84d27db Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 16 Apr 2014 09:58:39 -0400 Subject: [PATCH 42/70] Version bump for depedency issues. --- README.md | 2 +- rubypress.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8aa0f08..bb841c9 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php ## Contributors -* Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors) +* Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors, fixed dependency issue with retry) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) * David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file and to retry failed requests) diff --git a/rubypress.gemspec b/rubypress.gemspec index 189e3b9..7b90bbc 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.0.5' + s.version = '1.0.6' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From af1d6d48d4bab87988185e764e0e28d4a0488754 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Wed, 16 Apr 2014 14:36:43 +0000 Subject: [PATCH 43/70] Added ruby 2.1.1 to travis --- .travis.yml | 3 ++- Gemfile | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b4908e0..1f67c71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: ruby rvm: -- ruby-2.0.0-p353 + - 2.0.0 + - 2.1.1 git: depth: 1 env: diff --git a/Gemfile b/Gemfile index 465fcf5..817f62a 100644 --- a/Gemfile +++ b/Gemfile @@ -1 +1,2 @@ source 'http://rubygems.org' +gemspec From 8dadbc70d80c06d7900b4bcade94c817a3d00140 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Wed, 16 Apr 2014 14:49:59 +0000 Subject: [PATCH 44/70] Added travis cache --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1f67c71..94088c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ rvm: - 2.1.1 git: depth: 1 +cache: bundler env: global: - secure: "Foe5JrG+j5kd3Sy1TY0ovB2yPnncqKlYdPsDfjV95cCy/2iImh1vvKxsdkBrK7/WjcADO7DjF96hItoH53hzmou4+Fz3/Z25h84gClavnqQmpTUWWmyZou+S47uu8st3bujtrKMBwVCkO+eG1mcfhG3V++08dUFjrLnWMmgkTRM=" From a9de5cda50b84c328abcbac06fc1a15f6d5a5add Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 16 Apr 2014 10:51:03 -0400 Subject: [PATCH 45/70] Version bump to fix the build, props to @seuros. --- rubypress.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rubypress.gemspec b/rubypress.gemspec index 7b90bbc..f636ff0 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.0.6' + s.version = '1.0.7' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From 0d659912a1c309e5b5cbf7d60c58627e40b9cbc5 Mon Sep 17 00:00:00 2001 From: Kieran Pilkington Date: Tue, 13 May 2014 17:25:54 +1200 Subject: [PATCH 46/70] Nest modules within rubypress namespace --- lib/rubypress/comments.rb | 90 +++++++++++++------------- lib/rubypress/media.rb | 44 +++++++------ lib/rubypress/options.rb | 30 +++++---- lib/rubypress/posts.rb | 124 +++++++++++++++++++----------------- lib/rubypress/taxonomies.rb | 104 +++++++++++++++--------------- lib/rubypress/users.rb | 68 ++++++++++---------- 6 files changed, 242 insertions(+), 218 deletions(-) diff --git a/lib/rubypress/comments.rb b/lib/rubypress/comments.rb index 4302fd9..d2de7b3 100644 --- a/lib/rubypress/comments.rb +++ b/lib/rubypress/comments.rb @@ -1,51 +1,55 @@ -module Comments - - def getCommentCount(options = {}) - default_options = { - :post_id => nil - }.deep_merge!(options) - execute('getCommentCount', default_options) - end +module Rubypress - def getComment(options = {}) - default_options = { - :comment_id => nil - }.deep_merge!(options) - execute('getComment', default_options) - end + module Comments - def getComments(options = {}) - default_options = { - :filter => {} - }.deep_merge!(options) - execute('getComments', default_options) - end + def getCommentCount(options = {}) + default_options = { + :post_id => nil + }.deep_merge!(options) + execute('getCommentCount', default_options) + end - def newComment(options = {}) - default_options = { - :post_id => nil, - :comment => {} - }.deep_merge!(options) - execute('newComment', default_options) - end + def getComment(options = {}) + default_options = { + :comment_id => nil + }.deep_merge!(options) + execute('getComment', default_options) + end - def editComment(options = {}) - default_options = { - :comment_id => nil, - :comment => {} - }.deep_merge!(options) - execute('editComment', default_options) - end + def getComments(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute('getComments', default_options) + end - def deleteComment(options = {}) - default_options = { - :comment_id => nil - }.deep_merge!(options) - execute('deleteComment', default_options) - end + def newComment(options = {}) + default_options = { + :post_id => nil, + :comment => {} + }.deep_merge!(options) + execute('newComment', default_options) + end + + def editComment(options = {}) + default_options = { + :comment_id => nil, + :comment => {} + }.deep_merge!(options) + execute('editComment', default_options) + end + + def deleteComment(options = {}) + default_options = { + :comment_id => nil + }.deep_merge!(options) + execute('deleteComment', default_options) + end + + def getCommentStatusList(options = {}) + execute('getCommentStatusList', options) + end - def getCommentStatusList(options = {}) - execute('getCommentStatusList', options) end -end \ No newline at end of file +end diff --git a/lib/rubypress/media.rb b/lib/rubypress/media.rb index 51bf6a4..24d6c67 100644 --- a/lib/rubypress/media.rb +++ b/lib/rubypress/media.rb @@ -1,25 +1,29 @@ -module Media +module Rubypress - def getMediaItem(options = {}) - default_options = { - :attachment_id => nil - }.deep_merge!(options) - execute('getMediaItem', default_options) - end + module Media - def getMediaLibrary(options = {}) - default_options = { - :filter => {} - }.deep_merge!(options) - execute('getMediaLibrary', default_options) - end + def getMediaItem(options = {}) + default_options = { + :attachment_id => nil + }.deep_merge!(options) + execute('getMediaItem', default_options) + end + + def getMediaLibrary(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute('getMediaLibrary', default_options) + end + + def uploadFile(options = {}) + default_options = { + :data => {} + }.deep_merge!(options) + default_options[:data][:bits] = XMLRPC::Base64.new(File.read(default_options.delete(:filename))) if options.include?(:filename) and File.readable?(options[:filename]) + execute('uploadFile', default_options) + end - def uploadFile(options = {}) - default_options = { - :data => {} - }.deep_merge!(options) - default_options[:data][:bits] = XMLRPC::Base64.new(File.read(default_options.delete(:filename))) if options.include?(:filename) and File.readable?(options[:filename]) - execute('uploadFile', default_options) end -end \ No newline at end of file +end diff --git a/lib/rubypress/options.rb b/lib/rubypress/options.rb index 231c81f..6325f07 100644 --- a/lib/rubypress/options.rb +++ b/lib/rubypress/options.rb @@ -1,17 +1,21 @@ -module Options +module Rubypress - def getOptions(options = {}) - default_options = { - :options => [] - }.deep_merge!(options) - execute('getOptions', default_options) - end + module Options + + def getOptions(options = {}) + default_options = { + :options => [] + }.deep_merge!(options) + execute('getOptions', default_options) + end + + def setOptions(options = {}) + default_options = { + :options => [] + }.deep_merge!(options) + execute('setOptions', default_options) + end - def setOptions(options = {}) - default_options = { - :options => [] - }.deep_merge!(options) - execute('setOptions', default_options) end -end \ No newline at end of file +end diff --git a/lib/rubypress/posts.rb b/lib/rubypress/posts.rb index c71e273..dcd7309 100644 --- a/lib/rubypress/posts.rb +++ b/lib/rubypress/posts.rb @@ -1,72 +1,76 @@ -module Posts +module Rubypress - def getPost(options = {}) - default_options = { - :post_id => nil, - :fields => self.default_post_fields - }.deep_merge!(options) - execute('getPost', default_options) - end + module Posts - def getPosts(options = {}) - default_options = { - :filter => { - :post_type => 'post', - :orderby => 'post_date', - :order => 'asc', + def getPost(options = {}) + default_options = { + :post_id => nil, :fields => self.default_post_fields - } - }.deep_merge!(options) - execute('getPosts', default_options) - end + }.deep_merge!(options) + execute('getPost', default_options) + end - def newPost(options = {}) - default_options = { - :content => {} - }.deep_merge!(options) - execute('newPost', default_options) - end + def getPosts(options = {}) + default_options = { + :filter => { + :post_type => 'post', + :orderby => 'post_date', + :order => 'asc', + :fields => self.default_post_fields + } + }.deep_merge!(options) + execute('getPosts', default_options) + end - def editPost(options = {}) - default_options = { - :post_id => nil, - :content => {} - }.deep_merge!(options) - execute('editPost', default_options) - end + def newPost(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute('newPost', default_options) + end - def deletePost(options = {}) - default_options = { - :post_id => nil - }.deep_merge!(options) - execute('deletePost', default_options) - end + def editPost(options = {}) + default_options = { + :post_id => nil, + :content => {} + }.deep_merge!(options) + execute('editPost', default_options) + end - def getPostType(options = {}) - default_options = { - :post_type_name => nil, - :fields => [] - }.deep_merge!(options) - execute('getPostType', default_options) - end + def deletePost(options = {}) + default_options = { + :post_id => nil + }.deep_merge!(options) + execute('deletePost', default_options) + end - def getPostTypes(options = {}) - default_options = { - :filter => {}, - :fields => [] - }.deep_merge!(options) - execute('getPostTypes', default_options) - end + def getPostType(options = {}) + default_options = { + :post_type_name => nil, + :fields => [] + }.deep_merge!(options) + execute('getPostType', default_options) + end - def getPostFormats(options = {}) - default_options = { - :filter => {} - }.deep_merge!(options) - execute('getPostFormats', default_options) - end + def getPostTypes(options = {}) + default_options = { + :filter => {}, + :fields => [] + }.deep_merge!(options) + execute('getPostTypes', default_options) + end + + def getPostFormats(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute('getPostFormats', default_options) + end + + def getPostStatusList(options = {}) + execute('getPostFormats', options) + end - def getPostStatusList(options = {}) - execute('getPostFormats', options) end -end \ No newline at end of file +end diff --git a/lib/rubypress/taxonomies.rb b/lib/rubypress/taxonomies.rb index 2b11ab5..b7525be 100644 --- a/lib/rubypress/taxonomies.rb +++ b/lib/rubypress/taxonomies.rb @@ -1,53 +1,57 @@ -module Taxonomies +module Rubypress + + module Taxonomies + + def getTaxonomy(options = {}) + default_options = { + :taxonomy => 'category' + }.deep_merge!(options) + execute('getTaxonomy', default_options) + end + + def getTaxonomies(options = {}) + execute('getTaxonomies', options) + end + + def getTerm(options = {}) + default_options = { + :taxonomy => 'category', + :term_id => nil + }.deep_merge!(options) + execute('getTerm', default_options) + end + + def getTerms(options = {}) + default_options = { + :taxonomy => 'category', + :filter => {} + }.deep_merge!(options) + execute('getTerms', default_options) + end + + def newTerm(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute('newTerm', default_options) + end + + def editTerm(options = {}) + default_options = { + :term_id => nil, + :content => {} + }.deep_merge!(options) + execute('editTerm', default_options) + end + + def deleteTerm(options = {}) + default_options = { + :taxonomy => nil, + :term_id => nil + }.deep_merge!(options) + execute('deleteTerm', default_options) + end - def getTaxonomy(options = {}) - default_options = { - :taxonomy => 'category' - }.deep_merge!(options) - execute('getTaxonomy', default_options) end - def getTaxonomies(options = {}) - execute('getTaxonomies', options) - end - - def getTerm(options = {}) - default_options = { - :taxonomy => 'category', - :term_id => nil - }.deep_merge!(options) - execute('getTerm', default_options) - end - - def getTerms(options = {}) - default_options = { - :taxonomy => 'category', - :filter => {} - }.deep_merge!(options) - execute('getTerms', default_options) - end - - def newTerm(options = {}) - default_options = { - :content => {} - }.deep_merge!(options) - execute('newTerm', default_options) - end - - def editTerm(options = {}) - default_options = { - :term_id => nil, - :content => {} - }.deep_merge!(options) - execute('editTerm', default_options) - end - - def deleteTerm(options = {}) - default_options = { - :taxonomy => nil, - :term_id => nil - }.deep_merge!(options) - execute('deleteTerm', default_options) - end - -end \ No newline at end of file +end diff --git a/lib/rubypress/users.rb b/lib/rubypress/users.rb index 0603b05..8870ae1 100644 --- a/lib/rubypress/users.rb +++ b/lib/rubypress/users.rb @@ -1,40 +1,44 @@ -module Users +module Rubypress - def getUsersBlogs - self.connection.call('wp.getUsersBlogs', self.username, self.password) - end + module Users - def getUser(options = {}) - default_options = { - :user_id => nil, - :fields => [] - }.deep_merge!(options) - execute('getUser', default_options) - end + def getUsersBlogs + self.connection.call('wp.getUsersBlogs', self.username, self.password) + end - def getUsers(options = {}) - default_options = { - :filter => {} - }.deep_merge!(options) - execute('getUsers', default_options) - end + def getUser(options = {}) + default_options = { + :user_id => nil, + :fields => [] + }.deep_merge!(options) + execute('getUser', default_options) + end - def getProfile(options = {}) - default_options = { - :fields => [] - }.deep_merge!(options) - execute('getProfile', default_options) - end + def getUsers(options = {}) + default_options = { + :filter => {} + }.deep_merge!(options) + execute('getUsers', default_options) + end - def editProfile(options = {}) - default_options = { - :content => {} - }.deep_merge!(options) - execute('editProfile', default_options) - end + def getProfile(options = {}) + default_options = { + :fields => [] + }.deep_merge!(options) + execute('getProfile', default_options) + end + + def editProfile(options = {}) + default_options = { + :content => {} + }.deep_merge!(options) + execute('editProfile', default_options) + end + + def getAuthors(options = {}) + execute('getAuthors', options) + end - def getAuthors(options = {}) - execute('getAuthors', options) end -end \ No newline at end of file +end From 0681aad358c373a9385d06ea4243a8fa3f9b8fd6 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 6 Aug 2014 18:04:30 +0100 Subject: [PATCH 47/70] Support version 1.9.2 and 1.9.3 of ruby - Also change travis config to run tests against these versions. - Fixed one test which had not previously been failing. --- .travis.yml | 4 +++- lib/rubypress/xml_rpc_retryable.rb | 9 +++++---- spec/client_spec.rb | 4 ++-- spec/vcr_setup.rb | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94088c2..c96227a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: ruby rvm: + - 1.9.2 + - 1.9.3 - 2.0.0 - 2.1.1 git: @@ -16,4 +18,4 @@ env: - secure: "hkT4n/WjrrZ+qFRrdTVb3BDTWVEaQqIaSXb/ueEhQKul7voDIRTwcYRL9M4uML9IaWb3QMqYmsED8e8FgDWc2nTaBGWgd9V5vPn0vYDmG/4TQcvcA5pQjuHiwgN0OHbfg650IgUx4ddTIdZOC+ZqjL5IAwjxQZm1E/Ak3cJCL98=" - secure: "ZM1TRbksrOtXG8VGwkp2brRsME2YdjQTEvRzjZpj3TXtxWDLc+Ng2WsAAbd9UzDJ9wbUREhY9SrmzB0ZV2iTFriuN0gC/tNrp5aRS+oACes7qU9Vodjt0S+Q1+KAiUbL3CcZRKkP6m4F8YDsug687fKGd34Vk7DR56OygWfvEpE=" - secure: "DCiatNlzhcuMxlHL00ZL/ql+V4vDBOabXaaGpz3OpszO2kI1NvlddOfWScB213JqMyPegkWDjQFyybKPYjNUGgp3alMhlEn6jrvD96tHbdwwfWJc16lSEy1hdVA8KnqEYb0wU5RHBCIxdSM7kdxE3xmTGVJNVXt5narqikMeQ60=" - - secure: "hFdTzn9BWNddcGcf/hvj9Mz3peQgGo6VdRlAVdSrOiiUoArUM2Jhjtyl5Zmsv8yNhooAp9rDxQM6KQc/RmvHWpDnOhlJxO5uWDqOWnRvYEC1CfdTST4InJKWNgJwcXYqshpsMKLAvKNmUZzLSJ6TNPQWTBhgWlfk92adiUIvxuQ=" \ No newline at end of file + - secure: "hFdTzn9BWNddcGcf/hvj9Mz3peQgGo6VdRlAVdSrOiiUoArUM2Jhjtyl5Zmsv8yNhooAp9rDxQM6KQc/RmvHWpDnOhlJxO5uWDqOWnRvYEC1CfdTST4InJKWNgJwcXYqshpsMKLAvKNmUZzLSJ6TNPQWTBhgWlfk92adiUIvxuQ=" diff --git a/lib/rubypress/xml_rpc_retryable.rb b/lib/rubypress/xml_rpc_retryable.rb index da2027c..d54f209 100644 --- a/lib/rubypress/xml_rpc_retryable.rb +++ b/lib/rubypress/xml_rpc_retryable.rb @@ -2,18 +2,19 @@ module Rubypress module XMLRPCRetryable include Retryable - RETRY_EXCEPTIONS = [ - Timeout::Error, - Net::ReadTimeout + RUBY_EXCEPTIONS = [ + Timeout::Error ] + RUBY_EXCEPTIONS << Net::ReadTimeout if Net.const_defined?(:ReadTimeout) + def self.extended(instance) instance.singleton_class.send(:alias_method, :call_without_retry, :call) instance.singleton_class.send(:alias_method, :call, :call_with_retry) end def call_with_retry(method, *args) - retryable on: RETRY_EXCEPTIONS do + retryable on: RUBY_EXCEPTIONS do call_without_retry(method, *args) end end diff --git a/spec/client_spec.rb b/spec/client_spec.rb index ba24ef2..0d64e1a 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -40,8 +40,8 @@ expect( conn.user ).to eq HTTP_AUTH_CLIENT_OPTS[ :http_user ] expect( conn.password ).to eq HTTP_AUTH_CLIENT_OPTS[ :http_password ] - expect( conn.user.nil? ).to be_false - expect( conn.password.nil? ).to be_false + expect( conn.user.nil? ).to be false + expect( conn.password.nil? ).to be false end end diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index 4eaaa75..8df8458 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -18,7 +18,7 @@ c.hook_into :webmock sensitive_data.each do |data| c.filter_sensitive_data("<#{data}>") do - CGI::escape(ENV[data]) + CGI::escape(ENV[data]) if ENV[data] end c.filter_sensitive_data("<#{data}>") do ENV[data] From a01997846626a605b9aeecd646303f4500f2ed43 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Mon, 11 Aug 2014 22:35:22 +0100 Subject: [PATCH 48/70] Support version 1.9.2 in tests --- spec/vcr_setup.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index 8df8458..e41ef8a 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -17,7 +17,7 @@ c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock sensitive_data.each do |data| - c.filter_sensitive_data("<#{data}>") do + c.filter_sensitive_data("") do CGI::escape(ENV[data]) if ENV[data] end c.filter_sensitive_data("<#{data}>") do From a20b6ec5874ed0b05c389f6e07d2362f626c157c Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 3 Sep 2014 22:26:50 +0100 Subject: [PATCH 49/70] Remove support for ruby 1.9.2 --- .travis.yml | 1 - rubypress.gemspec | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c96227a..49c0faa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: ruby rvm: - - 1.9.2 - 1.9.3 - 2.0.0 - 2.1.1 diff --git a/rubypress.gemspec b/rubypress.gemspec index f636ff0..4c2d0d7 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |s| s.description = 'Easily access WordPress installations through the WordPress XML-RPC API. This gem exactly mirrors the functionality provided by the WordPress XML-RPC API in Ruby.' s.license = 'GPLv2' - s.required_ruby_version = '>= 1.9.2' + s.required_ruby_version = '>= 1.9.3' s.files = 'lib/rubypress.rb' s.files += Dir['lib/rubypress/**'] From 5a7d271298ef7d95f3965305d815fed2ea0460b7 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Wed, 3 Sep 2014 22:03:05 -0500 Subject: [PATCH 50/70] Version bump, update README with @punkie --- README.md | 2 +- rubypress-1.0.8.gem | Bin 0 -> 6656 bytes rubypress.gemspec | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 rubypress-1.0.8.gem diff --git a/README.md b/README.md index bb841c9..0ee3dae 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php * Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) * David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file and to retry failed requests) * Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) - +* Brian Fletcher [@punkie](https://github.com/punkle) (Did work to try to get to 1.9.2 compat with tests, VCR issues prevented this. Now only officially support 1.9.3 and up) ## License Licensed under the same terms as WordPress itself - GPLv2. diff --git a/rubypress-1.0.8.gem b/rubypress-1.0.8.gem new file mode 100644 index 0000000000000000000000000000000000000000..0c7ab0905540aeb23c1263b1ee109391def057a8 GIT binary patch literal 6656 zcmeHLXH*l&+73upk&d7U2$3p;7JBF?NRvbeO?m7f%)daqKJrbN1c zRHaE5q!;Os>)!ig_xR)c&i>f@?RSpvpLgcWyfg1SGxMBh#>v*h(#F!mQV8h-_`3}B z-NePk0l)k2_M;aO69ofAM8!cOk`khl;-UbMh}iGlIY56`LVq3??e1ae_B|y}J6l`F zKR5hP{@>dFv$j7L_e1zUwaOkr0hk{phY?@eNSbsW0nvnPoipS~Hfw_KHfO~ua!@ns z#})+w7_+-7k@R&ClF3ibicPW$>kU^)IhklCrW31DSfV>|@((Y#HCE)uvD01Hq&5{l zVwnMR$+ji98&i%19&}YYN-65nRyRrdJq!f2z0s$}YevSFV|3y#9v)nY_Q8f$fJerT z)4BHpcT!sbKyk4T&TPI8x$P_(d{Hq%`Ch=Aro3M7x%1ApV=0(G^B`F%&8h`%*_TGx z!&Y$<-xX5YL4R6{`saRSlcWkJsvht?-)tJwPEFD_jp=j9#AhK=dTny4om$>-B4IGqkpL+{5E-4n zjw2SdAnpP06<%EHdb@cYmE!t|HM?yCgks(UnzmE#jfr3iZ;(#uJk6@Re8Q^fbUaGE z_f$mpXft-FSncxmRQH|zkS~1?Mjv)ahXYRfWn7t-0Er#sd9ZRuxvRC+PLCEC$E;>r zWwiSTGKYAO!qD`u+IQtk6`{$Zw?Kv1{_I;T_o7VNt%dSzR%l`}?h^%Krw`q&H0@WU z%kBcRQeZo_1Tm_J9W6t-vX>%D2K33qC>7u4!{!)&djP#*Qxm%61xouJT*wMR0OiIl z*%b!qCy+~Oag}iovG2pDQGGGGK{1Y9mYDq@Yu2^Ucv5g}hXYJbWoB&Qf?7Jyn6Yf` zo&GsKYr??}9*nG}&fYn;gLUiG*>X!8FZ|Y{lCaq29MF+%s`qBJT@7g~xuYYs@cLw}F4K60;Q&9NCFfeL~6sZ;&DCJ8W*QWgF$hl##Ltdld2pq z&~kB}`Iw#i4PN_^&tIkab7*RdP8^YyPTSX=HqWS=)SeM^F!|LVRu3jJGB!4K%6oS( z%^Rgx2WQ|am-&L8$Gb@=b)8eqG+oHK6XFiq=RV9lS@YW3FJ0buc4%wcP=$Iz^vHH#Z#tuPA5igNn^r{~mG0V1>ue8~U)9$9L%UE)eF@p3ITj|M`$E6|>bcDqLSc_5{u!!Vf^?a^-=fa{w zm~>jNS067(9`&{|{YxFCbwEm+pn{E3SE_>EGKaEptHTq=k&V_t(`mvzaQ#;hsFQ%& zSod(hc!tS0JSEiD;2%!46&4@cs;W08sYgz=#YRNpYvCjfdQyl@Yu}!Nhl6isYqyS} zkyM!ct~V70?FaeLvXJ1QGk?p^0_#+Kw}aW_4&ZV}a2aOkXG${?9jj3kw=2*sdWc=Q zgMyu`;qcO>$wN7th^1kO-K1~D07lJaf+UDCiIl*s2%aO5XxzS|Ns(&^ab*~JIkMDR zPacxpE6Ay|M$9#you)CXF{$WdEh6hVfK3*^D1Fc0P<=h~_GYa;E4(6|W=$Sk}@=uNRd=HqBqAeu-bvoIM&7T?yT!)vQA zt}h}s3FY7k*k5=ARRpNmXa>C3{)AJXF72}uYE~w*a_uimj@@+hH2By(MfxC4LSU3LmhC___6RA~*IgMFaS5j$t6Z&YDX)AEC$W!Wr zj*yYd>n^*X-$XXu-M3wp1;eA`Kf+A_=Ki;rn2t61sZ$!l>=Cwi?4x1#>B|!IUgF8w z{S?G5q-4B*@pS{;G)6^-DBpoHk}kFC zjbzXuvI-V9mQSlhXwB)!&uHwv=g5htP%;KQ`y3s2FJ55MSx!OcF(SP(9Lpb&qKy<= z<|KD00DDX?FBG@=x)s}C2BP!^;|stP#Af+N5gOVzVL0I#BJOg@2}po7t%6w0Ft-b$ zZA%T`r+Dy6FNNq9pApi6UCkx(kiwW4*GqW0YLG_M-%V&V+3>v>-`d^P#T^k1di48I}+Hly2Me@q0I!!qY!Vwn}q-A??!b=2MeD%n%p}Np#7Ig@u!n zH@wIu*I(_MXRP(<;<&uZnfDIHY-c0$wrfewxU^VEwY2_%t8P(1fi&5W@OdJ&kl^U9 z$3|cWUlcn+>kyRQor5)vTLFRgy;M0Gj8LYdhC*si*Xto3cxg?v zGFz90x2QWbqkHZPGKdzjZz{mm6v*%m;}$O%?WxLAl5)ebC~J_RO4(}QqeJ(G$yCNo znp_Hi5B2>!3^&fE5z3m8Xb9IZ4C0PA>I?>+Jv*B*xIwghL^wF;J4Uruo1GFu4+yR- zN{0osC5_RV{=&n?kL*#brN%w6L*$%sSl}+kUDxO|iAQ>^pYXa-*5vrCymhp2gAlM` zo(M#*F~=}EpAQG!Y*sF3--V$W0^6#(vu#j?C3>=jP_3#oMeK*Au!3yd;#J>y4$(#p zpSzjpY+{BmKw-uP|J}kG26GKW?wUe`z5fQragJ4Y)sw%7&pZb;_jTlDLgxsKcfI6o z6BF+$Od=Ipwsbj;?+TtDa;E*L$;XcdDv=Z+cjJM9iJ=yxbeC!7$cAd%OlXX$O!-Oh zuKCkopP;&#GvVfn>K<;F&0}-V<+Jk7#e1!x{e&77yXh>hZDP{e`@g~HZ1&EO>+v^U z6$!j zLcqc^H(NnUR=VAuZ=E$eiLx#ok1P-|QSYbTy`H~FcAfIHT= z0#;gV9^#Hq+0AazI}iw<3k6p~!;_MJSwSL^yAp-D|AW8C^U{cy-S8yLurIE&(9bow5Mc|Av15C@Jo%6ZCs zN_6Miwl@iG=+d4t7Nr`)s)YpcF*9IuFFl3L8hkk?nL7SSJ?}0;vg^8azp_bR$fKU2 zdJKs67IdnoAfFxAZt$dp#!>ULgapy-mO`2(J*h#mwlr(Ho;DcA`P#r0m@6n$j2&`Z zRZO(IHq4T>8U(kXT_C2o^a@cMC&$M1+9|@B%}%5y+C&>ZcdxOd@eDxub)Nnu(O(De RXT(ngej@M_f&a${{0oXUavT5v literal 0 HcmV?d00001 diff --git a/rubypress.gemspec b/rubypress.gemspec index 4c2d0d7..ea7650c 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.0.7' + s.version = '1.0.8' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From 74270fe92a0108cff807e556523cde4a741794da Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Sun, 14 Sep 2014 13:35:56 -0400 Subject: [PATCH 51/70] Revert "Support version 1.9.2 in tests" --- spec/vcr_setup.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index e41ef8a..8df8458 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -17,7 +17,7 @@ c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock sensitive_data.each do |data| - c.filter_sensitive_data("") do + c.filter_sensitive_data("<#{data}>") do CGI::escape(ENV[data]) if ENV[data] end c.filter_sensitive_data("<#{data}>") do From e65a491e8ea1989af8cca49cf249aa921fcc37ed Mon Sep 17 00:00:00 2001 From: Corey Date: Fri, 10 Oct 2014 12:12:21 -0400 Subject: [PATCH 52/70] updating to use the correct default ssl port, ability to use alternate ssl port, updating README with ssl example, and removing the gem file from the repository --- .gitignore | 1 + README.md | 19 +++++++++++++++++++ lib/rubypress/client.rb | 5 +++-- rubypress-1.0.8.gem | Bin 6656 -> 0 bytes 4 files changed, 23 insertions(+), 2 deletions(-) delete mode 100644 rubypress-1.0.8.gem diff --git a/.gitignore b/.gitignore index ecac060..a9720d9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.swp .env Gemfile.lock +*.gem diff --git a/README.md b/README.md index 0ee3dae..9f0187a 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,25 @@ wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", :password => "yourwordpresspassword") ``` +5. Using SSL +Use the default SSL port of 443 + +```ruby +wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :use_ssl => true) +``` + +Use a non-default ssl port of your choosing (must be setup on your server correctly) +```ruby +wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :use_ssl => true, + :ssl_port => 995) +``` + ## Contributing to rubypress Pull requests welcome. diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 0e7585a..b72b3cb 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -15,12 +15,13 @@ module Rubypress class Client attr_reader :connection - attr_accessor :port, :host, :path, :username, :password, :use_ssl, :default_post_fields, + attr_accessor :port, :ssl_port, :host, :path, :username, :password, :use_ssl, :default_post_fields, :debug, :http_user, :http_password, :retry_timeouts def initialize(options = {}) { :port => 80, + :ssl_port => 443, :use_ssl => false, :host => nil, :path => '/xmlrpc.php', @@ -36,7 +37,7 @@ def initialize(options = {}) end def connection - server = XMLRPC::Client.new(self.host, self.path, self.port,nil,nil,self.http_user,self.http_password,self.use_ssl,nil) + server = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,nil) server.http_header_extra = {'accept-encoding' => 'identity'} server.extend(XMLRPCRetryable) if retry_timeouts diff --git a/rubypress-1.0.8.gem b/rubypress-1.0.8.gem deleted file mode 100644 index 0c7ab0905540aeb23c1263b1ee109391def057a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 zcmeHLXH*l&+73upk&d7U2$3p;7JBF?NRvbeO?m7f%)daqKJrbN1c zRHaE5q!;Os>)!ig_xR)c&i>f@?RSpvpLgcWyfg1SGxMBh#>v*h(#F!mQV8h-_`3}B z-NePk0l)k2_M;aO69ofAM8!cOk`khl;-UbMh}iGlIY56`LVq3??e1ae_B|y}J6l`F zKR5hP{@>dFv$j7L_e1zUwaOkr0hk{phY?@eNSbsW0nvnPoipS~Hfw_KHfO~ua!@ns z#})+w7_+-7k@R&ClF3ibicPW$>kU^)IhklCrW31DSfV>|@((Y#HCE)uvD01Hq&5{l zVwnMR$+ji98&i%19&}YYN-65nRyRrdJq!f2z0s$}YevSFV|3y#9v)nY_Q8f$fJerT z)4BHpcT!sbKyk4T&TPI8x$P_(d{Hq%`Ch=Aro3M7x%1ApV=0(G^B`F%&8h`%*_TGx z!&Y$<-xX5YL4R6{`saRSlcWkJsvht?-)tJwPEFD_jp=j9#AhK=dTny4om$>-B4IGqkpL+{5E-4n zjw2SdAnpP06<%EHdb@cYmE!t|HM?yCgks(UnzmE#jfr3iZ;(#uJk6@Re8Q^fbUaGE z_f$mpXft-FSncxmRQH|zkS~1?Mjv)ahXYRfWn7t-0Er#sd9ZRuxvRC+PLCEC$E;>r zWwiSTGKYAO!qD`u+IQtk6`{$Zw?Kv1{_I;T_o7VNt%dSzR%l`}?h^%Krw`q&H0@WU z%kBcRQeZo_1Tm_J9W6t-vX>%D2K33qC>7u4!{!)&djP#*Qxm%61xouJT*wMR0OiIl z*%b!qCy+~Oag}iovG2pDQGGGGK{1Y9mYDq@Yu2^Ucv5g}hXYJbWoB&Qf?7Jyn6Yf` zo&GsKYr??}9*nG}&fYn;gLUiG*>X!8FZ|Y{lCaq29MF+%s`qBJT@7g~xuYYs@cLw}F4K60;Q&9NCFfeL~6sZ;&DCJ8W*QWgF$hl##Ltdld2pq z&~kB}`Iw#i4PN_^&tIkab7*RdP8^YyPTSX=HqWS=)SeM^F!|LVRu3jJGB!4K%6oS( z%^Rgx2WQ|am-&L8$Gb@=b)8eqG+oHK6XFiq=RV9lS@YW3FJ0buc4%wcP=$Iz^vHH#Z#tuPA5igNn^r{~mG0V1>ue8~U)9$9L%UE)eF@p3ITj|M`$E6|>bcDqLSc_5{u!!Vf^?a^-=fa{w zm~>jNS067(9`&{|{YxFCbwEm+pn{E3SE_>EGKaEptHTq=k&V_t(`mvzaQ#;hsFQ%& zSod(hc!tS0JSEiD;2%!46&4@cs;W08sYgz=#YRNpYvCjfdQyl@Yu}!Nhl6isYqyS} zkyM!ct~V70?FaeLvXJ1QGk?p^0_#+Kw}aW_4&ZV}a2aOkXG${?9jj3kw=2*sdWc=Q zgMyu`;qcO>$wN7th^1kO-K1~D07lJaf+UDCiIl*s2%aO5XxzS|Ns(&^ab*~JIkMDR zPacxpE6Ay|M$9#you)CXF{$WdEh6hVfK3*^D1Fc0P<=h~_GYa;E4(6|W=$Sk}@=uNRd=HqBqAeu-bvoIM&7T?yT!)vQA zt}h}s3FY7k*k5=ARRpNmXa>C3{)AJXF72}uYE~w*a_uimj@@+hH2By(MfxC4LSU3LmhC___6RA~*IgMFaS5j$t6Z&YDX)AEC$W!Wr zj*yYd>n^*X-$XXu-M3wp1;eA`Kf+A_=Ki;rn2t61sZ$!l>=Cwi?4x1#>B|!IUgF8w z{S?G5q-4B*@pS{;G)6^-DBpoHk}kFC zjbzXuvI-V9mQSlhXwB)!&uHwv=g5htP%;KQ`y3s2FJ55MSx!OcF(SP(9Lpb&qKy<= z<|KD00DDX?FBG@=x)s}C2BP!^;|stP#Af+N5gOVzVL0I#BJOg@2}po7t%6w0Ft-b$ zZA%T`r+Dy6FNNq9pApi6UCkx(kiwW4*GqW0YLG_M-%V&V+3>v>-`d^P#T^k1di48I}+Hly2Me@q0I!!qY!Vwn}q-A??!b=2MeD%n%p}Np#7Ig@u!n zH@wIu*I(_MXRP(<;<&uZnfDIHY-c0$wrfewxU^VEwY2_%t8P(1fi&5W@OdJ&kl^U9 z$3|cWUlcn+>kyRQor5)vTLFRgy;M0Gj8LYdhC*si*Xto3cxg?v zGFz90x2QWbqkHZPGKdzjZz{mm6v*%m;}$O%?WxLAl5)ebC~J_RO4(}QqeJ(G$yCNo znp_Hi5B2>!3^&fE5z3m8Xb9IZ4C0PA>I?>+Jv*B*xIwghL^wF;J4Uruo1GFu4+yR- zN{0osC5_RV{=&n?kL*#brN%w6L*$%sSl}+kUDxO|iAQ>^pYXa-*5vrCymhp2gAlM` zo(M#*F~=}EpAQG!Y*sF3--V$W0^6#(vu#j?C3>=jP_3#oMeK*Au!3yd;#J>y4$(#p zpSzjpY+{BmKw-uP|J}kG26GKW?wUe`z5fQragJ4Y)sw%7&pZb;_jTlDLgxsKcfI6o z6BF+$Od=Ipwsbj;?+TtDa;E*L$;XcdDv=Z+cjJM9iJ=yxbeC!7$cAd%OlXX$O!-Oh zuKCkopP;&#GvVfn>K<;F&0}-V<+Jk7#e1!x{e&77yXh>hZDP{e`@g~HZ1&EO>+v^U z6$!j zLcqc^H(NnUR=VAuZ=E$eiLx#ok1P-|QSYbTy`H~FcAfIHT= z0#;gV9^#Hq+0AazI}iw<3k6p~!;_MJSwSL^yAp-D|AW8C^U{cy-S8yLurIE&(9bow5Mc|Av15C@Jo%6ZCs zN_6Miwl@iG=+d4t7Nr`)s)YpcF*9IuFFl3L8hkk?nL7SSJ?}0;vg^8azp_bR$fKU2 zdJKs67IdnoAfFxAZt$dp#!>ULgapy-mO`2(J*h#mwlr(Ho;DcA`P#r0m@6n$j2&`Z zRZO(IHq4T>8U(kXT_C2o^a@cMC&$M1+9|@B%}%5y+C&>ZcdxOd@eDxub)Nnu(O(De RXT(ngej@M_f&a${{0oXUavT5v From c3fb3185c617f1018008966f5f087e43d2280fe4 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Fri, 10 Oct 2014 18:48:41 -0400 Subject: [PATCH 53/70] README updates, version bump. --- .gitignore | 1 + README.md | 2 ++ rubypress.gemspec | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a9720d9..d4b6c7b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .env Gemfile.lock *.gem +.DS_Store diff --git a/README.md b/README.md index 9f0187a..5389e58 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,8 @@ WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php * David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file and to retry failed requests) * Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) * Brian Fletcher [@punkie](https://github.com/punkle) (Did work to try to get to 1.9.2 compat with tests, VCR issues prevented this. Now only officially support 1.9.3 and up) +* Corey [@developercorey](https://github.com/developercorey) (Added ability to change SSL port, README updates) + ## License Licensed under the same terms as WordPress itself - GPLv2. diff --git a/rubypress.gemspec b/rubypress.gemspec index ea7650c..097a8e9 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.0.8' + s.version = '1.0.9' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From 51a144035dcb11d741e6c1540f572c1ba32ffae4 Mon Sep 17 00:00:00 2001 From: Corey Date: Mon, 13 Oct 2014 21:12:08 -0400 Subject: [PATCH 54/70] updating readme adding example --- README.md | 151 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 91 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 5389e58..285bf49 100644 --- a/README.md +++ b/README.md @@ -9,76 +9,105 @@ This implements the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_W WARNING: SSL is NOT enabled by default for ease of testing for those running OS X systems without setup SSL certs. If this is important to you, checkout the options for instantiating a new client where you can set :use_ssl to true. -## Getting Started +# Getting Started -1. Install the gem +## Installing rubypress - A. To your system +### System installation - `gem install rubypress` + gem install rubypress - B. Or using Bundler +### Using Bundler + + # Add this to your Gemfile + gem 'rubypress' - Inside your Gemfile: +## Using rubypress - `gem 'rubypress'` +### In a script -2. Create a new client + require 'rubypress' - ```ruby - > wp = Rubypress::Client.new(:host => "yourwordpresssite.com", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") - ``` +## Usage Examples -3. Make requests based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API) +### Create a new client - ```ruby - > wp.getOptions + wp = Rubypress::Client.new(:host => "yourwordpresssite.com", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword") +### Automatically retry timeouts - => {"software_name"=>{"desc"=>"Software Name", "readonly"=>true, "value"=>"WordPress"} - ``` - (just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) +When creating the client, you can optionally pass `:retry_timeouts => true` to rescue Timeout::Error and Net::ReadTimeout errors and retry the call. - ```ruby - > wp.newPost(:blog_id => "your_blog_id", :content => { :post_status => "publish", :post_date => Time.now, :post_content => "What an awesome post", :post_title => "Woo Title" }) - => "24" - ``` + wp = Rubypress::Client.new(:host => "yourwordpresssite.com", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :retry_timeouts => true) +### Non-standard `xmlrpc.php` location - (returns a post ID if post was successful) +NOTE: If your `xmlrpc.php` is not on the host root directory, you need to +specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to/blog`: -4. Automatically retry timeouts - When creating the client, you can optionally pass `:retry_timeouts => true` to rescue Timeout::Error and Net::ReadTimeout errors and retry the call. + wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :path => "/path/to/blog/xmlrpc.php") -To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. -NOTE: If your `xmlrpc.php` is not on the host root directory, you need to -specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to/blog`: + +## Making requests +(Based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API)) -```ruby -wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", - :path => "/path/to/blog/xmlrpc.php", - :username => "yourwordpressuser@wordpress.com", - :password => "yourwordpresspassword") -``` +### Getting Options + + wp.getOptions + + # Returns a hash of options from the wp_options table + => {"software_name"=>{"desc"=>"Software Name", + "readonly"=>true, + "value"=>"WordPress"}} + +(just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) + +### Creating a new post + + wp.newPost( :blog_id => "your_blog_id", # 0 unless using WP Multi-Site, then use the blog id + :content => { + :post_status => "publish", + :post_date => Time.now, + :post_content => "This is the body", + :post_title => "RubyPress is the best!", + :post_name => "/rubypress-is-the-best", + :post_author => 1, # 1 if there is only the admin user, otherwise the user's id + :terms_names => { + :category => ['Category One','Category Two','Category Three'], + :post_tag => ['Tag One','Tag Two', 'Tag Three'] + } + } + ) + + # Returns the newly created posts ID if successful + => "24" -5. Using SSL +### Using SSL to connect Use the default SSL port of 443 -```ruby -wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", - :username => "yourwordpressuser@wordpress.com", - :password => "yourwordpresspassword", - :use_ssl => true) -``` + wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :use_ssl => true) + Use a non-default ssl port of your choosing (must be setup on your server correctly) -```ruby -wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", - :username => "yourwordpressuser@wordpress.com", - :password => "yourwordpresspassword", - :use_ssl => true, - :ssl_port => 995) -``` + + wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", + :username => "yourwordpressuser@wordpress.com", + :password => "yourwordpresspassword", + :use_ssl => true, + :ssl_port => 995) + +To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. ## Contributing to rubypress @@ -92,6 +121,8 @@ Pull requests welcome. * Make sure to add tests for it. This is important so we don't break it in a future version unintentionally. * Submit a pull request +## Testing + ### Environment Variables The test suite requires that the following environment variables are set: @@ -102,24 +133,24 @@ The test suite requires that the following environment variables are set: Optionally, you can create a file in the working directory called _.env_ and add the following to it: -``` -WORDPRESS_HOST=myhostedwordpresssite.net -WORDPRESS_USERNAME=yourwordpressuser@wordpress.com -WORDPRESS_PASSWORD=yourwordpresspassword -``` + + WORDPRESS_HOST=myhostedwordpresssite.net + WORDPRESS_USERNAME=yourwordpressuser@wordpress.com + WORDPRESS_PASSWORD=yourwordpresspassword + or use the sample-dot-env file as a base. .env will not be committed. When RSpec runs it will set the environment variables for you. If you'd like to run the tests to test a server with plain HTTP authentication, use these environment vars: -``` -WORDPRESS_HTTP_LOGIN=yourhttplogin -WORDPRESS_HTTP_PASS=yourhttppass -WORDPRESS_HTTP_USERNAME=yourwordpressusername -WORDPRESS_HTTP_PASSWORD=yourwordpresspassword -WORDPRESS_HTTP_HOST=yourhost.com -WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php -``` + + WORDPRESS_HTTP_LOGIN=yourhttplogin + WORDPRESS_HTTP_PASS=yourhttppass + WORDPRESS_HTTP_USERNAME=yourwordpressusername + WORDPRESS_HTTP_PASSWORD=yourwordpresspassword + WORDPRESS_HTTP_HOST=yourhost.com + WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php + ## Credits From 7aca602c614eef965d70932d333f9e016b8d6d66 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 16 Nov 2014 02:43:23 +0900 Subject: [PATCH 55/70] new uploadFile patch --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 285bf49..e242824 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,16 @@ Use a non-default ssl port of your choosing (must be setup on your server correc :use_ssl => true, :ssl_port => 995) +### Uploading a file + +```ruby +FILENAME='myFile.png' +wp.uploadFile(:data => { + :name => FILENAME, + :type => MIME::Types.type_for(FILENAME).first.to_s, + :bits => XMLRPC::Base64.new(IO.read(FILENAME)) +``` + To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. ## Contributing to rubypress From 3a62cb40ced6033e6dfa16246bdc1fda19abbc45 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 16 Nov 2014 03:40:07 +0900 Subject: [PATCH 56/70] fix - skip '})' in source demo uploading file --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e242824..7d78600 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,7 @@ wp.uploadFile(:data => { :name => FILENAME, :type => MIME::Types.type_for(FILENAME).first.to_s, :bits => XMLRPC::Base64.new(IO.read(FILENAME)) + }) ``` To make further requests, check out the documentation - this gem should follow the exact format of the [WordPress XML RPC API](http://codex.wordpress.org/XML-RPC_WordPress_API). For even further clarification on what requests are available, take a look in the spec folder. From 81af09e44a5c54361f10a480c4f04ef6e7cae157 Mon Sep 17 00:00:00 2001 From: Rebecca Skinner Date: Thu, 27 Nov 2014 14:14:58 +0800 Subject: [PATCH 57/70] Cache the created XMLRPC connection So it can be modified if necessary, eg. to disable SSL verification. --- lib/rubypress/client.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index b72b3cb..6b71e0c 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -37,11 +37,13 @@ def initialize(options = {}) end def connection - server = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,nil) - server.http_header_extra = {'accept-encoding' => 'identity'} - server.extend(XMLRPCRetryable) if retry_timeouts - - @connection = server + if @connection.nil? + @connection = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,nil) + @connection.http_header_extra = {'accept-encoding' => 'identity'} + @connection.extend(XMLRPCRetryable) if retry_timeouts + end + + @connection end def self.default From b169161e268bd7d9281fdf29e9c0ad13ced6f9a3 Mon Sep 17 00:00:00 2001 From: Casey Hadden Date: Thu, 29 Jan 2015 12:26:19 -0500 Subject: [PATCH 58/70] Update VCR usage to calculate content length VCR has a capability to calculate the response content length at the time of the cassette playback. This allows changes to the recording without having to constantly update the information to match the body length. Update the VCR setup code to utilize this mechanism for each cassette playback. --- spec/vcr_setup.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/vcr_setup.rb b/spec/vcr_setup.rb index 8df8458..15ddb19 100644 --- a/spec/vcr_setup.rb +++ b/spec/vcr_setup.rb @@ -25,7 +25,7 @@ end end c.default_cassette_options = { match_requests_on: [:method] } - c.before_playback(:getUsersBlogs){|interaction| - interaction.response.headers['Content-Length'] = 711 + c.before_playback(){|interaction| + interaction.response.update_content_length_header } end From 71595b3edd2b37e79d6cf9fb838c0c5645c9d880 Mon Sep 17 00:00:00 2001 From: Casey Hadden Date: Thu, 29 Jan 2015 12:30:15 -0500 Subject: [PATCH 59/70] Update to include support for cookies Add support for wordpress sites that require a particular cookie(s) in order to be accessible. For example, this could happen on a company intranet where the SSO mechanism does not support basic authorization. Update client to accept an additional cookie value and pass that along to the underlying connection when it is set. This fixes issue #36. --- lib/rubypress/client.rb | 6 ++++-- spec/client_spec.rb | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 6b71e0c..9d3a4b3 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -16,7 +16,7 @@ class Client attr_reader :connection attr_accessor :port, :ssl_port, :host, :path, :username, :password, :use_ssl, :default_post_fields, - :debug, :http_user, :http_password, :retry_timeouts + :debug, :http_user, :http_password, :retry_timeouts, :cookie def initialize(options = {}) { @@ -31,7 +31,8 @@ def initialize(options = {}) :debug => false, :http_user => nil, :http_password => nil, - :retry_timeouts => false + :retry_timeouts => false, + :cookie => nil }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self end @@ -41,6 +42,7 @@ def connection @connection = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,nil) @connection.http_header_extra = {'accept-encoding' => 'identity'} @connection.extend(XMLRPCRetryable) if retry_timeouts + @connection.cookie = self.cookie unless self.cookie.nil? end @connection diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 0d64e1a..87c3023 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -34,6 +34,18 @@ expect { client.execute('newComment', {}) }.to raise_error(VCR::Errors::UnhandledHTTPRequestError) end + it "#connection does not include cookies by default" do + client = Rubypress::Client.new(CLIENT_OPTS) + connection = client.connection + expect(connection.cookie).to eq nil + end + + it "#connection includes cookies when set" do + client = Rubypress::Client.new(CLIENT_OPTS.merge(cookie: "foo=bar")) + connection = client.connection + expect(connection.cookie).to include("foo=bar") + end + it "#httpAuth" do conn = HTTP_AUTH_CLIENT.connection From 700e308a10c3057fe9638013ac3b5e5add464f37 Mon Sep 17 00:00:00 2001 From: Noah Botimer Date: Sun, 1 Feb 2015 20:36:14 -0500 Subject: [PATCH 60/70] Fix #38 - Allow tests to run against HTTPS servers This is a simple change to the spec_helper to allow setting a custom port and whether to use SSL on the underlying XML-RPC client. The README and sample .env file are updated accordingly. --- README.md | 8 ++++++++ sample-dot-env | 6 +++++- spec/spec_helper.rb | 8 +++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7d78600..2892a29 100644 --- a/README.md +++ b/README.md @@ -146,11 +146,15 @@ Optionally, you can create a file in the working directory called _.env_ and add WORDPRESS_HOST=myhostedwordpresssite.net + WORDPRESS_PORT=80 + WORDPRESS_USE_SSL=false WORDPRESS_USERNAME=yourwordpressuser@wordpress.com WORDPRESS_PASSWORD=yourwordpresspassword or use the sample-dot-env file as a base. .env will not be committed. When RSpec runs it will set the environment variables for you. +If you use a port other than 80, specify it with `WORDPRESS_PORT` and use `WORDPRESS_USE_SSL=true` for HTTPS servers. Be sure to set +the port to 443 for standard HTTPS servers. If you'd like to run the tests to test a server with plain HTTP authentication, use these environment vars: @@ -160,8 +164,12 @@ If you'd like to run the tests to test a server with plain HTTP authentication, WORDPRESS_HTTP_USERNAME=yourwordpressusername WORDPRESS_HTTP_PASSWORD=yourwordpresspassword WORDPRESS_HTTP_HOST=yourhost.com + WORDPRESS_HTTP_PORT=80 + WORDPRESS_HTTP_USE_SSL=false WORDPRESS_HTTP_PATH=/path/to/xmlrpc.php +The Basic Authentication settings also allow a custom port and whether to use SSL/HTTPS. Note that, like the host and path, these +variable names include `HTTP_` and can be set to the same or different values as needed. ## Credits diff --git a/sample-dot-env b/sample-dot-env index 65bbe43..eb566b3 100644 --- a/sample-dot-env +++ b/sample-dot-env @@ -1,5 +1,7 @@ WORDPRESS_HOST= WORDPRESS_PATH= +WORDPRESS_PORT= +WORDPRESS_USE_SSL= WORDPRESS_USERNAME= WORDPRESS_PASSWORD= WORDPRESS_HTTP_LOGIN= @@ -7,4 +9,6 @@ WORDPRESS_HTTP_PASS= WORDPRESS_HTTP_USERNAME= WORDPRESS_HTTP_PASSWORD= WORDPRESS_HTTP_HOST= -WORDPRESS_HTTP_PATH= \ No newline at end of file +WORDPRESS_HTTP_PORT= +WORDPRESS_HTTP_USE_SSL= +WORDPRESS_HTTP_PATH= diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2f5702b..28f9091 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -22,21 +22,23 @@ def load_env(filename = '.env') end CLIENT_OPTS = { - :port => 80, + :port => ENV['WORDPRESS_PORT'] || 80, :host => ENV['WORDPRESS_HOST'], :username => ENV['WORDPRESS_USERNAME'], :password => ENV['WORDPRESS_PASSWORD'], :path => ENV['WORDPRESS_PATH'], - :use_ssl => false + :use_ssl => ENV['WORDPRESS_USE_SSL'] == 'true' } HTTP_AUTH_CLIENT_OPTS = CLIENT_OPTS.merge( :http_user => ENV['WORDPRESS_HTTP_LOGIN'] || 'test', :http_password => ENV['WORDPRESS_HTTP_PASS'] || 'test', :host => ENV['WORDPRESS_HTTP_HOST'], + :port => ENV['WORDPRESS_HTTP_PORT'] || 80, :username => ENV['WORDPRESS_HTTP_USERNAME'], :password => ENV['WORDPRESS_HTTP_PASSWORD'], - :path=> ENV['WORDPRESS_HTTP_PATH'] + :path=> ENV['WORDPRESS_HTTP_PATH'], + :use_ssl => ENV['WORDPRESS_HTTP_USE_SSL'] == 'true' ) From 17cd8b762f1ab0b553b1104169e7873a8b7c6e70 Mon Sep 17 00:00:00 2001 From: Noah Botimer Date: Sun, 1 Feb 2015 21:52:25 -0500 Subject: [PATCH 61/70] Fix #37 - Allow custom prefixes on method names This allows bare method names to be passed to Client#execute and be prefixed by "wp." as before, but allows method names with a namespace prefix to pass through unmodified. This is determined by whether or not there is a '.' present in the method name. This implementation does mean that custom methods must have some dotted prefix, since any bare method names are assumed to need "wp.", but this seems to be a reasonable requirement, matching API convention. --- lib/rubypress/client.rb | 5 +++-- spec/client_spec.rb | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 6b71e0c..05a12c6 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -58,12 +58,13 @@ def execute(method, options) :password => self.password } options_final.deep_merge!(options).each{|option| args.push(option[1]) if !option[1].nil?} + method = "wp.#{method}" unless method.include?('.') if self.debug connection.set_debug - server = self.connection.call("wp.#{method}", args) + server = self.connection.call(method, args) pp server else - self.connection.call("wp.#{method}", args) + self.connection.call(method, args) end end diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 0d64e1a..6e94312 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -11,6 +11,30 @@ expect(CLIENT.execute("wp.getAuthors", {})).to eq( [{"user_id"=>"46917508", "user_login"=>"johnsmith", "display_name"=>"john"}, {"user_id"=>"33333367", "user_login"=>"johnsmith", "display_name"=>"johnsmith"}] ) end + it "#execute adds wp prefix to bare method name" do + connection = CLIENT.connection + allow(connection).to receive(:call) do |method, args| + expect(method).to eq('wp.getAuthors') + end + CLIENT.execute("getAuthors", {}) + end + + it "#execute does not modify wp prefix on method name" do + connection = CLIENT.connection + allow(connection).to receive(:call) do |method, args| + expect(method).to eq('wp.getAuthors') + end + CLIENT.execute("wp.getAuthors", {}) + end + + it "#execute does not modify method with custom prefix" do + connection = CLIENT.connection + allow(connection).to receive(:call) do |method, args| + expect(method).to eq("wpx.getAuthors") + end + CLIENT.execute("wpx.getAuthors", {}) + end + it '#execute only sets up retries for the current instance' do retryable_connection = Rubypress::Client.new(CLIENT_OPTS.merge(retry_timeouts: true)).connection standard_connection = Rubypress::Client.new(CLIENT_OPTS).connection From 865abdaad84bcea0a2dea39eb8dcb675523de7d2 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Mon, 2 Feb 2015 12:54:00 -0500 Subject: [PATCH 62/70] Version bump, add contributors to README --- README.md | 4 ++++ rubypress.gemspec | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2892a29..c88a967 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,10 @@ variable names include `HTTP_` and can be set to the same or different values as * Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) * Brian Fletcher [@punkie](https://github.com/punkle) (Did work to try to get to 1.9.2 compat with tests, VCR issues prevented this. Now only officially support 1.9.3 and up) * Corey [@developercorey](https://github.com/developercorey) (Added ability to change SSL port, README updates) +* Michael [@mibamur](https://github.com/mibamur) (Patched uploadFile method) +* Rebecca Skinner [@sevenseacat](https://github.com/sevenseacat) (Cached the XMLRPC connection to save resources) +* Casey Hadden [@caseyhadden](https://github.com/caseyhadden) (Added support for cookie-based authentication schemes) +* Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefies on method names and tests to run against https servers on any port) ## License diff --git a/rubypress.gemspec b/rubypress.gemspec index 097a8e9..026a464 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.0.9' + s.version = '1.1.0' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From f1a1e5ca13f283bbcb4a7a8710c79c00e24d825e Mon Sep 17 00:00:00 2001 From: Carlos Perez Cerrato Date: Sun, 12 Jul 2015 13:36:50 +0200 Subject: [PATCH 63/70] Catch 'Errno::EPIPE: Broken pipe' and reconnect. --- lib/rubypress/xml_rpc_retryable.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rubypress/xml_rpc_retryable.rb b/lib/rubypress/xml_rpc_retryable.rb index d54f209..bc8ef79 100644 --- a/lib/rubypress/xml_rpc_retryable.rb +++ b/lib/rubypress/xml_rpc_retryable.rb @@ -3,7 +3,8 @@ module XMLRPCRetryable include Retryable RUBY_EXCEPTIONS = [ - Timeout::Error + Timeout::Error, + Errno::EPIPE ] RUBY_EXCEPTIONS << Net::ReadTimeout if Net.const_defined?(:ReadTimeout) From f3aeaf844da95131675d044977322b7dcd1c49d4 Mon Sep 17 00:00:00 2001 From: Carlos Perez Cerrato Date: Sun, 12 Jul 2015 15:47:55 +0200 Subject: [PATCH 64/70] Write test for broken pipe error --- spec/client_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 94a9c66..1d64d29 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -52,6 +52,16 @@ expect { client.execute('newComment', {}) }.to raise_error(Timeout::Error) end + it '#execute retries when catch broken pipe exception and retry_timeouts option is true' do + client = Rubypress::Client.new(CLIENT_OPTS.merge(retry_timeouts: true)) + connection = client.connection + client.stub(:connection).and_return(connection) + + expect(connection).to receive(:call_without_retry).twice.and_raise(Errno::EPIPE) + expect { client.execute('newComment', {}) }.to raise_error(Errno::EPIPE) + end + + it '#execute does not retry timeouts by default' do client = Rubypress::Client.new(CLIENT_OPTS) expect(client).to_not receive(:call_with_retry) From ef44bda0875372055727667bd3c1c5b46397792d Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 4 Aug 2015 11:52:12 -0400 Subject: [PATCH 65/70] Update README. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c88a967..26d22af 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,8 @@ variable names include `HTTP_` and can be set to the same or different values as * Michael [@mibamur](https://github.com/mibamur) (Patched uploadFile method) * Rebecca Skinner [@sevenseacat](https://github.com/sevenseacat) (Cached the XMLRPC connection to save resources) * Casey Hadden [@caseyhadden](https://github.com/caseyhadden) (Added support for cookie-based authentication schemes) -* Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefies on method names and tests to run against https servers on any port) +* Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefixes on method names and tests to run against https servers on any port) +* Carlos Pérez Cerrato [@lastko](https://github.com/lastko) (Caught Errno::EPIPE: Broken pipe errors) ## License From b9af8cc4f7dac924541c681e96aa979cde5ae3b6 Mon Sep 17 00:00:00 2001 From: Eric Gascoine Date: Mon, 1 Feb 2016 18:04:00 -0700 Subject: [PATCH 66/70] [#46] - Fix getPostStatusList --- lib/rubypress/posts.rb | 2 +- spec/cassettes/getPostStatusList.yml | 16 +++++----------- spec/posts_spec.rb | 2 +- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/rubypress/posts.rb b/lib/rubypress/posts.rb index dcd7309..68f0b84 100644 --- a/lib/rubypress/posts.rb +++ b/lib/rubypress/posts.rb @@ -68,7 +68,7 @@ def getPostFormats(options = {}) end def getPostStatusList(options = {}) - execute('getPostFormats', options) + execute('getPostStatusList', options) end end diff --git a/spec/cassettes/getPostStatusList.yml b/spec/cassettes/getPostStatusList.yml index e8df632..a2754a5 100644 --- a/spec/cassettes/getPostStatusList.yml +++ b/spec/cassettes/getPostStatusList.yml @@ -48,17 +48,11 @@ http_interactions: - standardStandard - asideAside - chatChat - galleryGallery - linkLink - imageImage - quoteQuote - statusStatus - videoVideo - audioAudio - + draftDraft + pendingPending Review + privatePrivate + publishPublished + diff --git a/spec/posts_spec.rb b/spec/posts_spec.rb index 86e29d4..37a64ec 100644 --- a/spec/posts_spec.rb +++ b/spec/posts_spec.rb @@ -55,7 +55,7 @@ it "#getPostStatusList" do VCR.use_cassette("getPostStatusList") do - CLIENT.getPostStatusList.should include("standard"=>"Standard") + CLIENT.getPostStatusList.should include("draft"=>"Draft") end end From c1c6e6062dd60e0a292a4ec207b292274a703694 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Tue, 2 Feb 2016 10:04:15 -0500 Subject: [PATCH 67/70] Version bump, readme update. --- README.md | 1 + rubypress.gemspec | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 26d22af..249e671 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,7 @@ variable names include `HTTP_` and can be set to the same or different values as * Casey Hadden [@caseyhadden](https://github.com/caseyhadden) (Added support for cookie-based authentication schemes) * Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefixes on method names and tests to run against https servers on any port) * Carlos Pérez Cerrato [@lastko](https://github.com/lastko) (Caught Errno::EPIPE: Broken pipe errors) +* Eric Gascoine [@ericgascoine](https://github.com/ericgascoine) Fixed getPostStatusList ## License diff --git a/rubypress.gemspec b/rubypress.gemspec index 026a464..f6e7bd3 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.1.0' + s.version = '1.2.0' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From 33f55bfff091f51bdd971a25606fcc52b5098369 Mon Sep 17 00:00:00 2001 From: Matt Colyer Date: Thu, 30 Jun 2016 13:07:43 -0700 Subject: [PATCH 68/70] Add configurable timeouts (#51) * Add configurable timeouts * Add tests --- lib/rubypress/client.rb | 5 +++-- spec/client_spec.rb | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/rubypress/client.rb b/lib/rubypress/client.rb index 8a68b49..3bba609 100644 --- a/lib/rubypress/client.rb +++ b/lib/rubypress/client.rb @@ -16,7 +16,7 @@ class Client attr_reader :connection attr_accessor :port, :ssl_port, :host, :path, :username, :password, :use_ssl, :default_post_fields, - :debug, :http_user, :http_password, :retry_timeouts, :cookie + :debug, :http_user, :http_password, :retry_timeouts, :timeout, :cookie def initialize(options = {}) { @@ -32,6 +32,7 @@ def initialize(options = {}) :http_user => nil, :http_password => nil, :retry_timeouts => false, + :timeout => 30, :cookie => nil }.merge(options).each{ |opt| self.send("#{opt[0]}=", opt[1]) } self @@ -39,7 +40,7 @@ def initialize(options = {}) def connection if @connection.nil? - @connection = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,nil) + @connection = XMLRPC::Client.new(self.host, self.path, (self.use_ssl ? self.ssl_port : self.port),nil,nil,self.http_user,self.http_password,self.use_ssl,self.timeout) @connection.http_header_extra = {'accept-encoding' => 'identity'} @connection.extend(XMLRPCRetryable) if retry_timeouts @connection.cookie = self.cookie unless self.cookie.nil? diff --git a/spec/client_spec.rb b/spec/client_spec.rb index 1d64d29..5ae2b19 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -90,4 +90,16 @@ expect( conn.password.nil? ).to be false end + + it "#connection defaults the timeout to 30s" do + client = Rubypress::Client.new(CLIENT_OPTS) + connection = client.connection + expect(connection.timeout).to eq 30 + end + + it "#connection timeout can be overridden" do + client = Rubypress::Client.new(CLIENT_OPTS.merge(timeout: 60)) + connection = client.connection + expect(connection.timeout).to eq 60 + end end From f4366521189e66dbe91d89b7989eb261bc146bb5 Mon Sep 17 00:00:00 2001 From: Zach Feldman Date: Thu, 30 Jun 2016 16:10:45 -0400 Subject: [PATCH 69/70] Credit where credit is due. Deployed new gem version. --- README.md | 1 + rubypress.gemspec | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 249e671..dcaa601 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ variable names include `HTTP_` and can be set to the same or different values as * Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefixes on method names and tests to run against https servers on any port) * Carlos Pérez Cerrato [@lastko](https://github.com/lastko) (Caught Errno::EPIPE: Broken pipe errors) * Eric Gascoine [@ericgascoine](https://github.com/ericgascoine) Fixed getPostStatusList +* Matt Colyer [@mcoyler](https://github.com/mcolyer) Added configurable timeouts. ## License diff --git a/rubypress.gemspec b/rubypress.gemspec index f6e7bd3..0a61e28 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.2.0' + s.version = '1.2.1' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] From 3b4d5a070bfe49b7543e5341260d67cbc65f80ec Mon Sep 17 00:00:00 2001 From: Karim Naufal Date: Fri, 24 Feb 2017 16:29:14 +0100 Subject: [PATCH 70/70] Added xmlrpc dependency for ruby >= 2.4.0 support (#55) * Added xmlrpc dependency for ruby >= 2.4.0 support * Version bump to 1.2.2 * Updated contributors list --- README.md | 41 +++++++++++++++++++++-------------------- rubypress.gemspec | 3 ++- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index dcaa601..3eb0173 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS ## Installing rubypress ### System installation - + gem install rubypress ### Using Bundler - + # Add this to your Gemfile gem 'rubypress' @@ -32,20 +32,20 @@ WARNING: SSL is NOT enabled by default for ease of testing for those running OS ### Create a new client - wp = Rubypress::Client.new(:host => "yourwordpresssite.com", - :username => "yourwordpressuser@wordpress.com", + wp = Rubypress::Client.new(:host => "yourwordpresssite.com", + :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword") ### Automatically retry timeouts When creating the client, you can optionally pass `:retry_timeouts => true` to rescue Timeout::Error and Net::ReadTimeout errors and retry the call. - wp = Rubypress::Client.new(:host => "yourwordpresssite.com", - :username => "yourwordpressuser@wordpress.com", + wp = Rubypress::Client.new(:host => "yourwordpresssite.com", + :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword", :retry_timeouts => true) ### Non-standard `xmlrpc.php` location -NOTE: If your `xmlrpc.php` is not on the host root directory, you need to +NOTE: If your `xmlrpc.php` is not on the host root directory, you need to specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to/blog`: @@ -55,17 +55,17 @@ specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to :path => "/path/to/blog/xmlrpc.php") - -## Making requests + +## Making requests (Based off of the [WordPress XML RPC API Documentation](http://codex.wordpress.org/XML-RPC_WordPress_API)) ### Getting Options - + wp.getOptions - + # Returns a hash of options from the wp_options table - => {"software_name"=>{"desc"=>"Software Name", - "readonly"=>true, + => {"software_name"=>{"desc"=>"Software Name", + "readonly"=>true, "value"=>"WordPress"}} (just a small excerpt of actual options for the sake of the whole [brevity thing](http://3-akamai.tapcdn.com/images/thumbs/taps/2012/06/demotivational-poster-the-dude-or-the-dude-his-dudeness-el-duderino-if-you-re-not-into-the-whole-brevity-thing-3410281f-sz640x523-animate.jpg)) @@ -86,13 +86,13 @@ specify it's path. For example, to connect to `myhostedwordpresssite.net/path/to } } ) - + # Returns the newly created posts ID if successful => "24" ### Using SSL to connect Use the default SSL port of 443 - + wp = Rubypress::Client.new(:host => "myhostedwordpresssite.net", :username => "yourwordpressuser@wordpress.com", :password => "yourwordpresspassword", @@ -123,7 +123,7 @@ To make further requests, check out the documentation - this gem should follow t ## Contributing to rubypress Pull requests welcome. - + * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet. * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it. * Fork the project. @@ -180,7 +180,7 @@ variable names include `HTTP_` and can be set to the same or different values as * Abdelkader Boudih [@seuros](https://github.com/seuros) (Removed deep_merge monkeypatch if ActiveSupport is defined, small refactors, fixed dependency issue with retry) * Alex Dantas [@alexdantas](https://github.com/alexdantas) (README edits re: host option) -* Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain.) +* Pacop [@pacop](https://github.com/pacop) (Added a far easier way to upload files than the default method chain) * David Muto [@pseudomuto](https://github.com/pseudomuto) (Added ability to use a .env file and to retry failed requests) * Teemu Pääkkönen [@borc](https://github.com/borc) (Added HTTP authentication and tests for it) * Brian Fletcher [@punkie](https://github.com/punkle) (Did work to try to get to 1.9.2 compat with tests, VCR issues prevented this. Now only officially support 1.9.3 and up) @@ -190,12 +190,13 @@ variable names include `HTTP_` and can be set to the same or different values as * Casey Hadden [@caseyhadden](https://github.com/caseyhadden) (Added support for cookie-based authentication schemes) * Noah Botimer [@botimer](https://github.com/botimer) (Allowed custom prefixes on method names and tests to run against https servers on any port) * Carlos Pérez Cerrato [@lastko](https://github.com/lastko) (Caught Errno::EPIPE: Broken pipe errors) -* Eric Gascoine [@ericgascoine](https://github.com/ericgascoine) Fixed getPostStatusList -* Matt Colyer [@mcoyler](https://github.com/mcolyer) Added configurable timeouts. +* Eric Gascoine [@ericgascoine](https://github.com/ericgascoine) (Fixed getPostStatusList) +* Matt Colyer [@mcoyler](https://github.com/mcolyer) (Added configurable timeouts) +* Karim Naufal [@rimkashox](https://github.com/rimkashox) (Added support for Ruby >= 2.4.0) ## License Licensed under the same terms as WordPress itself - GPLv2. - diff --git a/rubypress.gemspec b/rubypress.gemspec index 0a61e28..1cc6ee6 100644 --- a/rubypress.gemspec +++ b/rubypress.gemspec @@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__) Gem::Specification.new do |s| s.name = 'rubypress' - s.version = '1.2.1' + s.version = '1.2.2' s.platform = Gem::Platform::RUBY s.author = 'Zach Feldman' s.email = ['zachfeldman@gmail.com'] @@ -17,6 +17,7 @@ Gem::Specification.new do |s| s.files += Dir['lib/rubypress/**'] s.add_dependency 'retryable-rb' + s.add_dependency 'xmlrpc' s.add_development_dependency 'rspec' s.add_development_dependency 'rdoc'