From 2bb6bc8eef0520068d52bfc82477603f1586c0ec Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Sat, 20 Jul 2013 21:03:56 -0700 Subject: [PATCH] Added Wordpress service functionality, for cross-posting to OAuth-enabled Wordpress.com or Jetpack-enabled Wordpress.org blogs. Added model for Wordpress service Added very very basic Wordpress cross-posting functionality. Added markdown support to post body Fixed Wordpress::MAX_CHARACTERS problem cleanup Added default settings for Wordpress OAuth Added default settings for Wordpress OAuth Added Wordpress to configured services spec. changelog changes --- Changelog.md | 1 + Gemfile | 1 + Gemfile.lock | 8 +++++ .../social_media_logos/wordpress-16x16.png | Bin 0 -> 1394 bytes .../social_media_logos/wordpress-24x24.png | Bin 0 -> 1639 bytes .../social_media_logos/wordpress-32x32.png | Bin 0 -> 1754 bytes .../social_media_logos/wordpress-48x48.png | Bin 0 -> 2282 bytes app/assets/stylesheets/application.css.sass | 2 ++ app/models/services/wordpress.rb | 32 +++++++++++++++++ config/defaults.yml | 4 +++ config/diaspora.yml.example | 6 ++++ config/initializers/omniauth.rb | 4 +++ lib/configuration_methods.rb | 2 +- spec/lib/configuration_methods_spec.rb | 2 ++ spec/models/services/wordpress_spec.rb | 33 ++++++++++++++++++ 15 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 app/assets/images/social_media_logos/wordpress-16x16.png create mode 100644 app/assets/images/social_media_logos/wordpress-24x24.png create mode 100644 app/assets/images/social_media_logos/wordpress-32x32.png create mode 100644 app/assets/images/social_media_logos/wordpress-48x48.png create mode 100644 app/models/services/wordpress.rb create mode 100644 spec/models/services/wordpress_spec.rb diff --git a/Changelog.md b/Changelog.md index 38efeec22..9e8fed394 100644 --- a/Changelog.md +++ b/Changelog.md @@ -262,6 +262,7 @@ everything is set up. * Show the service username in a tooltip next to the publisher icons [#4126](https://github.com/diaspora/diaspora/pull/4126) * Ability to add location when creating a post [#3803](https://github.com/diaspora/diaspora/pull/3803) * Added oEmbed provider for MixCloud. [#4131](https://github.com/diaspora/diaspora/pull/4131) +* Added Wordpress service ability for posts. [#4321](https://github.com/diaspora/diaspora/pull/4321) ## Gem updates diff --git a/Gemfile b/Gemfile index 59087dbd4..b19daf0a2 100644 --- a/Gemfile +++ b/Gemfile @@ -77,6 +77,7 @@ gem 'omniauth-facebook', '1.4.1' gem 'omniauth-tumblr', '1.1' gem 'omniauth-twitter', '1.0.0' gem 'twitter', '4.8.1' +gem 'omniauth-wordpress','0.1.1', github: 'readmill/omniauth-wordpress' # Tags diff --git a/Gemfile.lock b/Gemfile.lock index 2f89ad7a8..2ff4301b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +GIT + remote: git://github.com/readmill/omniauth-wordpress.git + revision: 32ac451f564e5189a863cb5db16aad2d48f7a638 + specs: + omniauth-wordpress (0.1.1) + omniauth-oauth2 (~> 1.1.0) + GEM remote: https://rubygems.org/ specs: @@ -464,6 +471,7 @@ DEPENDENCIES omniauth-facebook (= 1.4.1) omniauth-tumblr (= 1.1) omniauth-twitter (= 1.0.0) + omniauth-wordpress (= 0.1.1)! rack-cors (= 0.2.8) rack-google-analytics (= 0.11.0) rack-piwik (= 0.2.2) diff --git a/app/assets/images/social_media_logos/wordpress-16x16.png b/app/assets/images/social_media_logos/wordpress-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8935e416f3e46cb37842042bafebfaf8a2eb42d2 GIT binary patch literal 1394 zcmaJ=Yfsx&7|ux8SVd?-+vq0PjN36Zn%GXr%@8QLKmv7ukZnN<8^$q^k;I#gvS?TfX!M~qOfq=)Y z2ft8ZFh(26Dvu@1ki}t}g9uj>Iyab=31oy&Ucg6kI1uuA{VW>NgD1KuzZQ-m5IBKw z)q3z%QckQ8Fj5Q&sN}GWfYmUdM&yVxO{3A=0u(R;L$Cru6f#7EDitUU1E(LzM`PR- zsNIxv8jIiQ!77fUQ3whKgYuwKPBE1bqSNUF4TVC+BV=ripTk2kKYQa$!9=nI;qeRm6Fi2YRzJ(( zeuA``^dPSw_juf>QG+NEI7ea5R%sE$tkA+bvsPzTX|h#mDvic;#x+qyz(@MIGp_qJ zS9vK{u!4`~Bb!LZbC-1IFq98CDH-)#kc%NrqvZQ!xK!_y>%JhDQ?Bt+F2pAT361?v zqtA|b_Xx{#+wz-pi9~NC7v6E0^YZcnfxzbGWy{yp^e_O7k1t*@`==H_a(TCrH%-Q7JrJlx*iu2QMGy1GhBOFKI|DT=DC zt&NV3?&;~VTCM&4{o~`~9LLSi&&S5bW@cs%3=AwTE|!#(jEsydFE5vsm8GPl93LM~ zXT5cgul6UaDcceHtK4D|NB7KWhryj=1l7&=!M$;TLfg&#whd z>2sfs=B3wc^*(dWO%KlgP&V{#%c4%5T!bh55*Y=Hz6Y{D`3}nyx+SujZKg+tvc`V_ Drz!E5 literal 0 HcmV?d00001 diff --git a/app/assets/images/social_media_logos/wordpress-24x24.png b/app/assets/images/social_media_logos/wordpress-24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ee13ecb3af63f3feb5fb41c90ae18249e5c4063b GIT binary patch literal 1639 zcmaJ>e@qi+7_QPTqGE)}0?f%-3DG&)YfC9TsQhZRowVx;49H}zv>&wS-Iex$f{}?s zR2)ok1ClAs@WT=sh|W#~Du_%RxS<%uAsa*x2hxFHfK42`BH;cQyX5Zsk>`2d_x;}I zzT>4g{8VMpwWsm^dKTb7OBeEr{b&WK|7#8BSH$GfKWn4bU$W5i~{<+E<(=j+e|t% z47}7C9Y4pJiTNV|B zz@XA=b%YkjAiJV69#0_zbTZRdC7`+`S)0+1bg-$;HLR&CSix(edils~0a` zJbn7~`1ts?ZQBM027G;eZ8qEN?5xRTnwgmy9v*IMYm>=j{r&w`t95#M`pJ_gPoF+j zC=}10J!@`m&d<-EoSZBvDY!s;Zirn&fi%)YR0(#6);__{hk}(9qDibLR#J2MY=cQc_ZG+_+I&TU%dWfAHWz z1VIW53)|b<^YZe7gM%+!x>R0XuGMPe;^I!8JbCKWDe?yf0Gv2+A}1#&Gcz+aHI=-S z=H})K2h1k27avH3A(6(O@~&OcE%FW2{`H%vE?HjdT{5CJ&?>fem8-_A)4v^P8mm2! zzrs~eQ*66j&nar2%hs&y$^JX*i}M4#!H4M%((ivamF;l||K{co{iZ7cg6kT_XTd?e z6(!HT`~TWR_2E3Hr9U6#H7DNw>R~8$PkHxIX0+SxckzIL(dIVOcWirb}jKgmy-E9;`qu}z;;oNm_!PC>Xes@ z&G-H=jVo!tj7)?wQ>*$`Z~Y_)KHs>m@5@+z@NsJ!)iVC;JueVoJ9Znfx(DQ0r#x+y z;`fNJ$GFQ!mGRx$dU8{zV&6LvKnR3|sQPLy#9aJ|8cC$nF;hFnY_N!kak_l@< HKRx^pXIPNj literal 0 HcmV?d00001 diff --git a/app/assets/images/social_media_logos/wordpress-32x32.png b/app/assets/images/social_media_logos/wordpress-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d54abc98aaa8be6b84b20d46bbff6c021c271949 GIT binary patch literal 1754 zcmaJ?c~BEq98L)yC{(Tiv^Ff^C>=;P2O%U90ZEVmp%`#rurqa&ERca@L$W}^Q4uT% zE!3i=iqk5WD56pwLA<3L1}F+T*oxEviWCq6LXktH8wBhhr8~3xj`_atcfPkdA;G&% zHf`I4!{JQ${#+q80{V9&9{Y03a+|PWE6R&NLy;&n2~xs19|!1w?SPRL&vlZrmXPQVE9`&Ja)p z3ST%z>YuEHLz9EU#L2N@mW1fF6Yx~CF##EjLV#KpCs(o69O9BL8=LF5K_ajOL1Q_@ zcTPnJLI7Vx2?Go=g(Rl9Qvi1=nM!wKGMTObjY6e>6dFjSk*G{IoyMk6faQmXSyM`) z*g~$~vMp@IA;zGnf(?R6NlD}+IvG($gH#rarPrX*NEm{o(#TOrO_HnZR}{FgO01MB zP$?n@^oo!ONkBP7%+q%v$P}xxa@BI0u!MnXNC8sG6n#i5K!M=@p)%PjT7?SX_x}E; zuqsTWfI%UwLK2i>tZ-5GdQ%FvuM&n(L>Y!4aVuF2i9t|A6@w@M-%ti1fW%U{e!YYj z2-tkN3Welin9t=9F$JBDeiFqzyHE*B9e z$Y43T!j-(|y06LAw}MQ8S?0n@X(BA~Qz9~8DP*>EZC~hX>Me66Yy0B1CKtq<0riFb zSD{z7ut4i69CzI|IP7Mq)!TUc0(jEt;bzkYmtyt1-#c6RpO zy?fiYZ=ai+d-?LEi;K(j^z`}j=LrOYR;wKw8`J4@?(XjK@$t#Y$%%=H8jZ%y%?*N} ziHV8a+}xp|q2}i1?Ck8mzP_58nxdj2Hk)l@V>3B9X=`iS($W$T5TH;f5Cox8ss8@{ zO-)TzRaL#cy#)mY-QC@fA3ttwZMC$tY-ngWeE4uqPL4{Y;`8|^ippfNz`($updcEJ zcHqE)y1Kf|%*=|4iv0Zij*gD0sj056E^lvd7={}g8w(2yOG-)(9XhnIupknN`uqE( zQfW_5&&P$(=fFHcWTKYRA7EiNvGc$&9j zwW#NFeZtgF8yO#}$F1F)7DHO@th2MHJ?!3LO5L^F;EE-F%G-N`$Z?Xgaf2C&nKd_` zy=}lbqc;=ylme44%5-gUmqzPva6`7E{Hn3pXBwYV8L2KCYx5^JAKSUb zxi_{w=h9y;MW$4fih+t9&ZGFiy%yG|zDOe#Jt!ob==yeO=pXGRS=%^wHT`xZ#af$i z*Q=?#dxY|NNMl3h$ju~Un+p@?&`(&YrRkNM*Ygr31)h#S5IU#vA6ole7Cl@yP|a8xY|=YfBbL4o<^m`#Fo^9 z+UwuG`G$TYhMYo{p7sRCGf$vtc-s@(NHKG%zdt%t?x!-F`KkJ?@RxmE?I2Jvxzp0+ zcui&m{Guw=@#NO$*Eo3rud81W@^s&M!4;5I#)Y~uNE`q4%~>aA2VsB!M$F>-#|+QJ z{9JvNekCEVxUcx`oBU@{9uD@k*Uu5mSX-aAd>P~N;(5c{#f6i13~g{C#aG8{Ii^$k OzYU)k%)Pj4f5tz&oxaup literal 0 HcmV?d00001 diff --git a/app/assets/images/social_media_logos/wordpress-48x48.png b/app/assets/images/social_media_logos/wordpress-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4635172729c6b4785dae90f32a3bbd2b5581f6 GIT binary patch literal 2282 zcmaJ@dpJ~iA0JZDo7GC&Q(HM5rM#G{F^pSdW`vBjV>T1@YAy$3noBbyBbP-RqqHc| zY86&)OGF5b&@A2(g;bKLT0NPuLiF-W;U46_jkTL-zA#oBnD?eAP~#|EE0C1h^NtrE<&k{CFDRZ6gv=BK=OE8qN4=?r|u1vgtx+As8}nsHPycGAciATAPMgX#C4L01i;6ViM%i8LinQICocEPxmbOX zi-MCusSozQ4ti+|c8_}c*|zZFv+*Gz>~;xkYlC8rD*~Yr>EXtps#L1d(o%sypj0aB z>gt3-A(cvvkB^s1r6*3DICA7jNlD4}?c1}nv!kM-Hf-2XTU$FkJe-u2l$DhwlgUCt zLQG6dDk>@(8yi=zUj6v-3}*s;XkM+3D%&AP6QW zCnJ$acXxLmA0KCDXR%mpYHAu77-(f>MW@rbTyAJ+sE3CKgTa`ao12}TU07I{pPwHa z8=IbtdwV-NI_}@U&tkDIT)5EH z)z#kKu23jOMn=ZR$Mf>?ii(Qj;^JPve*N<0%bJ>+ix)3eS6BD<_rH1bW@2JuaBy&F zXsEfld31Et-`{`#{{8v+`S0Gno1C0%X=%B4@7}|Q51%}F^5MgW2M-=RfByW{t5)tKnf=#Qe!|Xr~tft45zCz zYYg;tRX=$0>SfPtF`@seG@zhW@~op}zQJZZVz?*xsq)6ks2_2PMdOS>SK~8n{@4>a z3+poW@2t(J^z*BDzWxu#58p-UtqVPul(`sM&Y5UmT8nNXFH?mUnPX|r!E>p)tb5|)&%aOyL-1#cfIo~ zH;hd6)Yl%|cRNUPCfdm6k?ZR0{8Ya_WsvT<^WA+r!`4rnUibFpwnAMcL1Xid9mHVc zXoT%}n5b-_{!)0QLihBb6VbTt>`#}Ft#=L`I1U-R+YFBW?)8=XyRK7)gqw+B6LyJZ z$Hwa2Dtb!}HRn^=(;XuPok*u0x0|5JZ!L~h_WMrSfAV`?s+ ztDS+a-BLtJHL^l*=&g>^S@A{t!hN=hW2^kUeXV=Hzdk*5RtHTdKGKV}C^>19-AiNn z^1aMMHT2&uSe4A~$VrYTum5@ZmI!{|FBjsjvohxtyUkR2Czi3BmUm=^LX)vpOe2pG zv-+Jh9Ss$EWwyD6sqd^Hr*z}`-AdjLpubAhL%cEeuaxwS5fQhVP@C$?pL*n+#ChK& z#Z%?Tc^rtZrX@7IjY%<#mxt?98nt8d@#x)}!?zMatpf`C8vca`xg&eSN8h`}VShP% zIOiF;aNE}IG2~Pl`&?ekUuSv6P(_n_|C9_NZyx^bBlUYwLD|~KQ`s9C6RGieK*?-+eGXs{`qSkwaUsL-P{(2TpS8-IdIM9yyxdtiEn=Okuw_Yp4d$C64&|$73-A`g}F_|+-=cw o9ex^7x={byw8Ql1I5koOAzb8|%$h$ "https://public-api.wordpress.com").post do |req| + req.url "/rest/v1/sites/#{self.uid}/posts/new" + req.body = post_body(post).to_json + req.headers['Authorization'] = "Bearer #{self.access_token}" + req.headers['Content-Type'] = 'application/json' + end + JSON.parse res.env[:body] + end + + def post_body(post, url='') + post_text = markdownify(post.text) + post_title = truncate(strip_markdown(post.text(:plain_text => true)), :length => 40, :separator => ' ') + + {:title => post_title, :content => post_text.html_safe} + end + +end diff --git a/config/defaults.yml b/config/defaults.yml index 7454595bf..5ab5f71ae 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -92,6 +92,10 @@ defaults: enable: false key: secret: + wordpress: + enable: false + key: + secret: mail: enable: false sender_address: 'no-reply@example.org' diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example index 2395d468d..18c1ff3fd 100644 --- a/config/diaspora.yml.example +++ b/config/diaspora.yml.example @@ -328,6 +328,12 @@ configuration: ## Section #enable: true #key: 'abcdef' #secret: 'changeme' + + ## OAuth credentials for Wordpress + wordpress: ## Section + #enable: true + #client_id: 'abcdef' + #secret: 'changeme' ## Settings relevant to administrators admins: ## Section diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 67ec29747..63b54f4e8 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -26,4 +26,8 @@ Rails.application.config.middleware.use OmniAuth::Builder do } } end + + if AppConfig.services.wordpress.enable? + provider :wordpress, AppConfig.services.wordpress.client_id, AppConfig.services.wordpress.secret + end end diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb index 4b08dfec0..60bdda8bb 100644 --- a/lib/configuration_methods.rb +++ b/lib/configuration_methods.rb @@ -24,7 +24,7 @@ module Configuration return @configured_services unless @configured_services.nil? @configured_services = [] - [:twitter, :tumblr, :facebook].each do |service| + [:twitter, :tumblr, :facebook, :wordpress].each do |service| @configured_services << service if services.send(service).enable? end diff --git a/spec/lib/configuration_methods_spec.rb b/spec/lib/configuration_methods_spec.rb index a87038de2..e1ba743f1 100644 --- a/spec/lib/configuration_methods_spec.rb +++ b/spec/lib/configuration_methods_spec.rb @@ -61,10 +61,12 @@ describe Configuration::Methods do services.stub(:twitter).and_return(enabled) services.stub(:tumblr).and_return(enabled) services.stub(:facebook).and_return(disabled) + services.stub(:wordpress).and_return(disabled) @settings.stub(:services).and_return(services) @settings.configured_services.should include :twitter @settings.configured_services.should include :tumblr @settings.configured_services.should_not include :facebook + @settings.configured_services.should_not include :wordpress end end diff --git a/spec/models/services/wordpress_spec.rb b/spec/models/services/wordpress_spec.rb new file mode 100644 index 000000000..fd970d839 --- /dev/null +++ b/spec/models/services/wordpress_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' + +describe Services::Wordpress do + + before do + @user = alice + @post = @user.post(:status_message, + :text => "Hello there. This is a **Wordpress** post that we hope to turn into something else.", + :to => @user.aspects.first.id) + + @service = Services::Wordpress.new(:nickname => "andrew", + :access_token => "abc123", + :uid => "123") + @user.services << @service + end + + describe "#post" do + it 'posts a status message to wordpress' do + stub_request(:post, "https://public-api.wordpress.com/rest/v1/sites/123/posts/new").to_return(:status => 200, :body => {:ID => 68}.to_json, :headers => {}) + @service.post(@post) + end + end + + describe "#post_body" do + it "truncates content for use in title" do + @service.post_body(@post)[:title].should eq("Hello there. This is a Wordpress post...") + end + it "converts markdown tags" do + @service.post_body(@post)[:content].should match("Wordpress") + end + end + +end