diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8e8b33ee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +._* +.DS_Store +.yardoc +coverage +doc +heckling +pkg +specdoc diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 000000000..6dd64ed7f --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,3 @@ +== 0.1.0 + +* initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..ef51da2b0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README b/README new file mode 100644 index 000000000..20ef1e097 --- /dev/null +++ b/README @@ -0,0 +1,26 @@ +== APIClient + +Homepage:: google-api-ruby-client[http://code.google.com/p/google-api-ruby-client/] +Authors:: Bob Aman (mailto:bobaman@google.com), Matt Pokrzywa (mailto:mattpok@google.com) +Copyright:: Copyright 2010 Google Inc. +License:: Apache 2.0 + +== Description + +The Google API Ruby Client makes it trivial to discover and access supported APIs. + +== Features + +* A feature list goes here. + +== Example Usage + + # Some code goes here. + +== Requirements + +* APIClient has no dependencies. + +== Install + +* sudo gem install google-api-client diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..44441649c --- /dev/null +++ b/Rakefile @@ -0,0 +1,51 @@ +lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib")) +$:.unshift(lib_dir) +$:.uniq! + +require 'rubygems' +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' +require 'rake/packagetask' +require 'rake/gempackagetask' + +begin + require 'spec/rake/spectask' +rescue LoadError + STDERR.puts "Please install RSpec." + exit(1) +end + +require File.join(File.dirname(__FILE__), 'lib/google/api_client', 'version') + +PKG_DISPLAY_NAME = 'Google API Client' +PKG_NAME = PKG_DISPLAY_NAME.downcase.gsub(/\s/, "-") +PKG_VERSION = Google::APIClient::VERSION::STRING +PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" +PKG_HOMEPAGE = "http://code.google.com/p/google-api-ruby-client/" + +RELEASE_NAME = "REL #{PKG_VERSION}" + +PKG_SUMMARY = "Package Summary" +PKG_DESCRIPTION = <<-TEXT +The Google API Ruby Client makes it trivial to discover and access supported +APIs. +TEXT + +PKG_FILES = FileList[ + "lib/**/*", "spec/**/*", "vendor/**/*", + "tasks/**/*", "website/**/*", + "[A-Z]*", "Rakefile" +].exclude(/database\.yml/).exclude(/[_\.]git$/) + +RCOV_ENABLED = (RUBY_PLATFORM != "java" && RUBY_VERSION =~ /^1\.8/) +if RCOV_ENABLED + task :default => "spec:verify" +else + task :default => "spec" +end + +WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false +SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) + +Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/lib/google/api_client.rb b/lib/google/api_client.rb new file mode 100644 index 000000000..684d70f6a --- /dev/null +++ b/lib/google/api_client.rb @@ -0,0 +1,15 @@ +# Copyright 2010 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require "google/api_client/version" diff --git a/lib/google/api_client/version.rb b/lib/google/api_client/version.rb new file mode 100644 index 000000000..dd8e8a806 --- /dev/null +++ b/lib/google/api_client/version.rb @@ -0,0 +1,28 @@ +# Copyright 2010 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Used to prevent the class/module from being loaded more than once +unless defined? Google::APIClient::VERSION + module Google + module APIClient #:nodoc: + module VERSION #:nodoc: + MAJOR = 0 + MINOR = 1 + TINY = 0 + + STRING = [MAJOR, MINOR, TINY].join('.') + end + end + end +end diff --git a/spec/spec.opts b/spec/spec.opts new file mode 100644 index 000000000..5779d6236 --- /dev/null +++ b/spec/spec.opts @@ -0,0 +1,2 @@ +--colour +--format specdoc diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 000000000..9281c15c7 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,7 @@ +spec_dir = File.expand_path(File.dirname(__FILE__)) +lib_dir = File.expand_path(File.join(spec_dir, "../lib")) + +$:.unshift(lib_dir) +$:.uniq! + +require "api_client" diff --git a/tasks/clobber.rake b/tasks/clobber.rake new file mode 100644 index 000000000..093ce817b --- /dev/null +++ b/tasks/clobber.rake @@ -0,0 +1,2 @@ +desc "Remove all build products" +task "clobber" diff --git a/tasks/gem.rake b/tasks/gem.rake new file mode 100644 index 000000000..e6f9c74e6 --- /dev/null +++ b/tasks/gem.rake @@ -0,0 +1,65 @@ +require "rake/gempackagetask" + +namespace :gem do + GEM_SPEC = Gem::Specification.new do |s| + unless s.respond_to?(:add_development_dependency) + puts "The gem spec requires a newer version of RubyGems." + exit(1) + end + + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = PKG_SUMMARY + s.description = PKG_DESCRIPTION + + s.files = PKG_FILES.to_a + + s.has_rdoc = true + s.extra_rdoc_files = %w( README ) + s.rdoc_options.concat ["--main", "README"] + + s.add_development_dependency("rake", ">= 0.8.3") + s.add_development_dependency("rspec", ">= 1.1.11") + s.add_development_dependency("launchy", ">= 0.3.2") + + s.require_path = "lib" + + s.homepage = PKG_HOMEPAGE + end + + Rake::GemPackageTask.new(GEM_SPEC) do |p| + p.gem_spec = GEM_SPEC + p.need_tar = true + p.need_zip = true + end + + desc "Show information about the gem" + task :debug do + puts GEM_SPEC.to_ruby + end + + desc "Install the gem" + task :install => ["clobber", "gem:package"] do + sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" + end + + desc "Uninstall the gem" + task :uninstall do + installed_list = Gem.source_index.find_name(PKG_NAME) + if installed_list && + (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) + sh( + "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + + "--ignore-dependencies --executables #{PKG_NAME}" + ) + end + end + + desc "Reinstall the gem" + task :reinstall => [:uninstall, :install] +end + +desc "Alias to gem:package" +task "gem" => "gem:package" + +task "clobber" => ["gem:clobber_package"] diff --git a/tasks/git.rake b/tasks/git.rake new file mode 100644 index 000000000..8c318cb96 --- /dev/null +++ b/tasks/git.rake @@ -0,0 +1,40 @@ +namespace :git do + namespace :tag do + desc "List tags from the Git repository" + task :list do + tags = `git tag -l` + tags.gsub!("\r", "") + tags = tags.split("\n").sort {|a, b| b <=> a } + puts tags.join("\n") + end + + desc "Create a new tag in the Git repository" + task :create do + changelog = File.open("CHANGELOG", "r") { |file| file.read } + puts "-" * 80 + puts changelog + puts "-" * 80 + puts + + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION + + tag = "#{PKG_NAME}-#{PKG_VERSION}" + msg = "Release #{PKG_NAME}-#{PKG_VERSION}" + + existing_tags = `git tag -l #{PKG_NAME}-*`.split("\n") + if existing_tags.include?(tag) + warn("Tag already exists, deleting...") + unless system "git tag -d #{tag}" + abort "Tag deletion failed." + end + end + puts "Creating git tag '#{tag}'..." + unless system "git tag -a -m \"#{msg}\" #{tag}" + abort "Tag creation failed." + end + end + end +end + +task "gem:release" => "git:tag:create" diff --git a/tasks/metrics.rake b/tasks/metrics.rake new file mode 100644 index 000000000..41fc5c2b9 --- /dev/null +++ b/tasks/metrics.rake @@ -0,0 +1,22 @@ +namespace :metrics do + task :lines do + lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 + for file_name in FileList["lib/**/*.rb"] + f = File.open(file_name) + while line = f.gets + lines += 1 + next if line =~ /^\s*$/ + next if line =~ /^\s*#/ + codelines += 1 + end + puts "L: #{sprintf("%4d", lines)}, " + + "LOC #{sprintf("%4d", codelines)} | #{file_name}" + total_lines += lines + total_codelines += codelines + + lines, codelines = 0, 0 + end + + puts "Total: Lines #{total_lines}, LOC #{total_codelines}" + end +end diff --git a/tasks/rdoc.rake b/tasks/rdoc.rake new file mode 100644 index 000000000..1f636c969 --- /dev/null +++ b/tasks/rdoc.rake @@ -0,0 +1,29 @@ +require "rake/rdoctask" + +namespace :doc do + desc "Generate RDoc documentation" + Rake::RDocTask.new do |rdoc| + rdoc.rdoc_dir = "doc" + rdoc.title = "#{PKG_NAME}-#{PKG_VERSION} Documentation" + rdoc.options << "--line-numbers" << "--inline-source" << + "--accessor" << "cattr_accessor=object" << "--charset" << "utf-8" + rdoc.template = "#{ENV["template"]}.rb" if ENV["template"] + rdoc.rdoc_files.include("README", "CHANGELOG", "LICENSE") + rdoc.rdoc_files.include("lib/**/*.rb") + end + + desc "Generate ri locally for testing" + task :ri do + sh "rdoc --ri -o ri ." + end + + desc "Remove ri products" + task :clobber_ri do + rm_r "ri" rescue nil + end +end + +desc "Alias to doc:rdoc" +task "doc" => "doc:rdoc" + +task "clobber" => ["doc:clobber_rdoc", "doc:clobber_ri"] diff --git a/tasks/spec.rake b/tasks/spec.rake new file mode 100644 index 000000000..3ac596100 --- /dev/null +++ b/tasks/spec.rake @@ -0,0 +1,63 @@ +require 'spec/rake/verify_rcov' + +namespace :spec do + Spec::Rake::SpecTask.new(:rcov) do |t| + t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_opts = ['--color', '--format', 'specdoc'] + if RCOV_ENABLED + t.rcov = true + else + t.rcov = false + end + t.rcov_opts = [ + '--exclude', 'spec', + '--exclude', '1\\.8\\/gems', + '--exclude', '1\\.9\\/gems' + ] + end + + Spec::Rake::SpecTask.new(:normal) do |t| + t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_opts = ['--color', '--format', 'specdoc'] + t.rcov = false + end + + if RCOV_ENABLED + RCov::VerifyTask.new(:verify) do |t| + t.threshold = 100.0 + t.index_html = 'coverage/index.html' + end + + task :verify => :rcov + end + + desc "Generate HTML Specdocs for all specs" + Spec::Rake::SpecTask.new(:specdoc) do |t| + specdoc_path = File.expand_path( + File.join(File.dirname(__FILE__), '../specdoc/')) + Dir.mkdir(specdoc_path) if !File.exist?(specdoc_path) + + output_file = File.join(specdoc_path, 'index.html') + t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_opts = ["--format", "\"html:#{output_file}\"", "--diff"] + t.fail_on_error = false + end + + namespace :rcov do + desc "Browse the code coverage report." + task :browse => "spec:rcov" do + require "launchy" + Launchy::Browser.run("coverage/index.html") + end + end +end + +if RCOV_ENABLED + desc "Alias to spec:verify" + task "spec" => "spec:verify" +else + desc "Alias to spec:normal" + task "spec" => "spec:normal" +end + +task "clobber" => ["spec:clobber_rcov"]