cliblog 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,340 @@
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Library General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License
307
+ along with this program; if not, write to the Free Software
308
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
309
+
310
+
311
+ Also add information on how to contact you by electronic and paper mail.
312
+
313
+ If the program is interactive, make it output a short notice like this
314
+ when it starts in an interactive mode:
315
+
316
+ Gnomovision version 69, Copyright (C) year name of author
317
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
318
+ This is free software, and you are welcome to redistribute it
319
+ under certain conditions; type `show c' for details.
320
+
321
+ The hypothetical commands `show w' and `show c' should show the appropriate
322
+ parts of the General Public License. Of course, the commands you use may
323
+ be called something other than `show w' and `show c'; they could even be
324
+ mouse-clicks or menu items--whatever suits your program.
325
+
326
+ You should also get your employer (if you work as a programmer) or your
327
+ school, if any, to sign a "copyright disclaimer" for the program, if
328
+ necessary. Here is a sample; alter the names:
329
+
330
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
331
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
332
+
333
+ <signature of Ty Coon>, 1 April 1989
334
+ Ty Coon, President of Vice
335
+
336
+ This General Public License does not permit incorporating your program into
337
+ proprietary programs. If your program is a subroutine library, you may
338
+ consider it more useful to permit linking proprietary applications with the
339
+ library. If this is what you want to do, use the GNU Library General
340
+ Public License instead of this License.
data/ChangeLog ADDED
@@ -0,0 +1,8 @@
1
+ * 0.1.5 (2005-06-27)
2
+ - Initial CVS Release and File Release.
3
+ * 0.1.3 (2005-06-27)
4
+ - Add rake target: 'install', 'uninstall'
5
+ - Add documentation. rake doc. gem installs doc.
6
+ - No CVS Release tag.
7
+ * 0.1.0 (2005-06-27)
8
+ - Initial Release. No CVS Release tag.
data/README ADDED
@@ -0,0 +1,33 @@
1
+ = Command Line Interface for BLOG
2
+
3
+ == Summary
4
+ cliblog is a command-line blog client. It loops waiting for
5
+ command-line input, and if 'edit' or 'create' command is input,
6
+ then it will launch user's favorite EDITOR brought from ENV
7
+ variable. Or you can input your editor's path manually if
8
+ ENV['EDITOR'] is not set. As for me, I'm using 'vim' for my
9
+ personal typo-powered blog.
10
+
11
+ == Requirements
12
+ * Ruby 1.8.2 or greater.
13
+ * HighLine: http://highline.rubyforge.org/
14
+
15
+ == Installation
16
+ === RubyGems
17
+ # gem install cliblog
18
+ Now, copy conf/cliblog.yml to ~/.cliblog.yml. Edit ~/.cliblog.yml.
19
+ === Rake Install
20
+ # rake install
21
+ this simply copy files: lib/cliblog.rb to 'sitedir', bin/cliblog to
22
+ 'bindir', and conf/cliblog.yml to 'homedir'.
23
+
24
+ == Thanks
25
+ * Matsumoto Yukihiro aka matz.
26
+ * James Edward Gray II for HighLine.
27
+ * Tobias Luetke for Typo.
28
+
29
+ == Author
30
+ Gyoung-Yoon Noh <nohmad (AT) sub-port (DOT) net>
31
+
32
+ == License
33
+ GPL or Ruby's License
data/TODO ADDED
@@ -0,0 +1,13 @@
1
+ * Support Blogger API, MovableType API by configuration.
2
+ - See http://www.devdaily.com/scw/ruby/blogclient-0.0.20041025/lib/blog/client.rb.shtml
3
+ - Considerable refactoring needed.
4
+ * Replace YAML template when editing.
5
+ - Depend on parser or configuration.
6
+ * Support rubygems installation.
7
+ - Invest how to manipulate executable and config files.
8
+ * Write tests.
9
+ - How to write? Implement server?
10
+ * L10N, iconv?
11
+ * Windows support.
12
+ - HightLine is broken? Report bug or request feature.
13
+ * More smooth control needed against when launched editor has quit.
data/bin/cliblog ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: ft=ruby fdl=1
3
+
4
+ # = Command Line Interface for BLOG
5
+ #
6
+ # +Created+:: 2005-06-26
7
+ # +Author+:: Gyoung-Yoon Noh <nohmad (AT) sub-port (DOT) net>
8
+ # +License+:: GPL or Ruby's
9
+ #
10
+ # $Id: cliblog,v 1.3 2005/06/27 05:14:51 nohmad Exp $
11
+
12
+ require 'cliblog'
13
+
14
+ require 'optparse'
15
+ require 'yaml'
16
+
17
+ opts = Struct.new(:blog, :yml).new
18
+ op = OptionParser.new
19
+ op.on('-y Config', 'YAML format.') { |yml| opts.yml = yml }
20
+ opts.blog = op.parse(ARGV).first
21
+ unless opts.blog
22
+ puts op.help
23
+ exit 1
24
+ end
25
+ opts.yml ||= File.join((ENV['HOME'] || ENV['HOMEPATH']), '.cliblog.yml')
26
+
27
+ conf = BlogConfig.new
28
+ begin
29
+ y = YAML.load(File.open(opts.yml))[opts.blog]
30
+ EDITOR = y.delete('editor')
31
+ y.each_pair {|k,v| conf[k] = v }
32
+ rescue => e
33
+ fail e
34
+ end
35
+
36
+ cliblog = CliBlog.new(conf)
37
+
38
+ # blog login
39
+ puts "\nNow, you're trying to login <<#{conf.blogid}>>"
40
+ catch :login_success do
41
+ begin
42
+ cliblog.login
43
+ throw :login_success
44
+ rescue
45
+ puts "#{$!}... Retrying..."
46
+ redo
47
+ end
48
+ end
49
+
50
+ # command loop
51
+ begin
52
+ cliblog.command_loop
53
+ rescue
54
+ fail $!
55
+ end
data/bin/trackback.rb ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # = Send trackback using EDITOR.
4
+ #
5
+ # See http://www.sixapart.com/pronet/docs/trackback_spec
6
+ #
7
+ # - License : Ruby's
8
+ # - Author : Gyoung-Yoon Noh <nohmad@sub-port.net>
9
+ #
10
+ # TODO:
11
+ # - How to get comment from xml document? (SGML Parser or strscan?)
12
+ #
13
+ # $Id: trackback.rb 132 2005-06-23 23:59:53Z nohmad $
14
+
15
+ require 'cgi'
16
+ require 'net/http'
17
+ require 'tempfile'
18
+ require 'uri'
19
+ require 'yaml'
20
+
21
+
22
+
23
+ if $0 == __FILE__ then
24
+ msg = TrackBack::Message.new
25
+
26
+ Tempfile.open('trackback-') do |tf|
27
+ # Read template.
28
+ tf << DATA.read
29
+ tf.fsync
30
+
31
+ # Launch EDITOR.
32
+ Thread.new(tf.path) do |path|
33
+ unless editor = ENV['EDITOR']
34
+ $stdout.sync = $stdin.sync = true
35
+ $stdout.write "EDITOR path: "
36
+ editor = $stdin.gets.chomp
37
+ end
38
+ system "#{editor} #{path}"
39
+ end.join
40
+
41
+ # Fill sending message.
42
+ tf.seek(0)
43
+ yaml = YAML.load(tf.read)
44
+ begin
45
+ yaml.each_pair do |key, value|
46
+ if key == 'TB-URL' then
47
+ $tb_url = value
48
+ else
49
+ msg[key.downcase.sub('-', '_')] = value.to_s.strip
50
+ end
51
+ end
52
+ rescue
53
+ fail $!
54
+ end
55
+ end
56
+
57
+ fail "-!- Wrong Input -!-" if
58
+ msg.members.select{ |k| msg.send(k).nil? or msg.send(k).empty? }.any?
59
+ p TrackBack::send_ping($tb_url, msg)
60
+ end
61
+
62
+ TB_TEMPLATE = <<END_TBTPL
63
+ ---
64
+ TB-URL : '<TrackBack Ping URL>'
65
+ URL : '<Your Blog URL>'
66
+ Blog-Name : '<Your Blog Name>'
67
+ Title : '<This Entry Title>'
68
+ Excerpt :
69
+ END_TBTPL
data/conf/cliblog.yml ADDED
@@ -0,0 +1,6 @@
1
+ typo:
2
+ blogid: nohmad's breakpoint
3
+ editor: vim
4
+ api: metaweblog
5
+ text_formatter: markdown
6
+ url: http://nohmad.sub-port.net/typo/backend/api
data/lib/cliblog.rb ADDED
@@ -0,0 +1,192 @@
1
+ # = Command Line Interface for BLOG
2
+ #
3
+ # +Created+:: 2005-06-26
4
+ # +Author+:: Gyoung-Yoon Noh
5
+ # +License+:: GPL or Ruby's
6
+ #
7
+ # $Id: cliblog.rb,v 1.3 2005/06/27 06:13:32 nohmad Exp $
8
+
9
+ require 'highline/import'
10
+ require 'tempfile'
11
+ require 'uri'
12
+ require 'xmlrpc/client'
13
+ require 'yaml'
14
+
15
+ COMMANDS = %w{ list view create edit delete category help quit }
16
+ BlogConfig = Struct.new(:blogid, :url, :api, :text_formatter, :username, :password)
17
+ POST_TEMPLATE = <<END_TPL
18
+ ---
19
+ title:
20
+ categories: []
21
+ description: |-
22
+
23
+ mt_text_more: ''
24
+ mt_excerpt: ''
25
+ mt_allow_pings: 1
26
+ mt_allow_comments: 1
27
+ mt_convert_breaks: markdown
28
+ END_TPL
29
+
30
+ class CliBlog
31
+ def initialize(conf)
32
+ @blogid = conf.blogid
33
+ server = URI.parse(conf.url)
34
+ proxy = Struct.new(:host, :port).new
35
+ if ENV.has_key? 'http_proxy' then
36
+ proxy = URI.parse(ENV['http_proxy'])
37
+ proxy.host = proxy.host
38
+ proxy.port = proxy.port
39
+ end
40
+ @xmlrpc = XMLRPC::Client.new(server.host, server.path, server.port,
41
+ proxy.host, proxy.port)
42
+ end
43
+ def login
44
+ @username = ask('Username: ')
45
+ @password = ask('Password: ') {|q| q.echo = false }
46
+ begin
47
+ _list
48
+ rescue XMLRPC::FaultException => e
49
+ raise "Cannot login"
50
+ end
51
+ end
52
+ def method_missing(cmd, *arg)
53
+ @arg = *arg
54
+ send("_#{cmd.to_s}".to_sym) if COMMANDS.include? cmd.to_s
55
+ end
56
+ def command_loop
57
+ cmd = arg = nil
58
+ loop do
59
+ print_commands
60
+ case input = ask(">> ")
61
+ when /^(exit|q|quit)/ then break
62
+ when /^(\d+)/
63
+ cmd = 'view'
64
+ arg = $1
65
+ else
66
+ cmd, arg = input.split(' ', 2)
67
+ cmd ||= 'list'
68
+ end
69
+ send(cmd.to_sym, arg)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def _list
76
+ case @arg.to_s
77
+ when /(\d+|\d+\.\.\.?\d+)/ then
78
+ # XXX: getting posts of arbitrary range possible?
79
+ else
80
+ @arg = 10
81
+ end
82
+ result = @xmlrpc.call('metaWeblog.getRecentPosts',
83
+ @blogid, @username, @password, @arg)
84
+ if result.empty?
85
+ puts "No result!"
86
+ return
87
+ end
88
+ header_around { puts " id | date | title" }
89
+ result.each do |e|
90
+ d = e['dateCreated']
91
+ printf "%4s | %04d-%02d-%02d | %s#{$/}",
92
+ e['postid'], d.year, d.month, d.day, e['title']
93
+ end
94
+ end
95
+ def _view
96
+ result = @xmlrpc.call('metaWeblog.getPost',
97
+ @arg, @username, @password)
98
+ header_around do
99
+ date = result['dateCreated'].instance_eval do
100
+ "%04d-%02d-%02d %02d:%02d:%02d" % [year, month, day, hour, min, sec]
101
+ end
102
+ puts "PostId : #{result['postid']}"
103
+ puts "Title : #{result['title']}"
104
+ puts "Created : #{date}"
105
+ puts "Categories : #{result['categories'].join(', ')}"
106
+ end
107
+ puts result['description']
108
+ end
109
+ def _create
110
+ yml = YAML.load(POST_TEMPLATE)
111
+ post = launch_editor(yml)
112
+ result = @xmlrpc.call('metaWeblog.newPost', @blogid,
113
+ @username, @password, post, publish=0)
114
+ if result then
115
+ puts "Created new post."
116
+ else
117
+ puts "Failed to create new post"
118
+ end
119
+ end
120
+ def _edit
121
+ unless Fixnum === (postid = @arg.to_i) then
122
+ say "Wrong argument type! You should Input number."
123
+ return
124
+ end
125
+ result = @xmlrpc.call('metaWeblog.getPost',
126
+ postid, @username, @password)
127
+ post = launch_editor(result)
128
+ result = @xmlrpc.call('metaWeblog.editPost',
129
+ postid, @username, @password, post, publish=0)
130
+ if result then
131
+ say "Edited postid #{postid}"
132
+ else
133
+ say "Failed to edit postid #{postid}"
134
+ end
135
+ end
136
+ def _delete
137
+ postid = @arg.to_i
138
+ result = @xmlrpc.call('metaWeblog.deletePost', @blogid,
139
+ postid, @username, @password, publish=1)
140
+ if result then
141
+ puts "Deleted postid #{postid}."
142
+ else
143
+ puts "Fail to delete postid #{postid}"
144
+ end
145
+ end
146
+ def _category
147
+ result = @xmlrpc.call('metaWeblog.getCategories',
148
+ @blogid, @username, @password)
149
+ say "Categories: #{result.join(', ')}"
150
+ end
151
+ def _help
152
+ return say("help <command>") unless @arg
153
+ case @arg
154
+ when /list/
155
+ say "list <articles>. If omitted <articles> then default value is recent 10."
156
+ when /(edit|view|delete)/
157
+ say "#$1 <postid>"
158
+ when /(new|category)/
159
+ say "#$1"
160
+ end
161
+ end
162
+
163
+ def print_commands
164
+ say "<%= color('COMMANDS: ', :white, :on_blue) %>"\
165
+ "<%= color(' #{COMMANDS.join(' ')} ', :yellow, :on_blue) %>"
166
+ end
167
+ def header_around(&block)
168
+ puts
169
+ puts '=' * 80
170
+ block.call
171
+ puts '-' * 80
172
+ end
173
+ def launch_editor(result)
174
+ edited = nil
175
+ Tempfile.open('cliblog-') do |tmf|
176
+ tmf << YAML.dump(result)
177
+ tmf.fsync
178
+ Thread.new(tmf.path) do |path|
179
+ unless editor = (EDITOR || ENV['EDITOR']) then
180
+ STDOUT.sync = STDIN.sync = true
181
+ editor = ask(">> EDITOR-PATH: ")
182
+ end
183
+ system "#{editor} #{path}"
184
+ end.join
185
+ tmf.seek(0)
186
+ edited = YAML.load(tmf.read)
187
+ end
188
+ return edited
189
+ end
190
+ end
191
+
192
+ # vim: fdl=1
@@ -0,0 +1,29 @@
1
+ # = Test for CliBlog
2
+ #
3
+ # $Id: tc_cliblog.rb,v 1.1.1.1 2005/06/27 01:32:12 nohmad Exp $
4
+
5
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
+ require 'cliblog'
7
+
8
+ require 'test/unit'
9
+
10
+ class CliBlogTest < Test::Unit::TestCase
11
+ def setup
12
+ # conf = Struct.new(:blogid, :url, :api, :username, :password).new
13
+ # @cliblog = CliBlog.new(conf)
14
+ end
15
+
16
+ def test_login
17
+ # @cliblog.login
18
+ end
19
+ def test_list
20
+ end
21
+ def test_view
22
+ end
23
+ def test_category
24
+ end
25
+ def test_edit
26
+ end
27
+ def test_delete
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ # = Test for CliBlog
2
+ #
3
+ # $Id: tc_option_config.rb,v 1.1.1.1 2005/06/27 01:32:12 nohmad Exp $
4
+
5
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
+ require 'cliblog'
7
+
8
+ require 'test/unit'
9
+
10
+ class OptionConfigTest < Test::Unit::TestCase
11
+ def setup
12
+ end
13
+ def teardown
14
+ end
15
+
16
+ def test_option_parse
17
+ end
18
+ def test_config_parse
19
+ end
20
+ end
21
+
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.10
3
+ specification_version: 1
4
+ name: cliblog
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.5
7
+ date: 2005-06-27
8
+ summary: cliblog is a command-line blog client.
9
+ require_paths:
10
+ - lib
11
+ - bin
12
+ email: nohmad (AT) sub-port (DOT) net
13
+ homepage:
14
+ rubyforge_project: cliblog
15
+ description: "cliblog is a command-line blog client. It loops waiting for command-line input,
16
+ and if 'edit' or 'create' command is input, then it will launch user's favorite
17
+ EDITOR brought from ENV variable. Or you can input your editor's path manually
18
+ if ENV['EDITOR'] is not set. As for me, I'm using 'vim' for my personal
19
+ typo-powered blog."
20
+ autorequire:
21
+ default_executable:
22
+ bindir: bin
23
+ has_rdoc: true
24
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
+ requirements:
26
+ -
27
+ - ">"
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.0
30
+ version:
31
+ platform: ruby
32
+ authors:
33
+ - Gyoung-Yoon Noh
34
+ files:
35
+ - lib/cliblog.rb
36
+ - test/tc_cliblog.rb
37
+ - test/tc_option_config.rb
38
+ - bin/CVS
39
+ - bin/cliblog
40
+ - bin/trackback.rb
41
+ - conf/CVS
42
+ - conf/cliblog.yml
43
+ - README
44
+ - COPYING
45
+ - TODO
46
+ - ChangeLog
47
+ test_files:
48
+ - test/tc_cliblog.rb
49
+ - test/tc_option_config.rb
50
+ rdoc_options:
51
+ - "--title"
52
+ - CliBlog Documentation
53
+ - "--main"
54
+ - README
55
+ - "--all"
56
+ - "--line-numbers"
57
+ - "--inline-source"
58
+ extra_rdoc_files:
59
+ - README
60
+ - COPYING
61
+ - TODO
62
+ - ChangeLog
63
+ executables:
64
+ - cliblog
65
+ extensions: []
66
+ requirements: []
67
+ dependencies:
68
+ - !ruby/object:Gem::Dependency
69
+ name: HighLine
70
+ version_requirement:
71
+ version_requirements: !ruby/object:Gem::Version::Requirement
72
+ requirements:
73
+ -
74
+ - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 0.6.1
77
+ version: