confuddle 0.0.1
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/.gitignore +18 -0
- data/.passwd_to_unfuddle.example.yml +7 -0
- data/README.md +40 -0
- data/bin/un +833 -0
- data/bin/un.cmd +1 -0
- data/confuddle.gemspec +22 -0
- data/lib/graft/README.rdoc +138 -0
- data/lib/graft/Rakefile +43 -0
- data/lib/graft/lib/graft/core_ext/hash.rb +9 -0
- data/lib/graft/lib/graft/json.rb +14 -0
- data/lib/graft/lib/graft/json/attribute.rb +18 -0
- data/lib/graft/lib/graft/json/model.rb +28 -0
- data/lib/graft/lib/graft/model.rb +43 -0
- data/lib/graft/lib/graft/version.rb +13 -0
- data/lib/graft/lib/graft/xml.rb +19 -0
- data/lib/graft/lib/graft/xml/attribute.rb +55 -0
- data/lib/graft/lib/graft/xml/model.rb +49 -0
- data/lib/graft/lib/graft/xml/type.rb +91 -0
- data/lib/graft/test/test_helper.rb +38 -0
- data/lib/graft/test/unit/core_ext/hash_test.rb +29 -0
- data/lib/graft/test/unit/json/attribute_test.rb +51 -0
- data/lib/graft/test/unit/json/model_test.rb +86 -0
- data/lib/graft/test/unit/xml/attribute_test.rb +161 -0
- data/lib/graft/test/unit/xml/model_test.rb +173 -0
- data/lib/graft/test/unit/xml/type_test.rb +65 -0
- data/lib/unfuzzle/.gitignore +4 -0
- data/lib/unfuzzle/README.rdoc +129 -0
- data/lib/unfuzzle/Rakefile +39 -0
- data/lib/unfuzzle/lib/unfuzzle.rb +87 -0
- data/lib/unfuzzle/lib/unfuzzle/comment.rb +37 -0
- data/lib/unfuzzle/lib/unfuzzle/component.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/milestone.rb +54 -0
- data/lib/unfuzzle/lib/unfuzzle/person.rb +20 -0
- data/lib/unfuzzle/lib/unfuzzle/priority.rb +30 -0
- data/lib/unfuzzle/lib/unfuzzle/project.rb +62 -0
- data/lib/unfuzzle/lib/unfuzzle/request.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/response.rb +25 -0
- data/lib/unfuzzle/lib/unfuzzle/severity.rb +31 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket.rb +156 -0
- data/lib/unfuzzle/lib/unfuzzle/ticket_report.rb +29 -0
- data/lib/unfuzzle/lib/unfuzzle/time_entry.rb +75 -0
- data/lib/unfuzzle/lib/unfuzzle/version.rb +13 -0
- data/lib/unfuzzle/test/fixtures/component.xml +8 -0
- data/lib/unfuzzle/test/fixtures/components.xml +17 -0
- data/lib/unfuzzle/test/fixtures/milestone.xml +12 -0
- data/lib/unfuzzle/test/fixtures/milestones.xml +25 -0
- data/lib/unfuzzle/test/fixtures/project.xml +17 -0
- data/lib/unfuzzle/test/fixtures/projects.xml +35 -0
- data/lib/unfuzzle/test/fixtures/severities.xml +24 -0
- data/lib/unfuzzle/test/fixtures/severity.xml +8 -0
- data/lib/unfuzzle/test/fixtures/ticket.xml +25 -0
- data/lib/unfuzzle/test/fixtures/tickets.xml +51 -0
- data/lib/unfuzzle/test/test_helper.rb +60 -0
- data/lib/unfuzzle/test/unit/unfuzzle/component_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/milestone_test.rb +100 -0
- data/lib/unfuzzle/test/unit/unfuzzle/priority_test.rb +25 -0
- data/lib/unfuzzle/test/unit/unfuzzle/project_test.rb +87 -0
- data/lib/unfuzzle/test/unit/unfuzzle/request_test.rb +104 -0
- data/lib/unfuzzle/test/unit/unfuzzle/response_test.rb +37 -0
- data/lib/unfuzzle/test/unit/unfuzzle/severity_test.rb +36 -0
- data/lib/unfuzzle/test/unit/unfuzzle/ticket_test.rb +181 -0
- data/lib/unfuzzle/test/unit/unfuzzle_test.rb +39 -0
- data/lib/unfuzzle/unfuzzle.gemspec +31 -0
- data/lib/version.rb +3 -0
- metadata +176 -0
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Unfuzzle
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # = Project
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # Represents an Unfuddle project.  Has the following attributes:
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              # [id] The unique identifier for this project
         | 
| 8 | 
            +
              # [slug] The "short name" for this project
         | 
| 9 | 
            +
              # [name] The name of this project
         | 
| 10 | 
            +
              # [description] The description for the project
         | 
| 11 | 
            +
              # [archived] The archived status of this project (see Project#archived?)
         | 
| 12 | 
            +
              # [created_at] The date/time that this project was created
         | 
| 13 | 
            +
              # [updated_at] The date/time that this project was last updated
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              class TicketReport
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                include Graft
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                attribute :id, :type => :integer
         | 
| 20 | 
            +
                attribute :relationship
         | 
| 21 | 
            +
                attribute :title
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def self.all
         | 
| 24 | 
            +
                  response = Request.get('/ticket_reports')
         | 
| 25 | 
            +
                  collection_from(response.body, 'ticket-report')
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,75 @@ | |
| 1 | 
            +
            module Unfuzzle
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              class TimeEntryGroup
         | 
| 4 | 
            +
                include Graft
         | 
| 5 | 
            +
                attribute :title
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              class TimeEntry
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                include Graft
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                attribute :date
         | 
| 13 | 
            +
                attribute :description
         | 
| 14 | 
            +
                attribute :hours
         | 
| 15 | 
            +
                attribute :person_id, :from => "person-id", :type => :integer
         | 
| 16 | 
            +
                attribute :ticket_id, :from => "ticket-id", :time => :integer
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                attr_accessor :title # title of ticket
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Hash representation of this time entry's data (for updating)
         | 
| 21 | 
            +
                def to_hash
         | 
| 22 | 
            +
                  {
         | 
| 23 | 
            +
                    'date'           => date,
         | 
| 24 | 
            +
                    'description'    => description,
         | 
| 25 | 
            +
                    'hours'          => hours,
         | 
| 26 | 
            +
                    'person-id'      => person_id,
         | 
| 27 | 
            +
                    "ticket-id"      => ticket_id
         | 
| 28 | 
            +
                  }
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
             | 
| 32 | 
            +
                # times for project
         | 
| 33 | 
            +
                def self.time_invested(project_id, start_date, end_date)
         | 
| 34 | 
            +
                  response = Request.get("/projects/#{project_id}/time_invested", query(start_date, end_date))
         | 
| 35 | 
            +
                  parse_group_collection(response.body)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                # times for account
         | 
| 39 | 
            +
                def self.all_time_invested(start_date, end_date)
         | 
| 40 | 
            +
                  response = Request.get("/account/time_invested", query(start_date, end_date))
         | 
| 41 | 
            +
                  parse_group_collection(response.body)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def self.all_for_ticket(ticket, start_date = nil, end_date = nil)
         | 
| 45 | 
            +
                  response = Request.get("/projects/#{ticket.project_id}/tickets/#{ticket.id}/time_entries", query(start_date, end_date))
         | 
| 46 | 
            +
                  collection_from(response.body, 'time-entries/time-entry')
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                # Create a ticket in unfuddle
         | 
| 50 | 
            +
                def create(project_id, ticket_id)
         | 
| 51 | 
            +
                  resource_path = "/projects/#{project_id}/tickets/#{ticket_id}/time_entries"
         | 
| 52 | 
            +
                  Request.post(resource_path, self.to_xml('time-entry'))
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              protected
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                def self.query(start_date, end_date)
         | 
| 58 | 
            +
                  # [person, ticket, priority, component, version, severity, milestone, due_on, reporter, assignee, status, resolution]
         | 
| 59 | 
            +
                  group = "ticket"
         | 
| 60 | 
            +
                  query = "?group_by=#{group}"
         | 
| 61 | 
            +
                  query += "&start_date=#{start_date.strftime("%Y/%m/%d")}" if start_date
         | 
| 62 | 
            +
                  query += "&end_date=#{end_date.strftime("%Y/%m/%d")}" if end_date
         | 
| 63 | 
            +
                  query
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def self.parse_group_collection(body)
         | 
| 67 | 
            +
                  res = collection_from_block(body, "groups/group") do |str|
         | 
| 68 | 
            +
                    group = TimeEntryGroup.new(str)
         | 
| 69 | 
            +
                    times = collection_from(str, 'time-entries/time-entry').map{|time| time.title = group.title; time}
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                  res.flatten
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <components type="array">
         | 
| 3 | 
            +
              <component>
         | 
| 4 | 
            +
                <id type="integer">1</id>
         | 
| 5 | 
            +
                <name>Administration</name>
         | 
| 6 | 
            +
                <project-id type="integer">1</project-id>
         | 
| 7 | 
            +
                <created-at>2009-06-15T20:40:29Z</created-at>
         | 
| 8 | 
            +
                <updated-at>2009-06-15T20:40:29Z</updated-at>
         | 
| 9 | 
            +
              </component>
         | 
| 10 | 
            +
              <component>
         | 
| 11 | 
            +
                <id type="integer">2</id>
         | 
| 12 | 
            +
                <name>Notifications</name>
         | 
| 13 | 
            +
                <project-id type="integer">2</project-id>
         | 
| 14 | 
            +
                <created-at>2009-06-15T20:40:49Z</created-at>
         | 
| 15 | 
            +
                <updated-at>2009-06-15T20:40:49Z</updated-at>
         | 
| 16 | 
            +
              </component>
         | 
| 17 | 
            +
            </components>
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <milestone>
         | 
| 3 | 
            +
              <archived type="boolean">false</archived>
         | 
| 4 | 
            +
              <completed type="boolean">false</completed>
         | 
| 5 | 
            +
              <due-on type="date">2009-04-03</due-on>
         | 
| 6 | 
            +
              <id type="integer">2</id>
         | 
| 7 | 
            +
              <person-responsible-id type="integer">123</person-responsible-id>
         | 
| 8 | 
            +
              <project-id type="integer">1</project-id>
         | 
| 9 | 
            +
              <title>Milestone #1</title>
         | 
| 10 | 
            +
              <created-at>2009-04-02T19:43:16Z</created-at>
         | 
| 11 | 
            +
              <updated-at>2009-07-02T16:40:28Z</updated-at>
         | 
| 12 | 
            +
            </milestone>
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <milestones type="array">
         | 
| 3 | 
            +
              <milestone>
         | 
| 4 | 
            +
                <archived type="boolean">false</archived>
         | 
| 5 | 
            +
                <completed type="boolean">false</completed>
         | 
| 6 | 
            +
                <due-on type="date">2009-04-03</due-on>
         | 
| 7 | 
            +
                <id type="integer">1</id>
         | 
| 8 | 
            +
                <person-responsible-id type="integer">123</person-responsible-id>
         | 
| 9 | 
            +
                <project-id type="integer">1</project-id>
         | 
| 10 | 
            +
                <title>Milestone #1</title>
         | 
| 11 | 
            +
                <created-at>2009-04-02T19:43:16Z</created-at>
         | 
| 12 | 
            +
                <updated-at>2009-07-06T18:00:26Z</updated-at>
         | 
| 13 | 
            +
              </milestone>
         | 
| 14 | 
            +
              <milestone>
         | 
| 15 | 
            +
                <archived type="boolean">false</archived>
         | 
| 16 | 
            +
                <completed type="boolean">false</completed>
         | 
| 17 | 
            +
                <due-on type="date">2009-04-06</due-on>
         | 
| 18 | 
            +
                <id type="integer">2</id>
         | 
| 19 | 
            +
                <person-responsible-id type="integer">123</person-responsible-id>
         | 
| 20 | 
            +
                <project-id type="integer">1</project-id>
         | 
| 21 | 
            +
                <title>Milestone #2</title>
         | 
| 22 | 
            +
                <created-at>2009-04-06T04:45:54Z</created-at>
         | 
| 23 | 
            +
                <updated-at>2009-04-10T15:29:01Z</updated-at>
         | 
| 24 | 
            +
              </milestone>
         | 
| 25 | 
            +
            </milestones>
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <project>
         | 
| 3 | 
            +
              <account-id type="integer">1</account-id>
         | 
| 4 | 
            +
              <archived type="boolean">false</archived>
         | 
| 5 | 
            +
              <assignee-on-resolve>none</assignee-on-resolve>
         | 
| 6 | 
            +
              <close-ticket-simultaneously-default type="boolean">true</close-ticket-simultaneously-default>
         | 
| 7 | 
            +
              <default-ticket-report-id type="integer">0</default-ticket-report-id>
         | 
| 8 | 
            +
              <description>This is the project for Blip Bleep Co.</description>
         | 
| 9 | 
            +
              <disk-usage type="integer">1416</disk-usage>
         | 
| 10 | 
            +
              <enable-time-tracking type="boolean">true</enable-time-tracking>
         | 
| 11 | 
            +
              <id type="integer">1</id>
         | 
| 12 | 
            +
              <short-name>blip</short-name>
         | 
| 13 | 
            +
              <theme>teal</theme>
         | 
| 14 | 
            +
              <title>Blip Bleep Co.</title>
         | 
| 15 | 
            +
              <created-at>2008-07-28T16:57:10Z</created-at>
         | 
| 16 | 
            +
              <updated-at>2009-04-28T18:48:52Z</updated-at>
         | 
| 17 | 
            +
            </project>
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <projects type="array">
         | 
| 3 | 
            +
              <project>
         | 
| 4 | 
            +
                <account-id type="integer">10710</account-id>
         | 
| 5 | 
            +
                <archived type="boolean">false</archived>
         | 
| 6 | 
            +
                <assignee-on-resolve>none</assignee-on-resolve>
         | 
| 7 | 
            +
                <close-ticket-simultaneously-default type="boolean">true</close-ticket-simultaneously-default>
         | 
| 8 | 
            +
                <default-ticket-report-id type="integer">0</default-ticket-report-id>
         | 
| 9 | 
            +
                <description></description>
         | 
| 10 | 
            +
                <disk-usage type="integer">1416</disk-usage>
         | 
| 11 | 
            +
                <enable-time-tracking type="boolean">true</enable-time-tracking>
         | 
| 12 | 
            +
                <id type="integer">24541</id>
         | 
| 13 | 
            +
                <short-name>aa</short-name>
         | 
| 14 | 
            +
                <theme>teal</theme>
         | 
| 15 | 
            +
                <title>Agency Access</title>
         | 
| 16 | 
            +
                <created-at>2008-07-28T16:57:10Z</created-at>
         | 
| 17 | 
            +
                <updated-at>2009-04-28T18:48:52Z</updated-at>
         | 
| 18 | 
            +
              </project>
         | 
| 19 | 
            +
              <project>
         | 
| 20 | 
            +
                <account-id type="integer">10710</account-id>
         | 
| 21 | 
            +
                <archived type="boolean">false</archived>
         | 
| 22 | 
            +
                <assignee-on-resolve>reporter</assignee-on-resolve>
         | 
| 23 | 
            +
                <close-ticket-simultaneously-default type="boolean">false</close-ticket-simultaneously-default>
         | 
| 24 | 
            +
                <default-ticket-report-id type="integer" nil="true"></default-ticket-report-id>
         | 
| 25 | 
            +
                <description nil="true"></description>
         | 
| 26 | 
            +
                <disk-usage type="integer">28736</disk-usage>
         | 
| 27 | 
            +
                <enable-time-tracking type="boolean">true</enable-time-tracking>
         | 
| 28 | 
            +
                <id type="integer">22830</id>
         | 
| 29 | 
            +
                <short-name>brianregan</short-name>
         | 
| 30 | 
            +
                <theme>orange</theme>
         | 
| 31 | 
            +
                <title>Brian Regan</title>
         | 
| 32 | 
            +
                <created-at>2008-07-02T14:19:32Z</created-at>
         | 
| 33 | 
            +
                <updated-at>2009-07-09T20:19:51Z</updated-at>
         | 
| 34 | 
            +
              </project>
         | 
| 35 | 
            +
            </projects>
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <severities type="array">
         | 
| 3 | 
            +
              <severity>
         | 
| 4 | 
            +
                <id type="integer">34942</id>
         | 
| 5 | 
            +
                <name>Design</name>
         | 
| 6 | 
            +
                <project-id type="integer">26984</project-id>
         | 
| 7 | 
            +
                <created-at>2009-04-02T19:44:49Z</created-at>
         | 
| 8 | 
            +
                <updated-at>2009-04-02T19:44:49Z</updated-at>
         | 
| 9 | 
            +
              </severity>
         | 
| 10 | 
            +
              <severity>
         | 
| 11 | 
            +
                <id type="integer">34943</id>
         | 
| 12 | 
            +
                <name>Development</name>
         | 
| 13 | 
            +
                <project-id type="integer">26984</project-id>
         | 
| 14 | 
            +
                <created-at>2009-04-02T19:44:53Z</created-at>
         | 
| 15 | 
            +
                <updated-at>2009-04-02T19:44:53Z</updated-at>
         | 
| 16 | 
            +
              </severity>
         | 
| 17 | 
            +
              <severity>
         | 
| 18 | 
            +
                <id type="integer">34944</id>
         | 
| 19 | 
            +
                <name>Project Management</name>
         | 
| 20 | 
            +
                <project-id type="integer">26984</project-id>
         | 
| 21 | 
            +
                <created-at>2009-04-02T19:44:59Z</created-at>
         | 
| 22 | 
            +
                <updated-at>2009-04-02T19:44:59Z</updated-at>
         | 
| 23 | 
            +
              </severity>
         | 
| 24 | 
            +
            </severities>
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <ticket>
         | 
| 3 | 
            +
              <assignee-id type="integer">123</assignee-id>
         | 
| 4 | 
            +
              <component-id type="integer">1</component-id>
         | 
| 5 | 
            +
              <description>Do something important</description>
         | 
| 6 | 
            +
              <description-format>markdown</description-format>
         | 
| 7 | 
            +
              <due-on type="date"></due-on>
         | 
| 8 | 
            +
              <hours-estimate-current type="float">0.0</hours-estimate-current>
         | 
| 9 | 
            +
              <hours-estimate-initial type="float">2.0</hours-estimate-initial>
         | 
| 10 | 
            +
              <id type="integer">1</id>
         | 
| 11 | 
            +
              <milestone-id type="integer">1</milestone-id>
         | 
| 12 | 
            +
              <number type="integer">1</number>
         | 
| 13 | 
            +
              <priority>3</priority>
         | 
| 14 | 
            +
              <project-id type="integer">1</project-id>
         | 
| 15 | 
            +
              <reporter-id type="integer">122</reporter-id>
         | 
| 16 | 
            +
              <resolution>postponed</resolution>
         | 
| 17 | 
            +
              <resolution-description>done</resolution-description>
         | 
| 18 | 
            +
              <resolution-description-format>markdown</resolution-description-format>
         | 
| 19 | 
            +
              <severity-id type="integer">123</severity-id>
         | 
| 20 | 
            +
              <status>closed</status>
         | 
| 21 | 
            +
              <summary>Ticket #1</summary>
         | 
| 22 | 
            +
              <version-id type="integer">17329</version-id>
         | 
| 23 | 
            +
              <created-at>2008-11-25T14:00:19Z</created-at>
         | 
| 24 | 
            +
              <updated-at>2008-12-31T15:51:41Z</updated-at>
         | 
| 25 | 
            +
            </ticket>
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <tickets type="array">
         | 
| 3 | 
            +
              <ticket>
         | 
| 4 | 
            +
                <assignee-id type="integer">27736</assignee-id>
         | 
| 5 | 
            +
                <component-id type="integer">47394</component-id>
         | 
| 6 | 
            +
                <description></description>
         | 
| 7 | 
            +
                <description-format>markdown</description-format>
         | 
| 8 | 
            +
                <due-on type="date">2009-04-03</due-on>
         | 
| 9 | 
            +
                <hours-estimate-current type="float">0.0</hours-estimate-current>
         | 
| 10 | 
            +
                <hours-estimate-initial type="float">2.0</hours-estimate-initial>
         | 
| 11 | 
            +
                <id type="integer">557168</id>
         | 
| 12 | 
            +
                <milestone-id type="integer">52212</milestone-id>
         | 
| 13 | 
            +
                <number type="integer">5</number>
         | 
| 14 | 
            +
                <priority>3</priority>
         | 
| 15 | 
            +
                <project-id type="integer">26984</project-id>
         | 
| 16 | 
            +
                <reporter-id type="integer">27736</reporter-id>
         | 
| 17 | 
            +
                <resolution>postponed</resolution>
         | 
| 18 | 
            +
                <resolution-description>awaiting contracts</resolution-description>
         | 
| 19 | 
            +
                <resolution-description-format>markdown</resolution-description-format>
         | 
| 20 | 
            +
                <severity-id type="integer">34943</severity-id>
         | 
| 21 | 
            +
                <status>closed</status>
         | 
| 22 | 
            +
                <summary>User can log in to the site</summary>
         | 
| 23 | 
            +
                <version-id type="integer">17329</version-id>
         | 
| 24 | 
            +
                <created-at>2009-04-02T19:16:26Z</created-at>
         | 
| 25 | 
            +
                <updated-at>2009-07-02T16:42:30Z</updated-at>
         | 
| 26 | 
            +
              </ticket>
         | 
| 27 | 
            +
              <ticket>
         | 
| 28 | 
            +
                <assignee-id type="integer">27736</assignee-id>
         | 
| 29 | 
            +
                <component-id type="integer">47394</component-id>
         | 
| 30 | 
            +
                <description></description>
         | 
| 31 | 
            +
                <description-format>markdown</description-format>
         | 
| 32 | 
            +
                <due-on type="date">2009-04-03</due-on>
         | 
| 33 | 
            +
                <hours-estimate-current type="float">0.0</hours-estimate-current>
         | 
| 34 | 
            +
                <hours-estimate-initial type="float">2.0</hours-estimate-initial>
         | 
| 35 | 
            +
                <id type="integer">557169</id>
         | 
| 36 | 
            +
                <milestone-id type="integer">52212</milestone-id>
         | 
| 37 | 
            +
                <number type="integer">6</number>
         | 
| 38 | 
            +
                <priority>3</priority>
         | 
| 39 | 
            +
                <project-id type="integer">26984</project-id>
         | 
| 40 | 
            +
                <reporter-id type="integer">27736</reporter-id>
         | 
| 41 | 
            +
                <resolution>postponed</resolution>
         | 
| 42 | 
            +
                <resolution-description>awaiting contracts</resolution-description>
         | 
| 43 | 
            +
                <resolution-description-format>markdown</resolution-description-format>
         | 
| 44 | 
            +
                <severity-id type="integer">34943</severity-id>
         | 
| 45 | 
            +
                <status>closed</status>
         | 
| 46 | 
            +
                <summary>User can edit profile</summary>
         | 
| 47 | 
            +
                <version-id type="integer">17329</version-id>
         | 
| 48 | 
            +
                <created-at>2009-04-02T19:17:40Z</created-at>
         | 
| 49 | 
            +
                <updated-at>2009-04-10T15:28:54Z</updated-at>
         | 
| 50 | 
            +
              </ticket>
         | 
| 51 | 
            +
            </tickets>
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            # http://sneaq.net/textmate-wtf
         | 
| 2 | 
            +
            $:.reject! { |e| e.include? 'TextMate' }
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'rubygems'
         | 
| 5 | 
            +
            require 'throat_punch'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require File.dirname(__FILE__) + '/../lib/unfuzzle'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
            class Test::Unit::TestCase
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              def self.read_fixture(method_name)
         | 
| 13 | 
            +
                file = File.dirname(__FILE__) + "/fixtures/#{method_name}.xml"
         | 
| 14 | 
            +
                File.read(file)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def read_fixture(method_name)
         | 
| 18 | 
            +
                self.class.read_fixture(method_name)
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
              
         | 
| 21 | 
            +
              def mock_request_cycle(options)
         | 
| 22 | 
            +
                response = Unfuzzle::Response.new(stub())
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                data = read_fixture(options[:data])
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                response.stubs(:body).with().returns(data)
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                Unfuzzle::Request.stubs(:get).with(options[:for]).returns(response)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                response
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def self.when_populating(klass, options, &block)
         | 
| 34 | 
            +
                context "with data populated for #{klass}" do
         | 
| 35 | 
            +
                  setup { @object = klass.new(read_fixture(options[:from])) }
         | 
| 36 | 
            +
                  merge_block(&block)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def self.value_for(method_name, options)
         | 
| 42 | 
            +
                should "have a value for :#{method_name}" do
         | 
| 43 | 
            +
                  @object.send(method_name).should == options[:is]
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
              
         | 
| 47 | 
            +
              def self.should_set_a_value_for(attribute, value = nil)
         | 
| 48 | 
            +
                class_name = self.to_s.sub(/^Unfuzzle::(.*)Test$/, '\\1')
         | 
| 49 | 
            +
                klass = Unfuzzle.const_get(class_name)
         | 
| 50 | 
            +
                
         | 
| 51 | 
            +
                value = attribute if value.nil?
         | 
| 52 | 
            +
                
         | 
| 53 | 
            +
                should "be able to set a value for :#{attribute}" do
         | 
| 54 | 
            +
                  object = klass.new
         | 
| 55 | 
            +
                  object.send("#{attribute}=", value)
         | 
| 56 | 
            +
                  object.send(attribute).should == value
         | 
| 57 | 
            +
                end      
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
              
         | 
| 60 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/../../test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Unfuzzle
         | 
| 4 | 
            +
              class ComponentTest < Test::Unit::TestCase
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                context "The Component class" do
         | 
| 7 | 
            +
                  
         | 
| 8 | 
            +
                  should "be able to return a severity for a project and component id" do
         | 
| 9 | 
            +
                    project_id   = 1
         | 
| 10 | 
            +
                    component_id = 1
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    response = mock_request_cycle :for => "/projects/#{project_id}/components/#{component_id}", :data => 'component'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    Unfuzzle::Component.expects(:new).with(response.body).returns('component')
         | 
| 15 | 
            +
                    
         | 
| 16 | 
            +
                    Unfuzzle::Component.find_by_project_id_and_component_id(project_id, component_id).should == 'component'
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                  
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                context "An instance of the Component class" do
         | 
| 22 | 
            +
                  
         | 
| 23 | 
            +
                  when_populating Component, :from => 'component' do
         | 
| 24 | 
            +
                  
         | 
| 25 | 
            +
                    value_for :id,          :is => 1
         | 
| 26 | 
            +
                    value_for :name,        :is => 'Administration'
         | 
| 27 | 
            +
                    value_for :project_id,  :is => 2
         | 
| 28 | 
            +
                    value_for :created_at,  :is => Time.parse('2009-06-15T20:40:29Z')
         | 
| 29 | 
            +
                    value_for :updated_at,  :is => Time.parse('2009-06-15T20:40:29Z')
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                  
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
                
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         |