codefumes 0.1.10 → 0.2.0
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/Gemfile +19 -0
- data/Gemfile.lock +135 -0
- data/History.txt +12 -0
- data/LICENSE +20 -0
- data/Manifest.txt +40 -19
- data/README.txt +11 -29
- data/Rakefile +15 -10
- data/bin/fumes +214 -0
- data/config/website.yml +2 -0
- data/cucumber.yml +2 -0
- data/features/claiming_a_project.feature +46 -0
- data/features/deleting_a_project.feature +32 -0
- data/features/releasing_a_project.feature +50 -0
- data/features/step_definitions/cli_steps.rb +98 -0
- data/features/step_definitions/common_steps.rb +168 -0
- data/features/step_definitions/filesystem_steps.rb +19 -0
- data/features/storing_user_api_key.feature +41 -0
- data/features/support/common.rb +29 -0
- data/features/support/env.rb +24 -0
- data/features/support/matchers.rb +11 -0
- data/features/synchronizing_repository_with_project.feature +33 -0
- data/lib/codefumes.rb +10 -8
- data/lib/codefumes/api.rb +20 -11
- data/lib/codefumes/api/build.rb +139 -0
- data/lib/codefumes/api/claim.rb +74 -0
- data/lib/codefumes/api/commit.rb +150 -0
- data/lib/codefumes/api/payload.rb +93 -0
- data/lib/codefumes/api/project.rb +158 -0
- data/lib/codefumes/cli_helpers.rb +54 -0
- data/lib/codefumes/config_file.rb +3 -2
- data/lib/codefumes/errors.rb +21 -0
- data/lib/codefumes/exit_codes.rb +10 -0
- data/lib/codefumes/harvester.rb +113 -0
- data/lib/codefumes/quick_build.rb +43 -0
- data/lib/codefumes/quick_metric.rb +20 -0
- data/lib/codefumes/source_control.rb +137 -0
- data/lib/integrity_notifier/codefumes.haml +11 -0
- data/lib/integrity_notifier/codefumes.rb +62 -0
- data/spec/codefumes/{build_spec.rb → api/build_spec.rb} +14 -24
- data/spec/codefumes/{claim_spec.rb → api/claim_spec.rb} +42 -3
- data/spec/codefumes/{commit_spec.rb → api/commit_spec.rb} +34 -24
- data/spec/codefumes/api/payload_spec.rb +148 -0
- data/spec/codefumes/api/project_spec.rb +286 -0
- data/spec/codefumes/api_spec.rb +38 -15
- data/spec/codefumes/config_file_spec.rb +69 -13
- data/spec/codefumes/harvester_spec.rb +118 -0
- data/spec/codefumes/source_control_spec.rb +199 -0
- data/spec/codefumes_service_helpers.rb +23 -19
- data/spec/fixtures/sample_project_dirs/no_scm/description +4 -0
- data/spec/spec_helper.rb +1 -0
- data/tasks/cucumber.rake +11 -0
- metadata +145 -60
- data/bin/cf_claim_project +0 -9
- data/bin/cf_release_project +0 -10
- data/bin/cf_store_credentials +0 -10
- data/lib/cf_claim_project/cli.rb +0 -95
- data/lib/cf_release_project/cli.rb +0 -76
- data/lib/cf_store_credentials/cli.rb +0 -50
- data/lib/codefumes/build.rb +0 -131
- data/lib/codefumes/claim.rb +0 -57
- data/lib/codefumes/commit.rb +0 -144
- data/lib/codefumes/payload.rb +0 -103
- data/lib/codefumes/project.rb +0 -129
- data/spec/cf_claim_project/cli_spec.rb +0 -17
- data/spec/cf_release_project/cli_spec.rb +0 -41
- data/spec/cf_store_credentials/cli_spec.rb +0 -28
- data/spec/codefumes/payload_spec.rb +0 -155
- data/spec/codefumes/project_spec.rb +0 -274
| @@ -0,0 +1,148 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/../../spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe "API::Payload" do
         | 
| 4 | 
            +
              include CodeFumesServiceHelpers::PayloadHelpers
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              after(:all) do
         | 
| 7 | 
            +
                FakeWeb.allow_net_connect = false
         | 
| 8 | 
            +
                FakeWeb.clean_registry
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              before(:each) do
         | 
| 12 | 
            +
                setup_fixture_base
         | 
| 13 | 
            +
                @payload = Payload.new(@project, @commit_data)
         | 
| 14 | 
            +
                @payload_query = {:payload => {:commits => @commit_data}}
         | 
| 15 | 
            +
                @basic_auth_params = {:username => @pub_key, :password => @priv_key}
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              describe "#save" do
         | 
| 19 | 
            +
                it "sets basic auth with the public and private key" do
         | 
| 20 | 
            +
                  register_create_uri(["401", "Unauthorized"], "")
         | 
| 21 | 
            +
                  API.should_receive(:post).with("/projects/#{@project.public_key}/payloads", :query => @payload_query, :basic_auth => @basic_auth_params).and_return(mock("response", :code => 401))
         | 
| 22 | 
            +
                  @payload.save
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                context "with valid parameters" do
         | 
| 26 | 
            +
                  before(:each) do
         | 
| 27 | 
            +
                    register_create_uri(["201", "Created"])
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  it "sets a value for 'created_at'" do
         | 
| 31 | 
            +
                    @payload.created_at.should == nil
         | 
| 32 | 
            +
                    @payload.save.should == true
         | 
| 33 | 
            +
                    @payload.created_at.should_not == nil
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                context "with Unauthorized response" do
         | 
| 38 | 
            +
                  before(:each) do
         | 
| 39 | 
            +
                    register_create_uri(["401", "Unauthorized"], "")
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  it "does not set 'created_at'" do
         | 
| 43 | 
            +
                    @payload.created_at.should == nil
         | 
| 44 | 
            +
                    @payload.save.should == false
         | 
| 45 | 
            +
                    @payload.created_at.should == nil
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                context "when the payload does not have any commit information" do
         | 
| 50 | 
            +
                  before(:each) do
         | 
| 51 | 
            +
                    @payload = Payload.new(@project, "")
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  it "returns true without attempting to save to the site" do
         | 
| 55 | 
            +
                    Payload.should_not_receive(:post)
         | 
| 56 | 
            +
                    @payload.save.should == true
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  it "does not set the value of created_at" do
         | 
| 60 | 
            +
                    @payload.save
         | 
| 61 | 
            +
                    @payload.created_at.should == nil
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                context "with invalid parameters" do
         | 
| 66 | 
            +
                  before(:each) do
         | 
| 67 | 
            +
                    register_create_uri
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  it "does not set a value for 'created_at'" do
         | 
| 71 | 
            +
                    @payload.save.should == false
         | 
| 72 | 
            +
                    @payload.created_at.should == nil
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              describe "#prepare" do
         | 
| 78 | 
            +
                it "is compatible with the entity returned from SourceControl#payload_between" do
         | 
| 79 | 
            +
                  git_repo_path = File.expand_path(File.dirname(__FILE__) + '/../../fixtures/sample_project_dirs/git_repository')
         | 
| 80 | 
            +
                  repository = SourceControl.new(git_repo_path)
         | 
| 81 | 
            +
                  project = Project.new('public_key', 'private_key')
         | 
| 82 | 
            +
                  lambda {
         | 
| 83 | 
            +
                    pl = Payload.prepare(project, repository.payload_between('HEAD^', 'HEAD'))
         | 
| 84 | 
            +
                    pl.length.should == 1
         | 
| 85 | 
            +
                  }.should_not raise_error
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                context "when supplying nil commit information" do
         | 
| 89 | 
            +
                  it "returns an empty array" do
         | 
| 90 | 
            +
                    Payload.prepare(@project, nil).should == []
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                context "when supplying an empty Hash" do
         | 
| 95 | 
            +
                  it "returns an empty array" do
         | 
| 96 | 
            +
                    Payload.prepare(@project, {}).should == []
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                context "when supplying a hash with less than 4,000 characters" do
         | 
| 101 | 
            +
                  before(:each) do
         | 
| 102 | 
            +
                    single_commit_ex =  {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_000"}
         | 
| 103 | 
            +
                    commit_count = 4000 / single_commit_ex.to_s.length
         | 
| 104 | 
            +
                    commits = commit_count.times.map do |index|
         | 
| 105 | 
            +
                      {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_#{index}"}
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
                    @prepared = Payload.prepare(@project, {:commits => commits})
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  it "returns an Array with a single payload element" do
         | 
| 111 | 
            +
                    @prepared.should be_instance_of(Array)
         | 
| 112 | 
            +
                    @prepared.size.should == 1
         | 
| 113 | 
            +
                    @prepared.first.should be_instance_of(Payload)
         | 
| 114 | 
            +
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  it "associated the specified project with all generated payloads" do
         | 
| 117 | 
            +
                    @prepared.each do |payload|
         | 
| 118 | 
            +
                      payload.project.should == @project
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                context "when supplying a hash with approximately 15,000 characters" do
         | 
| 124 | 
            +
                  before(:each) do
         | 
| 125 | 
            +
                    single_commit_ex =  {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_000"}
         | 
| 126 | 
            +
                    commit_count = 15000 / single_commit_ex.to_s.length + 1
         | 
| 127 | 
            +
                    commits = commit_count.times.map do |index|
         | 
| 128 | 
            +
                      {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_#{index}"}
         | 
| 129 | 
            +
                    end
         | 
| 130 | 
            +
                    raw_payload = {:commits => commits}
         | 
| 131 | 
            +
                    @prepared = Payload.prepare(@project, raw_payload)
         | 
| 132 | 
            +
                  end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                  it "returns an Array with a four payload elements" do
         | 
| 135 | 
            +
                    @prepared.should be_instance_of(Array)
         | 
| 136 | 
            +
                    @prepared.size.should == 4
         | 
| 137 | 
            +
                    all_are_payloads = @prepared.all? {|chunk| chunk.instance_of?(Payload)}
         | 
| 138 | 
            +
                    all_are_payloads.should == true
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                  it "associated the specified project with all generated payloads" do
         | 
| 142 | 
            +
                    @prepared.each do |payload|
         | 
| 143 | 
            +
                      payload.project.should == @project
         | 
| 144 | 
            +
                    end
         | 
| 145 | 
            +
                  end
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
            end
         | 
| @@ -0,0 +1,286 @@ | |
| 1 | 
            +
            require File.dirname(__FILE__) + '/../../spec_helper.rb'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe "API::Project" do
         | 
| 4 | 
            +
              include CodeFumesServiceHelpers::ProjectHelpers
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              before(:each) do
         | 
| 7 | 
            +
                setup_fixture_base
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              after(:all) do
         | 
| 11 | 
            +
                FakeWeb.allow_net_connect = false
         | 
| 12 | 
            +
                FakeWeb.clean_registry
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              describe "#create" do
         | 
| 16 | 
            +
                context "when successful" do
         | 
| 17 | 
            +
                  before(:each) do
         | 
| 18 | 
            +
                    register_create_uri
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  [:public_key,
         | 
| 22 | 
            +
                   :private_key,
         | 
| 23 | 
            +
                   :short_uri,
         | 
| 24 | 
            +
                   :community_uri,
         | 
| 25 | 
            +
                   :api_uri].each do |method_name|
         | 
| 26 | 
            +
                     it "sets the '#{method_name.to_s}'" do
         | 
| 27 | 
            +
                       project = Project.create
         | 
| 28 | 
            +
                       project.send(method_name).should_not be_nil
         | 
| 29 | 
            +
                     end
         | 
| 30 | 
            +
                   end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                context "when unsuccessful" do
         | 
| 34 | 
            +
                  before(:each) do
         | 
| 35 | 
            +
                    register_create_uri(["404", "Not found"])
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  specify {Project.create.should be_false}
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              describe "#save" do
         | 
| 43 | 
            +
                context "with valid parameters" do
         | 
| 44 | 
            +
                  it "sets basic auth with the public and private key" do
         | 
| 45 | 
            +
                    register_update_uri
         | 
| 46 | 
            +
                    API.should_receive(:put).with("/projects/#{@project.public_key}", :query => anything(), :basic_auth => {:username => @project.public_key, :password => @project.private_key}).and_return(mock("response", :code => 401))
         | 
| 47 | 
            +
                    @project.save
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  context "and the response is '200 Ok'" do
         | 
| 51 | 
            +
                    before(:each) do
         | 
| 52 | 
            +
                      register_update_uri
         | 
| 53 | 
            +
                      @project.name = @updated_name
         | 
| 54 | 
            +
                      @project.save.should be_true
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    [ :public_key,
         | 
| 58 | 
            +
                      :private_key,
         | 
| 59 | 
            +
                      :short_uri,
         | 
| 60 | 
            +
                      :community_uri,
         | 
| 61 | 
            +
                      :name,
         | 
| 62 | 
            +
                      :api_uri].each do |method_name|
         | 
| 63 | 
            +
                        it "sets the '#{method_name.to_s}'" do
         | 
| 64 | 
            +
                          @project.send(method_name).should_not be_nil
         | 
| 65 | 
            +
                        end
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  context "and the response is '401 Unauthorized'" do
         | 
| 70 | 
            +
                    it "returns false" do
         | 
| 71 | 
            +
                      @project.name = @updated_name
         | 
| 72 | 
            +
                      register_update_uri(["401", "Unauthorized"])
         | 
| 73 | 
            +
                      @project.save.should be_false
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                context "with invalid parameters" do
         | 
| 79 | 
            +
                  before(:each) do
         | 
| 80 | 
            +
                    register_show_uri(["404", "Not found"], "")
         | 
| 81 | 
            +
                    register_create_uri(["422", "Unprocessable Entity"], "")
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  it "returns false" do
         | 
| 85 | 
            +
                    Project.create.should be_false
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              context "#delete" do
         | 
| 91 | 
            +
                before(:each) do
         | 
| 92 | 
            +
                  FakeWeb.register_uri(:delete, @authd_project_api_uri, :status => ["200", "Successful"], :body   => "")
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                it "sets basic auth with the public and private key" do
         | 
| 96 | 
            +
                  API.should_receive(:delete).with("/projects/#{@project.public_key}", :basic_auth => {:username => @project.public_key, :password => @project.private_key}).and_return(mock("response", :code => 401))
         | 
| 97 | 
            +
                  @project.delete
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                context "without a private key specified" do
         | 
| 101 | 
            +
                  it "raises an InsufficientCredentials error" do
         | 
| 102 | 
            +
                    lambda {Project.new('public_key').delete}.should raise_error(Errors::InsufficientCredentials)
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                context "without a public key specified" do
         | 
| 107 | 
            +
                  it "raises an InsufficientCredentials error" do
         | 
| 108 | 
            +
                    lambda {Project.new(nil, 'private_key').delete}.should raise_error(Errors::InsufficientCredentials)
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                context "with Sucessful response" do
         | 
| 113 | 
            +
                  it "returns true" do
         | 
| 114 | 
            +
                    @project.delete.should be_true
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                context "with Unauthorized response" do
         | 
| 119 | 
            +
                  it "returns false when invalid Unauthorized response is received" do
         | 
| 120 | 
            +
                    register_delete_uri(["401", "Unauthorized"], "")
         | 
| 121 | 
            +
                    @project.delete.should be_false
         | 
| 122 | 
            +
                  end
         | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              describe "#to_config" do
         | 
| 127 | 
            +
                before(:each) do
         | 
| 128 | 
            +
                  register_show_uri(["404", "Not Found"], "")
         | 
| 129 | 
            +
                  register_create_uri
         | 
| 130 | 
            +
                  @project = Project.create
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                it "returns an object keyed by the project's public_key as a symbol" do
         | 
| 134 | 
            +
                  @project.to_config.should include(@project.public_key.to_sym)
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                context "the content under the project's public_key element" do
         | 
| 138 | 
            +
                  [:private_key, :api_uri, :short_uri].each do |project_attribute|
         | 
| 139 | 
            +
                    it "includes a key-value pair of ':#{project_attribute.to_s} => [project's #{project_attribute.to_s}]'" do
         | 
| 140 | 
            +
                      value = @project.send(project_attribute)
         | 
| 141 | 
            +
                      @project.to_config[@project.public_key.to_sym].should include(project_attribute => value)
         | 
| 142 | 
            +
                    end
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
                end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                it "doesn't include the private_key in the hash if it is nil" do
         | 
| 147 | 
            +
                  public_key = "key_to_happiness"
         | 
| 148 | 
            +
                  Project.new(public_key).to_config[public_key.to_sym].should_not have_key(:private_key)
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              describe "#claim" do
         | 
| 153 | 
            +
                let(:project) {Project.new('public_key_value', 'private_key_value')}
         | 
| 154 | 
            +
                let(:api_key) {"USERS_API_KEY"}
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                before(:each) do
         | 
| 157 | 
            +
                  ConfigFile.stub!(:credentials).and_return({:api_key => api_key})
         | 
| 158 | 
            +
                end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                it "delegates the request to the Claim class" do
         | 
| 161 | 
            +
                  Claim.should_receive(:create).with(project, api_key)
         | 
| 162 | 
            +
                  project.claim
         | 
| 163 | 
            +
                end
         | 
| 164 | 
            +
              end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
              describe "#release" do
         | 
| 167 | 
            +
                let(:project) {Project.new('public_key_value', 'private_key_value')}
         | 
| 168 | 
            +
                let(:api_key) {"USERS_API_KEY"}
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                before(:each) do
         | 
| 171 | 
            +
                  ConfigFile.stub!(:credentials).and_return({:api_key => api_key})
         | 
| 172 | 
            +
                end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                it "delegates the request to the Claim class" do
         | 
| 175 | 
            +
                  Claim.should_receive(:destroy).with(project, api_key)
         | 
| 176 | 
            +
                  project.release
         | 
| 177 | 
            +
                end
         | 
| 178 | 
            +
              end
         | 
| 179 | 
            +
             | 
| 180 | 
            +
              describe "protected attributes" do
         | 
| 181 | 
            +
                [:api_uri, :community_uri, :short_uri].each do |attribute_name|
         | 
| 182 | 
            +
                  it "values passed in during initiazation for '#{attribute_name.to_s}' are silently ignored" do
         | 
| 183 | 
            +
                    p = Project.new(attribute_name => Time.now.to_s)
         | 
| 184 | 
            +
                    p.send(attribute_name).should be_nil
         | 
| 185 | 
            +
                  end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                  it "calling '#{attribute_name.to_s}= [value]' is not supported" do
         | 
| 188 | 
            +
                    p = Project.new
         | 
| 189 | 
            +
                    lambda {p.send("#{attribute_name}=", "my_value")}.should raise_error
         | 
| 190 | 
            +
                  end
         | 
| 191 | 
            +
                end
         | 
| 192 | 
            +
              end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
              describe "accessible attributes" do
         | 
| 195 | 
            +
                let(:key_specified) {"public_key"}
         | 
| 196 | 
            +
                let(:name_specified) {"project_name"}
         | 
| 197 | 
            +
                let(:project) {Project.new(key_specified, '', :name => name_specified)}
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                specify {project.public_key.should == key_specified}
         | 
| 200 | 
            +
                specify {project.name.should == name_specified}
         | 
| 201 | 
            +
              end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
              describe "#find" do
         | 
| 204 | 
            +
                context "specifying a public_key which is already associated to a project on the site" do
         | 
| 205 | 
            +
                  it "returns an initialized instance of the Project class" do
         | 
| 206 | 
            +
                    register_show_uri
         | 
| 207 | 
            +
                    expected_config = {
         | 
| 208 | 
            +
                                        @pub_key.to_sym =>
         | 
| 209 | 
            +
                                          {
         | 
| 210 | 
            +
                                            :private_key=>"private_key_value",
         | 
| 211 | 
            +
                                            :api_uri=>"http://codefumes.com/api/v1/xml/projects/#{@pub_key}.xml",
         | 
| 212 | 
            +
                                            :short_uri=>"http://codefumes.com/p/#{@pub_key}"
         | 
| 213 | 
            +
                                          }
         | 
| 214 | 
            +
                                      }
         | 
| 215 | 
            +
                    Project.find(@pub_key).to_config.should == expected_config
         | 
| 216 | 
            +
                  end
         | 
| 217 | 
            +
                end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                # TODO: clean up duplication w/ non-Symbol test
         | 
| 220 | 
            +
                context "specifying a public_key which is already associated to a project on the site as a Symbol" do
         | 
| 221 | 
            +
                  it "returns an initialized instance of the Project class" do
         | 
| 222 | 
            +
                    register_show_uri
         | 
| 223 | 
            +
                    expected_config = {
         | 
| 224 | 
            +
                                        @pub_key.to_sym =>
         | 
| 225 | 
            +
                                          {
         | 
| 226 | 
            +
                                            :private_key=>"private_key_value",
         | 
| 227 | 
            +
                                            :api_uri=>"http://codefumes.com/api/v1/xml/projects/#{@pub_key}.xml",
         | 
| 228 | 
            +
                                            :short_uri=>"http://codefumes.com/p/#{@pub_key}"
         | 
| 229 | 
            +
                                          }
         | 
| 230 | 
            +
                                      }
         | 
| 231 | 
            +
                    Project.find(@pub_key.to_sym).to_config.should == expected_config
         | 
| 232 | 
            +
                  end
         | 
| 233 | 
            +
                end
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                context "specifying a public_key which is not associated to any project on the site yet" do
         | 
| 236 | 
            +
                  before(:each) do
         | 
| 237 | 
            +
                    register_show_uri(["404", "Not Found"], "")
         | 
| 238 | 
            +
                  end
         | 
| 239 | 
            +
             | 
| 240 | 
            +
                  it "returns nil" do
         | 
| 241 | 
            +
                    Project.find(@pub_key).should == nil
         | 
| 242 | 
            +
                  end
         | 
| 243 | 
            +
                end
         | 
| 244 | 
            +
             | 
| 245 | 
            +
                context "supplying a nil public key" do
         | 
| 246 | 
            +
                  it "does not hit the CodeFumes server" do
         | 
| 247 | 
            +
                    API.should_not_receive(:get)
         | 
| 248 | 
            +
                    Project.find(nil).should == nil
         | 
| 249 | 
            +
                  end
         | 
| 250 | 
            +
                  it "returns nil" do
         | 
| 251 | 
            +
                    Project.find(nil).should == nil
         | 
| 252 | 
            +
                  end
         | 
| 253 | 
            +
                end
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                context "supplying an empty string as a public key" do
         | 
| 256 | 
            +
                  it "does not hit the CodeFumes server" do
         | 
| 257 | 
            +
                    API.should_not_receive(:get)
         | 
| 258 | 
            +
                    Project.find('').should == nil
         | 
| 259 | 
            +
                  end
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                  it "returns nil" do
         | 
| 262 | 
            +
                    Project.find('').should == nil
         | 
| 263 | 
            +
                  end
         | 
| 264 | 
            +
                end
         | 
| 265 | 
            +
              end
         | 
| 266 | 
            +
             | 
| 267 | 
            +
              describe "#reinitialize_from_hash!" do
         | 
| 268 | 
            +
                let(:option_keys) {[:name, :public_key, :private_key, :short_uri, :community_uri, :api_uri, :build_status]}
         | 
| 269 | 
            +
             | 
| 270 | 
            +
                it "supports a Hash with Strings as keys" do
         | 
| 271 | 
            +
                  params = option_keys.inject({}) {|option_params,key| option_params.merge(key.to_s => key.to_s)}
         | 
| 272 | 
            +
                  project = Project.new.reinitialize_from_hash!(params)
         | 
| 273 | 
            +
                  option_keys.each do |attr_name|
         | 
| 274 | 
            +
                    project.send(attr_name).should == attr_name.to_s
         | 
| 275 | 
            +
                  end
         | 
| 276 | 
            +
                end
         | 
| 277 | 
            +
             | 
| 278 | 
            +
                it "supports a Hash with Symbols as keys" do
         | 
| 279 | 
            +
                  params = option_keys.inject({}) {|option_params,key| option_params.merge(key.to_sym => key.to_s)}
         | 
| 280 | 
            +
                  project = Project.new.reinitialize_from_hash!(params)
         | 
| 281 | 
            +
                  option_keys.each do |attr_name|
         | 
| 282 | 
            +
                    project.send(attr_name.to_sym).should == attr_name.to_s
         | 
| 283 | 
            +
                  end
         | 
| 284 | 
            +
                end
         | 
| 285 | 
            +
              end
         | 
| 286 | 
            +
            end
         | 
    
        data/spec/codefumes/api_spec.rb
    CHANGED
    
    | @@ -1,40 +1,63 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/../spec_helper.rb'
         | 
| 2 2 |  | 
| 3 | 
            -
            class APIClass < CodeFumes::API
         | 
| 4 | 
            -
            end
         | 
| 5 | 
            -
             | 
| 6 3 | 
             
            describe "API" do
         | 
| 7 4 | 
             
              after(:all) do
         | 
| 8 | 
            -
                CodeFumes::API.mode | 
| 5 | 
            +
                CodeFumes::API.mode = :production
         | 
| 9 6 | 
             
              end
         | 
| 10 7 |  | 
| 11 8 | 
             
              it "defaults the base uri to the production site" do
         | 
| 12 | 
            -
                 | 
| 9 | 
            +
                API.base_uri.should == 'http://codefumes.com/api/v1/xml'
         | 
| 13 10 | 
             
              end
         | 
| 14 11 |  | 
| 15 12 | 
             
              context "switching modes" do
         | 
| 16 13 | 
             
                before(:each) do
         | 
| 17 | 
            -
                   | 
| 14 | 
            +
                  API.mode = :test
         | 
| 18 15 | 
             
                end
         | 
| 19 16 |  | 
| 20 17 | 
             
                it "changes the base uri to the test site when switched to test mode" do
         | 
| 21 | 
            -
                   | 
| 18 | 
            +
                  API.base_uri.should == API::BASE_URIS[:test]
         | 
| 22 19 | 
             
                end
         | 
| 23 20 |  | 
| 24 21 | 
             
                it "changes the base uri to the production site when switched to production mode" do
         | 
| 25 | 
            -
                   | 
| 26 | 
            -
                   | 
| 22 | 
            +
                  API.mode = :production
         | 
| 23 | 
            +
                  API.base_uri.should == API::BASE_URIS[:production]
         | 
| 27 24 | 
             
                end
         | 
| 28 25 |  | 
| 29 26 | 
             
                it "ignores unrecognized modes" do
         | 
| 30 | 
            -
                   | 
| 31 | 
            -
                   | 
| 27 | 
            +
                  API.mode = :incomprehensible
         | 
| 28 | 
            +
                  API.base_uri.should == API::BASE_URIS[:test]
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                it "treats empty Strings as an unrecognized mode" do
         | 
| 32 | 
            +
                  API.mode = ''
         | 
| 33 | 
            +
                  API.base_uri.should == API::BASE_URIS[:test]
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                it "treats nil as an unrecognized mode" do
         | 
| 37 | 
            +
                  API.mode = nil
         | 
| 38 | 
            +
                  API.base_uri.should == API::BASE_URIS[:test]
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                it "supports String versions of the supported modes" do
         | 
| 42 | 
            +
                  API.base_uri.should == API::BASE_URIS[:test]
         | 
| 43 | 
            +
                  API.mode = 'production'
         | 
| 44 | 
            +
                  API.base_uri.should == API::BASE_URIS[:production]
         | 
| 32 45 | 
             
                end
         | 
| 33 46 |  | 
| 34 | 
            -
                it "changes the base uri to ' | 
| 35 | 
            -
                   | 
| 36 | 
            -
                   | 
| 47 | 
            +
                it "changes the base uri to 'codefumes.com.local' when switched to local mode (for developer testing)" do
         | 
| 48 | 
            +
                  API.mode = :local
         | 
| 49 | 
            +
                  API.base_uri.should == API::BASE_URIS[:local]
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
              context "#mode?" do
         | 
| 53 | 
            +
                specify {API.mode?(:production).should == true}
         | 
| 54 | 
            +
                specify {API.mode?('production').should == true}
         | 
| 55 | 
            +
                specify {API.mode?(:test).should == false}
         | 
| 56 | 
            +
                specify {API.mode?(:anything).should == false}
         | 
| 57 | 
            +
                specify {API.mode?(nil).should == false}
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                it "does not modify the existing mode" do
         | 
| 60 | 
            +
                  lambda {API.mode?(:test)}.should_not change(API, :base_uri)
         | 
| 37 61 | 
             
                end
         | 
| 38 62 | 
             
              end
         | 
| 39 | 
            -
              
         | 
| 40 63 | 
             
            end
         |