meta_project 0.4.9 → 0.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +8 -0
 - data/README +1 -1
 - data/Rakefile +1 -1
 - data/lib/meta_project/tracker/jira/jira_tracker.rb +26 -23
 - data/lib/meta_project/tracker/trac/trac_tracker.rb +1 -0
 - data/lib/meta_project/tracker/xforge/ruby_forge_tracker.rb +2 -2
 - data/lib/meta_project/tracker/xforge/source_forge_tracker.rb +2 -2
 - data/lib/meta_project/tracker/xforge/xforge_tracker.rb +31 -3
 - metadata +2 -2
 
    
        data/CHANGES
    CHANGED
    
    | 
         @@ -1,5 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            = MetaProject Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            == Version 0.4.10
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            This version fixes some bugs in the JIRA and SourceForge APIs.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            * Made error reporting better for JIRA exceptions.
         
     | 
| 
      
 8 
     | 
    
         
            +
            * Avoid exception rippling through when login credentials are not specified.
         
     | 
| 
      
 9 
     | 
    
         
            +
            * Made SourceForge tracker API more robust.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       3 
11 
     | 
    
         
             
            == Version 0.4.9
         
     | 
| 
       4 
12 
     | 
    
         | 
| 
       5 
13 
     | 
    
         
             
            This release makes the validation of Browser objects more robust.
         
     | 
    
        data/README
    CHANGED
    
    
    
        data/Rakefile
    CHANGED
    
    
| 
         @@ -45,18 +45,30 @@ module MetaProject 
     | 
|
| 
       45 
45 
     | 
    
         
             
                      login do |session|
         
     | 
| 
       46 
46 
     | 
    
         
             
                        issue_struct = session.createIssue(issue_struct)
         
     | 
| 
       47 
47 
     | 
    
         
             
                        issue.attributes[:identifier] = issue_struct["key"]
         
     | 
| 
      
 48 
     | 
    
         
            +
                        issue
         
     | 
| 
       48 
49 
     | 
    
         
             
                      end
         
     | 
| 
       49 
50 
     | 
    
         
             
                    end
         
     | 
| 
       50 
51 
     | 
    
         | 
| 
       51 
52 
     | 
    
         
             
                    def materialize(issue)
         
     | 
| 
       52 
     | 
    
         
            -
                       
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
                      issue.attributes[:identifier] = issue.attributes[:identifier].upcase
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                      # Getting summary and detail requires login
         
     | 
| 
      
 56 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 57 
     | 
    
         
            +
                        login do |session|
         
     | 
| 
      
 58 
     | 
    
         
            +
                          issue_struct = session.getIssue(issue.identifier)            
         
     | 
| 
      
 59 
     | 
    
         
            +
                          issue.attributes[:url] = "#{@jira_base_url}/browse/#{issue.identifier}"
         
     | 
| 
      
 60 
     | 
    
         
            +
                          issue.attributes[:summary] = issue_struct["summary"].strip
         
     | 
| 
      
 61 
     | 
    
         
            +
                          issue.attributes[:detail] = issue_struct["description"].strip
         
     | 
| 
      
 62 
     | 
    
         
            +
                        end
         
     | 
| 
      
 63 
     | 
    
         
            +
                      rescue JiraEnvVarException => e
         
     | 
| 
      
 64 
     | 
    
         
            +
                        # Couldn't log in because of missing login info. Assume issue exists
         
     | 
| 
       58 
65 
     | 
    
         
             
                        issue.attributes[:url] = "#{@jira_base_url}/browse/#{issue.identifier}"
         
     | 
| 
      
 66 
     | 
    
         
            +
                        STDERR.puts("WARNING: #{e.message}")
         
     | 
| 
      
 67 
     | 
    
         
            +
                      rescue XMLRPC::FaultException => e
         
     | 
| 
      
 68 
     | 
    
         
            +
                        # Probably bad issue number. Don't set URL.
         
     | 
| 
      
 69 
     | 
    
         
            +
                        STDERR.puts("WARNING: Exception from JIRA: #{e.faultCode}, #{e.faultString} Issue id: #{issue.identifier}")
         
     | 
| 
       59 
70 
     | 
    
         
             
                      end
         
     | 
| 
      
 71 
     | 
    
         
            +
                      issue
         
     | 
| 
       60 
72 
     | 
    
         
             
                    end
         
     | 
| 
       61 
73 
     | 
    
         | 
| 
       62 
74 
     | 
    
         
             
                  private
         
     | 
| 
         @@ -64,27 +76,17 @@ module MetaProject 
     | 
|
| 
       64 
76 
     | 
    
         
             
                    def login
         
     | 
| 
       65 
77 
     | 
    
         
             
                      client = XMLRPC::Client.new2("#{@jira_base_url}/rpc/xmlrpc")
         
     | 
| 
       66 
78 
     | 
    
         
             
                      token = client.call("#{JIRA_API}.login", user, password)
         
     | 
| 
       67 
     | 
    
         
            -
                       
     | 
| 
       68 
     | 
    
         
            -
                        yield Session.new(client, token)
         
     | 
| 
       69 
     | 
    
         
            -
                      rescue XMLRPC::FaultException => e
         
     | 
| 
       70 
     | 
    
         
            -
                        # Probably bad issue number or failed login
         
     | 
| 
       71 
     | 
    
         
            -
                        STDERR.puts("WARNING: Exception from JIRA: #{e.faultCode}, #{e.faultString}")
         
     | 
| 
       72 
     | 
    
         
            -
                        nil
         
     | 
| 
       73 
     | 
    
         
            -
                      rescue LoginException => e
         
     | 
| 
       74 
     | 
    
         
            -
                        # Missing env vars
         
     | 
| 
       75 
     | 
    
         
            -
                        STDERR.puts("WARNING: Couldn't log in to JIRA at #{@rooturl}: #{e.message}")
         
     | 
| 
       76 
     | 
    
         
            -
                        nil
         
     | 
| 
       77 
     | 
    
         
            -
                      end
         
     | 
| 
      
 79 
     | 
    
         
            +
                      yield Session.new(client, token)
         
     | 
| 
       78 
80 
     | 
    
         
             
                    end
         
     | 
| 
       79 
81 
     | 
    
         | 
| 
       80 
82 
     | 
    
         
             
                    def user
         
     | 
| 
       81 
83 
     | 
    
         
             
                      var = "#{login_env_var_prefix}_JIRA_USER"
         
     | 
| 
       82 
     | 
    
         
            -
                      ENV[var] ||  
     | 
| 
      
 84 
     | 
    
         
            +
                      ENV[var] || missing_env_var(var)
         
     | 
| 
       83 
85 
     | 
    
         
             
                    end
         
     | 
| 
       84 
86 
     | 
    
         | 
| 
       85 
87 
     | 
    
         
             
                    def password
         
     | 
| 
       86 
88 
     | 
    
         
             
                      var = "#{login_env_var_prefix}_JIRA_PASSWORD"
         
     | 
| 
       87 
     | 
    
         
            -
                      ENV[var] ||  
     | 
| 
      
 89 
     | 
    
         
            +
                      ENV[var] || missing_env_var(var)
         
     | 
| 
       88 
90 
     | 
    
         
             
                    end
         
     | 
| 
       89 
91 
     | 
    
         | 
| 
       90 
92 
     | 
    
         
             
                    def login_env_var_prefix
         
     | 
| 
         @@ -95,13 +97,14 @@ module MetaProject 
     | 
|
| 
       95 
97 
     | 
    
         
             
                      end
         
     | 
| 
       96 
98 
     | 
    
         
             
                    end
         
     | 
| 
       97 
99 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
                    def  
     | 
| 
       99 
     | 
    
         
            -
                      raise  
     | 
| 
      
 100 
     | 
    
         
            +
                    def missing_env_var(var)
         
     | 
| 
      
 101 
     | 
    
         
            +
                      raise JiraEnvVarException.new("Couldn't log in to JIRA at #{@rooturl}: #{e.message}. The " +
         
     | 
| 
      
 102 
     | 
    
         
            +
                      "#{var} environment variable must be set in order to communicate with JIRA")
         
     | 
| 
       100 
103 
     | 
    
         
             
                    end
         
     | 
| 
       101 
104 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
                    class  
     | 
| 
      
 105 
     | 
    
         
            +
                    class JiraEnvVarException < Exception
         
     | 
| 
       103 
106 
     | 
    
         
             
                    end
         
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
                    
         
     | 
| 
       105 
108 
     | 
    
         
             
                    # This wrapper around XMLRPC::Client that allows simpler method calls
         
     | 
| 
       106 
109 
     | 
    
         
             
                    # via method_missing and doesn't require to manage the token
         
     | 
| 
       107 
110 
     | 
    
         
             
                    class Session
         
     | 
| 
         @@ -3,11 +3,11 @@ module MetaProject 
     | 
|
| 
       3 
3 
     | 
    
         
             
                module XForge
         
     | 
| 
       4 
4 
     | 
    
         
             
                  class RubyForgeTracker < XForgeTracker
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                    def  
     | 
| 
      
 6 
     | 
    
         
            +
                    def subtracker_pattern
         
     | 
| 
       7 
7 
     | 
    
         
             
                      /\/tracker\/\?atid=(\d+)&group_id=\d*&func=browse/
         
     | 
| 
       8 
8 
     | 
    
         
             
                    end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                    def  
     | 
| 
      
 10 
     | 
    
         
            +
                    def issue_summary_pattern(identifier)
         
     | 
| 
       11 
11 
     | 
    
         
             
                      /<a href=\"\/tracker\/index.php\?func=detail&aid=#{identifier}&group_id=\d+&atid=\d+\">([^<]*)<\/a>/
         
     | 
| 
       12 
12 
     | 
    
         
             
                    end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
         @@ -3,11 +3,11 @@ module MetaProject 
     | 
|
| 
       3 
3 
     | 
    
         
             
                module XForge
         
     | 
| 
       4 
4 
     | 
    
         
             
                  class SourceForgeTracker < XForgeTracker
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                    def  
     | 
| 
      
 6 
     | 
    
         
            +
                    def subtracker_pattern
         
     | 
| 
       7 
7 
     | 
    
         
             
                      /\/tracker\/\?atid=(\d+)&group_id=\d*&func=browse/
         
     | 
| 
       8 
8 
     | 
    
         
             
                    end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                    def  
     | 
| 
      
 10 
     | 
    
         
            +
                    def issue_summary_pattern(identifier)
         
     | 
| 
       11 
11 
     | 
    
         
             
                      /<a href=\"\/tracker\/index.php\?func=detail&aid=#{identifier}&group_id=\d+&atid=\d+\">([^<]*)<\/a>/
         
     | 
| 
       12 
12 
     | 
    
         
             
                    end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
         @@ -1,3 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
       1 
2 
     | 
    
         
             
            require 'meta_project/tracker/base'
         
     | 
| 
       2 
3 
     | 
    
         
             
            require 'meta_project/tracker/digit_issues'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'meta_project/tracker/issue'
         
     | 
| 
         @@ -26,6 +27,7 @@ module MetaProject 
     | 
|
| 
       26 
27 
     | 
    
         
             
                    end
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
                    def materialize(issue)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      issue
         
     | 
| 
       29 
31 
     | 
    
         
             
                    end
         
     | 
| 
       30 
32 
     | 
    
         | 
| 
       31 
33 
     | 
    
         
             
                    class SubTracker
         
     | 
| 
         @@ -40,8 +42,8 @@ module MetaProject 
     | 
|
| 
       40 
42 
     | 
    
         
             
                      def issue(identifier)
         
     | 
| 
       41 
43 
     | 
    
         
             
                        html = better_open(@uri).read
         
     | 
| 
       42 
44 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                         
     | 
| 
       44 
     | 
    
         
            -
                        if(html =~  
     | 
| 
      
 45 
     | 
    
         
            +
                        issue_summary_pattern = @tracker.issue_summary_pattern(identifier)
         
     | 
| 
      
 46 
     | 
    
         
            +
                        if(html =~ issue_summary_pattern)
         
     | 
| 
       45 
47 
     | 
    
         
             
                          issue_url = @tracker.project.group_id_uri("tracker/index.php", "&atid=#{@atid}&func=detail&aid=#{identifier}")
         
     | 
| 
       46 
48 
     | 
    
         
             
                          issue_summary = $1.strip
         
     | 
| 
       47 
49 
     | 
    
         
             
                          return Issue.new(@tracker, :summary => issue_summary, :url => issue_url)
         
     | 
| 
         @@ -54,14 +56,32 @@ module MetaProject 
     | 
|
| 
       54 
56 
     | 
    
         | 
| 
       55 
57 
     | 
    
         
             
                    # The ids of the subtrackers
         
     | 
| 
       56 
58 
     | 
    
         
             
                    def atids
         
     | 
| 
      
 59 
     | 
    
         
            +
            #          headers = {
         
     | 
| 
      
 60 
     | 
    
         
            +
            #            "User-Agent" => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4",
         
     | 
| 
      
 61 
     | 
    
         
            +
            #            "Accept" => "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
         
     | 
| 
      
 62 
     | 
    
         
            +
            #            "Accept-Language" => "en-us,en;q=0.5",
         
     | 
| 
      
 63 
     | 
    
         
            +
            #            "Accept-Encoding" => "gzip,deflate",
         
     | 
| 
      
 64 
     | 
    
         
            +
            #            "Accept-Charset" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
         
     | 
| 
      
 65 
     | 
    
         
            +
            #            "Keep-Alive" => "300",
         
     | 
| 
      
 66 
     | 
    
         
            +
            #            "Connection" => "close",
         
     | 
| 
      
 67 
     | 
    
         
            +
            #            "X-Requested-With" => "XMLHttpRequest",
         
     | 
| 
      
 68 
     | 
    
         
            +
            #            "X-Prototype-Version" => "1.3.1",
         
     | 
| 
      
 69 
     | 
    
         
            +
            #            "Content-Type" => "application/x-www-form-urlencoded",
         
     | 
| 
      
 70 
     | 
    
         
            +
            #            "Content-Length" => "0",
         
     | 
| 
      
 71 
     | 
    
         
            +
            #            "Cookie" => "author=AnonymousCoward; _session_id=975a583d513190522ce3aeba315552d0",
         
     | 
| 
      
 72 
     | 
    
         
            +
            #            "Pragma" => "no-cache",
         
     | 
| 
      
 73 
     | 
    
         
            +
            #            "Cache-Control" => "no-cache"
         
     | 
| 
      
 74 
     | 
    
         
            +
            #          }
         
     | 
| 
      
 75 
     | 
    
         
            +
                      
         
     | 
| 
       57 
76 
     | 
    
         
             
                      html = better_open(overview).read
         
     | 
| 
      
 77 
     | 
    
         
            +
                      STDERR.puts "The HTML returned from #{overview} was empty! This might be because the server is trying to fool us" if html == ""
         
     | 
| 
       58 
78 
     | 
    
         | 
| 
       59 
79 
     | 
    
         
             
                      # TODO: there has to be a better way to extract the atids from the HTML!
         
     | 
| 
       60 
80 
     | 
    
         
             
                      atids = []
         
     | 
| 
       61 
81 
     | 
    
         
             
                      offset = 0
         
     | 
| 
       62 
82 
     | 
    
         
             
                      look_for_atid = true
         
     | 
| 
       63 
83 
     | 
    
         
             
                      while(look_for_atid)
         
     | 
| 
       64 
     | 
    
         
            -
                        match_data =  
     | 
| 
      
 84 
     | 
    
         
            +
                        match_data = subtracker_pattern.match(html[offset..-1])
         
     | 
| 
       65 
85 
     | 
    
         
             
                        if(match_data)
         
     | 
| 
       66 
86 
     | 
    
         
             
                          offset += match_data.begin(1)
         
     | 
| 
       67 
87 
     | 
    
         
             
                          atids << match_data[1]
         
     | 
| 
         @@ -69,6 +89,14 @@ module MetaProject 
     | 
|
| 
       69 
89 
     | 
    
         
             
                          look_for_atid = false
         
     | 
| 
       70 
90 
     | 
    
         
             
                        end
         
     | 
| 
       71 
91 
     | 
    
         
             
                      end
         
     | 
| 
      
 92 
     | 
    
         
            +
                      if atids.empty?
         
     | 
| 
      
 93 
     | 
    
         
            +
                        debug_file = "xforge_tracker_debug.html"
         
     | 
| 
      
 94 
     | 
    
         
            +
                        File.open(debug_file, "w"){|io| io.write html}
         
     | 
| 
      
 95 
     | 
    
         
            +
                        STDERR.puts "WARNING: No subtrackers found at #{overview}."
         
     | 
| 
      
 96 
     | 
    
         
            +
                        STDERR.puts "I was looking for /#{subtracker_pattern.source}/"
         
     | 
| 
      
 97 
     | 
    
         
            +
                        STDERR.puts "Please consider filing a bug report at http://rubyforge.org/tracker/?atid=3161&group_id=801&func=browse"
         
     | 
| 
      
 98 
     | 
    
         
            +
                        STDERR.puts "The HTML has been saved to #{debug_file}"
         
     | 
| 
      
 99 
     | 
    
         
            +
                      end
         
     | 
| 
       72 
100 
     | 
    
         
             
                      atids
         
     | 
| 
       73 
101 
     | 
    
         
             
                    end
         
     | 
| 
       74 
102 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -3,8 +3,8 @@ rubygems_version: 0.8.11 
     | 
|
| 
       3 
3 
     | 
    
         
             
            specification_version: 1
         
     | 
| 
       4 
4 
     | 
    
         
             
            name: meta_project
         
     | 
| 
       5 
5 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       6 
     | 
    
         
            -
              version: 0.4. 
     | 
| 
       7 
     | 
    
         
            -
            date: 2005-09- 
     | 
| 
      
 6 
     | 
    
         
            +
              version: 0.4.10
         
     | 
| 
      
 7 
     | 
    
         
            +
            date: 2005-09-08 00:00:00 -04:00
         
     | 
| 
       8 
8 
     | 
    
         
             
            summary: Ruby based make-like utility.
         
     | 
| 
       9 
9 
     | 
    
         
             
            require_paths: 
         
     | 
| 
       10 
10 
     | 
    
         
             
              - lib
         
     |