sem 0.1.4 → 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.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/lib/sem/api/base.rb +7 -5
- data/lib/sem/api/env_vars.rb +12 -10
- data/lib/sem/api/files.rb +11 -9
- data/lib/sem/api/orgs.rb +27 -39
- data/lib/sem/api/projects.rb +27 -18
- data/lib/sem/api/shared_configs.rb +73 -45
- data/lib/sem/api/teams.rb +48 -33
- data/lib/sem/api/traits/associated_with_org.rb +6 -2
- data/lib/sem/api/traits/associated_with_project.rb +29 -0
- data/lib/sem/api/traits/associated_with_shared_config.rb +9 -7
- data/lib/sem/api/traits/associated_with_team.rb +12 -12
- data/lib/sem/api/traits.rb +1 -0
- data/lib/sem/api/users.rb +30 -12
- data/lib/sem/api.rb +0 -1
- data/lib/sem/cli/orgs.rb +11 -28
- data/lib/sem/cli/projects.rb +46 -3
- data/lib/sem/cli/shared_configs.rb +57 -30
- data/lib/sem/cli/teams.rb +101 -45
- data/lib/sem/cli.rb +21 -4
- data/lib/sem/configuration.rb +48 -0
- data/lib/sem/errors.rb +33 -0
- data/lib/sem/pagination.rb +29 -0
- data/lib/sem/srn.rb +42 -0
- data/lib/sem/version.rb +1 -1
- data/lib/sem/views/base.rb +8 -3
- data/lib/sem/views/orgs.rb +9 -0
- data/lib/sem/views/projects.rb +31 -14
- data/lib/sem/views/shared_configs.rb +11 -0
- data/lib/sem/views/teams.rb +68 -16
- data/lib/sem/views/users.rb +5 -7
- data/lib/sem.rb +35 -2
- data/sem.gemspec +4 -3
- metadata +28 -13
- data/lib/sem/api/users_with_permissions.rb +0 -57
- data/lib/sem/credentials.rb +0 -19
- data/lib/sem/views/users_with_permissions.rb +0 -13
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ccd122f3ce04fc09324bb135463966fd91fe5d90
         | 
| 4 | 
            +
              data.tar.gz: aff41dee6b2352c2844beb298c8a0ed5268ff5d0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: fa93e1e6a31b3f5faf0ea12a32e1178acf2c3fa041105d403b95659b1321d75819b1862f3524fbcd64015f506a6736bf10ab50b82dab69097b85d030f2010448
         | 
| 7 | 
            +
              data.tar.gz: a59bc4d8e6248700231099d8f36bac604bd7f0bfc6a15817addb1774b2b7b6082e58b7b2c784cb200a58d83785da1dffebc7279d90f77b086a679dc83ddc5d07
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            # Semaphore CLI
         | 
| 2 2 |  | 
| 3 3 | 
             
            [](https://semaphoreci.com/renderedtext/cli)
         | 
| 4 | 
            +
            [](https://badge.fury.io/rb/sem)
         | 
| 4 5 |  | 
| 5 6 | 
             
            
         | 
| 6 7 |  | 
| @@ -10,6 +11,22 @@ The Semaphore CLI is used to manage Semaphore projects from the command line. | |
| 10 11 |  | 
| 11 12 | 
             
            For more info about Semaphore see <https://www.semaphoreci.com>
         | 
| 12 13 |  | 
| 14 | 
            +
            ## Semaphore Resource Name (SRN)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            SRN is a way of identifying Semaphore resources. This CLI uses SRNs as arguments
         | 
| 17 | 
            +
            for all actions.
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            Formats for individual resources are the following:
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            - Organization: `organization_name`
         | 
| 22 | 
            +
            - Team: `organization_name/team_name`
         | 
| 23 | 
            +
            - Project: `organization_name/project_name`
         | 
| 24 | 
            +
            - Shared Configuration: `organization_name/shared_configuration_name`
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            ## Using custom API URL
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            Create a file at `~/.sem/api_url` containing only the custom url.
         | 
| 29 | 
            +
             | 
| 13 30 | 
             
            ## Issues
         | 
| 14 31 |  | 
| 15 32 | 
             
            For problems directly related to the CLI, [add an issue on GitHub](https://github.com/renderedtext/cli/issues/new).
         | 
    
        data/lib/sem/api/base.rb
    CHANGED
    
    | @@ -1,11 +1,13 @@ | |
| 1 1 | 
             
            module Sem
         | 
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                class Base
         | 
| 4 | 
            -
                   | 
| 5 | 
            -
                     | 
| 6 | 
            -
                       | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 4 | 
            +
                  class << self
         | 
| 5 | 
            +
                    def client
         | 
| 6 | 
            +
                      @client ||= SemaphoreClient.new(
         | 
| 7 | 
            +
                        Sem::Configuration.auth_token,
         | 
| 8 | 
            +
                        :api_url => Sem::Configuration.api_url,
         | 
| 9 | 
            +
                        :verbose => (Sem.log_level == Sem::LOG_LEVEL_TRACE)
         | 
| 10 | 
            +
                      )
         | 
| 9 11 | 
             
                    end
         | 
| 10 12 | 
             
                  end
         | 
| 11 13 | 
             
                end
         | 
    
        data/lib/sem/api/env_vars.rb
    CHANGED
    
    | @@ -3,17 +3,19 @@ module Sem | |
| 3 3 | 
             
                class EnvVars < Base
         | 
| 4 4 | 
             
                  extend Traits::AssociatedWithSharedConfig
         | 
| 5 5 |  | 
| 6 | 
            -
                   | 
| 7 | 
            -
                     | 
| 8 | 
            -
             | 
| 6 | 
            +
                  class << self
         | 
| 7 | 
            +
                    def api
         | 
| 8 | 
            +
                      client.env_vars
         | 
| 9 | 
            +
                    end
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 11 | 
            +
                    def to_hash(env_var)
         | 
| 12 | 
            +
                      {
         | 
| 13 | 
            +
                        :id => env_var.id,
         | 
| 14 | 
            +
                        :name => env_var.name,
         | 
| 15 | 
            +
                        :encrypted? => env_var.encrypted,
         | 
| 16 | 
            +
                        :content => env_var.content
         | 
| 17 | 
            +
                      }
         | 
| 18 | 
            +
                    end
         | 
| 17 19 | 
             
                  end
         | 
| 18 20 | 
             
                end
         | 
| 19 21 | 
             
              end
         | 
    
        data/lib/sem/api/files.rb
    CHANGED
    
    | @@ -3,16 +3,18 @@ module Sem | |
| 3 3 | 
             
                class Files < Base
         | 
| 4 4 | 
             
                  extend Traits::AssociatedWithSharedConfig
         | 
| 5 5 |  | 
| 6 | 
            -
                   | 
| 7 | 
            -
                     | 
| 8 | 
            -
             | 
| 6 | 
            +
                  class << self
         | 
| 7 | 
            +
                    def api
         | 
| 8 | 
            +
                      client.config_files
         | 
| 9 | 
            +
                    end
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 11 | 
            +
                    def to_hash(file)
         | 
| 12 | 
            +
                      {
         | 
| 13 | 
            +
                        :id => file.id,
         | 
| 14 | 
            +
                        :name => file.path,
         | 
| 15 | 
            +
                        :encrypted? => file.encrypted
         | 
| 16 | 
            +
                      }
         | 
| 17 | 
            +
                    end
         | 
| 16 18 | 
             
                  end
         | 
| 17 19 | 
             
                end
         | 
| 18 20 | 
             
              end
         | 
    
        data/lib/sem/api/orgs.rb
    CHANGED
    
    | @@ -1,53 +1,41 @@ | |
| 1 1 | 
             
            module Sem
         | 
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                class Orgs < Base
         | 
| 4 | 
            -
                   | 
| 5 | 
            -
                     | 
| 4 | 
            +
                  class << self
         | 
| 5 | 
            +
                    def list
         | 
| 6 | 
            +
                      orgs = api.list
         | 
| 6 7 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                  def self.info(name)
         | 
| 11 | 
            -
                    org = api.get(name)
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                    to_hash(org)
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                  def self.list_teams(org_name)
         | 
| 17 | 
            -
                    Sem::API::Teams.list_for_org(org_name)
         | 
| 18 | 
            -
                  end
         | 
| 8 | 
            +
                      orgs.map { |org| to_hash(org) }
         | 
| 9 | 
            +
                    end
         | 
| 19 10 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def self.list_admins(org_name)
         | 
| 25 | 
            -
                    admin_teams = list_teams(org_name).select { |team| team[:permission] == "admin" }
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    admins = admin_teams.map { |team| client.users.list_for_team(team[:id]) }.flatten
         | 
| 11 | 
            +
                    def info(name)
         | 
| 12 | 
            +
                      org = api.get(name)
         | 
| 28 13 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
                  end
         | 
| 14 | 
            +
                      raise Sem::Errors::ResourceNotFound.new("Organization", [name]) if org.nil?
         | 
| 31 15 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
                     | 
| 16 | 
            +
                      to_hash(org)
         | 
| 17 | 
            +
                    end
         | 
| 34 18 |  | 
| 35 | 
            -
                     | 
| 19 | 
            +
                    def list_teams(name)
         | 
| 20 | 
            +
                      Sem::API::Teams.list_for_org(name)
         | 
| 21 | 
            +
                    end
         | 
| 36 22 |  | 
| 37 | 
            -
                     | 
| 38 | 
            -
             | 
| 23 | 
            +
                    def list_users(name)
         | 
| 24 | 
            +
                      Sem::API::Users.list_for_org(name)
         | 
| 25 | 
            +
                    end
         | 
| 39 26 |  | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 27 | 
            +
                    def api
         | 
| 28 | 
            +
                      client.orgs
         | 
| 29 | 
            +
                    end
         | 
| 43 30 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 31 | 
            +
                    def to_hash(org)
         | 
| 32 | 
            +
                      {
         | 
| 33 | 
            +
                        :id => org.id,
         | 
| 34 | 
            +
                        :username => org.username,
         | 
| 35 | 
            +
                        :created_at => org.created_at,
         | 
| 36 | 
            +
                        :updated_at => org.updated_at
         | 
| 37 | 
            +
                      }
         | 
| 38 | 
            +
                    end
         | 
| 51 39 | 
             
                  end
         | 
| 52 40 | 
             
                end
         | 
| 53 41 | 
             
              end
         | 
    
        data/lib/sem/api/projects.rb
    CHANGED
    
    | @@ -4,29 +4,38 @@ module Sem | |
| 4 4 | 
             
                  extend Traits::AssociatedWithOrg
         | 
| 5 5 | 
             
                  extend Traits::AssociatedWithTeam
         | 
| 6 6 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
                     | 
| 7 | 
            +
                  class << self
         | 
| 8 | 
            +
                    def name_to_id(org_name, project_name)
         | 
| 9 | 
            +
                      info(org_name, project_name)[:id]
         | 
| 10 | 
            +
                    end
         | 
| 9 11 |  | 
| 10 | 
            -
                     | 
| 11 | 
            -
             | 
| 12 | 
            +
                    def list
         | 
| 13 | 
            +
                      org_names = Orgs.list.map { |org| org[:username] }
         | 
| 12 14 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
                     | 
| 15 | 
            +
                      org_names.pmap { |name| list_for_org(name) }.flatten
         | 
| 16 | 
            +
                    end
         | 
| 15 17 |  | 
| 16 | 
            -
                     | 
| 17 | 
            -
             | 
| 18 | 
            +
                    def info(org_name, project_name)
         | 
| 19 | 
            +
                      project = api.list_for_org(org_name, :name => project_name).first
         | 
| 18 20 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 21 | 
            +
                      raise Sem::Errors::ResourceNotFound.new("Project", [org_name, project_name]) if project.nil?
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      to_hash(project, org_name)
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def api
         | 
| 27 | 
            +
                      client.projects
         | 
| 28 | 
            +
                    end
         | 
| 22 29 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            +
                    def to_hash(project, org)
         | 
| 31 | 
            +
                      {
         | 
| 32 | 
            +
                        :id => project.id,
         | 
| 33 | 
            +
                        :name => project.name,
         | 
| 34 | 
            +
                        :org => org,
         | 
| 35 | 
            +
                        :created_at => project.created_at,
         | 
| 36 | 
            +
                        :updated_at => project.updated_at
         | 
| 37 | 
            +
                      }
         | 
| 38 | 
            +
                    end
         | 
| 30 39 | 
             
                  end
         | 
| 31 40 | 
             
                end
         | 
| 32 41 | 
             
              end
         | 
| @@ -3,71 +3,99 @@ module Sem | |
| 3 3 | 
             
                class SharedConfigs < Base
         | 
| 4 4 | 
             
                  extend Traits::AssociatedWithTeam
         | 
| 5 5 | 
             
                  extend Traits::AssociatedWithOrg
         | 
| 6 | 
            +
                  extend Traits::AssociatedWithProject
         | 
| 6 7 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
                     | 
| 8 | 
            +
                  class << self
         | 
| 9 | 
            +
                    def name_to_id(org_name, shared_config_name)
         | 
| 10 | 
            +
                      info(org_name, shared_config_name)[:id]
         | 
| 11 | 
            +
                    end
         | 
| 9 12 |  | 
| 10 | 
            -
                     | 
| 11 | 
            -
             | 
| 13 | 
            +
                    def list
         | 
| 14 | 
            +
                      org_names = Orgs.list.map { |org| org[:username] }
         | 
| 12 15 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
                     | 
| 16 | 
            +
                      org_names.pmap { |name| list_for_org(name) }.flatten
         | 
| 17 | 
            +
                    end
         | 
| 15 18 |  | 
| 16 | 
            -
                     | 
| 17 | 
            -
             | 
| 19 | 
            +
                    def info(org_name, shared_config_name)
         | 
| 20 | 
            +
                      selected_shared_config = list_for_org(org_name).find do |shared_config|
         | 
| 21 | 
            +
                        shared_config[:name] == shared_config_name
         | 
| 22 | 
            +
                      end
         | 
| 18 23 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 24 | 
            +
                      if selected_shared_config.nil?
         | 
| 25 | 
            +
                        raise Sem::Errors::ResourceNotFound.new("Shared Configuration", [org_name, shared_config_name])
         | 
| 26 | 
            +
                      end
         | 
| 21 27 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 28 | 
            +
                      selected_shared_config
         | 
| 29 | 
            +
                    end
         | 
| 24 30 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 31 | 
            +
                    def create(org_name, args)
         | 
| 32 | 
            +
                      shared_config = api.create_for_org(org_name, args)
         | 
| 27 33 |  | 
| 28 | 
            -
             | 
| 34 | 
            +
                      if shared_config.nil?
         | 
| 35 | 
            +
                        raise Sem::Errors::ResourceNotCreated.new("Shared Configuration", [org_name, args[:name]])
         | 
| 36 | 
            +
                      end
         | 
| 29 37 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 38 | 
            +
                      to_hash(shared_config, org_name)
         | 
| 39 | 
            +
                    end
         | 
| 32 40 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 41 | 
            +
                    def update(org_name, shared_config_name, args)
         | 
| 42 | 
            +
                      shared_config = info(org_name, shared_config_name)
         | 
| 35 43 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
                  end
         | 
| 44 | 
            +
                      shared_config = api.update(shared_config[:id], args)
         | 
| 38 45 |  | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 46 | 
            +
                      if shared_config.nil?
         | 
| 47 | 
            +
                        raise Sem::Errors::ResourceNotUpdated.new("Shared Configuration", [org_name, shared_config_name])
         | 
| 48 | 
            +
                      end
         | 
| 42 49 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
                     | 
| 45 | 
            -
                  end
         | 
| 50 | 
            +
                      to_hash(shared_config, org_name)
         | 
| 51 | 
            +
                    end
         | 
| 46 52 |  | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
                  end
         | 
| 53 | 
            +
                    def delete(org_name, shared_config_name)
         | 
| 54 | 
            +
                      shared_config = info(org_name, shared_config_name)
         | 
| 50 55 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
                     | 
| 53 | 
            -
                       | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
                       | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 56 | 
            +
                      api.delete!(shared_config[:id])
         | 
| 57 | 
            +
                    rescue SemaphoreClient::Exceptions::RequestFailed
         | 
| 58 | 
            +
                      raise Sem::Errors::ResourceNotDeleted.new("Shared Configuration", [org_name, shared_config_name])
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    def list_env_vars(org_name, shared_config_name)
         | 
| 62 | 
            +
                      Sem::API::EnvVars.list_for_shared_config(org_name, shared_config_name)
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    def list_files(org_name, shared_config_name)
         | 
| 66 | 
            +
                      Sem::API::Files.list_for_shared_config(org_name, shared_config_name)
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    def api
         | 
| 70 | 
            +
                      client.shared_configs
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    def to_hash(shared_config, org)
         | 
| 74 | 
            +
                      network_actions = [:config_files_count, :env_vars_count]
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                      config_files, env_vars = network_actions.pmap do |action|
         | 
| 77 | 
            +
                        send(action, shared_config.id)
         | 
| 78 | 
            +
                      end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                      {
         | 
| 81 | 
            +
                        :id => shared_config.id,
         | 
| 82 | 
            +
                        :name => shared_config.name,
         | 
| 83 | 
            +
                        :org => org,
         | 
| 84 | 
            +
                        :config_files => config_files,
         | 
| 85 | 
            +
                        :env_vars => env_vars,
         | 
| 86 | 
            +
                        :created_at => shared_config.created_at,
         | 
| 87 | 
            +
                        :updated_at => shared_config.updated_at
         | 
| 88 | 
            +
                      }
         | 
| 89 | 
            +
                    end
         | 
| 61 90 |  | 
| 62 | 
            -
                  class << self
         | 
| 63 91 | 
             
                    private
         | 
| 64 92 |  | 
| 65 | 
            -
                    def config_files_count( | 
| 66 | 
            -
                      client.config_files.list_for_shared_config( | 
| 93 | 
            +
                    def config_files_count(shared_config_id)
         | 
| 94 | 
            +
                      client.config_files.list_for_shared_config(shared_config_id).to_a.size
         | 
| 67 95 | 
             
                    end
         | 
| 68 96 |  | 
| 69 | 
            -
                    def env_vars_count( | 
| 70 | 
            -
                      client.env_vars.list_for_shared_config( | 
| 97 | 
            +
                    def env_vars_count(shared_config_id)
         | 
| 98 | 
            +
                      client.env_vars.list_for_shared_config(shared_config_id).to_a.size
         | 
| 71 99 | 
             
                    end
         | 
| 72 100 | 
             
                  end
         | 
| 73 101 | 
             
                end
         | 
    
        data/lib/sem/api/teams.rb
    CHANGED
    
    | @@ -3,51 +3,66 @@ module Sem | |
| 3 3 | 
             
                class Teams < Base
         | 
| 4 4 | 
             
                  extend Traits::AssociatedWithOrg
         | 
| 5 5 |  | 
| 6 | 
            -
                   | 
| 7 | 
            -
                     | 
| 6 | 
            +
                  class << self
         | 
| 7 | 
            +
                    def name_to_id(org_name, team_name)
         | 
| 8 | 
            +
                      info(org_name, team_name)[:id]
         | 
| 9 | 
            +
                    end
         | 
| 8 10 |  | 
| 9 | 
            -
                     | 
| 10 | 
            -
             | 
| 11 | 
            +
                    def list
         | 
| 12 | 
            +
                      org_names = Sem::API::Orgs.list.map { |org| org[:username] }
         | 
| 11 13 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
                     | 
| 14 | 
            +
                      org_names.pmap { |name| list_for_org(name) }.flatten
         | 
| 15 | 
            +
                    end
         | 
| 14 16 |  | 
| 15 | 
            -
                     | 
| 16 | 
            -
             | 
| 17 | 
            +
                    def info(org_name, team_name)
         | 
| 18 | 
            +
                      selected_team = list_for_org(org_name).find { |team| team[:name] == team_name }
         | 
| 17 19 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
                    team = api.create_for_org(org_name, args)
         | 
| 20 | 
            +
                      raise Sem::Errors::ResourceNotFound.new("Team", [org_name, team_name]) if selected_team.nil?
         | 
| 20 21 |  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 22 | 
            +
                      selected_team
         | 
| 23 | 
            +
                    end
         | 
| 23 24 |  | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 25 | 
            +
                    def create(org_name, args)
         | 
| 26 | 
            +
                      team = api.create_for_org(org_name, args)
         | 
| 26 27 |  | 
| 27 | 
            -
             | 
| 28 | 
            +
                      raise Sem::Errors::ResourceNotCreated.new("Team", [org_name, args[:name]]) if team.nil?
         | 
| 28 29 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 30 | 
            +
                      to_hash(team, org_name)
         | 
| 31 | 
            +
                    end
         | 
| 31 32 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 33 | 
            +
                    def update(org_name, team_name, args)
         | 
| 34 | 
            +
                      team = info(org_name, team_name)
         | 
| 34 35 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
                  end
         | 
| 36 | 
            +
                      team = api.update(team[:id], args)
         | 
| 37 37 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 38 | 
            +
                      raise Sem::Errors::ResourceNotUpdated.new("Team", [org_name, team_name]) if team.nil?
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                      to_hash(team, org_name)
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def delete(org_name, team_name)
         | 
| 44 | 
            +
                      team = info(org_name, team_name)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      api.delete!(team[:id])
         | 
| 47 | 
            +
                    rescue SemaphoreClient::Exceptions::RequestFailed
         | 
| 48 | 
            +
                      raise Sem::Errors::ResourceNotDeleted.new("Team", [org_name, team_name])
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    def api
         | 
| 52 | 
            +
                      client.teams
         | 
| 53 | 
            +
                    end
         | 
| 41 54 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 55 | 
            +
                    def to_hash(team, org)
         | 
| 56 | 
            +
                      {
         | 
| 57 | 
            +
                        :id => team.id,
         | 
| 58 | 
            +
                        :name => team.name,
         | 
| 59 | 
            +
                        :org => org,
         | 
| 60 | 
            +
                        :permission => team.permission,
         | 
| 61 | 
            +
                        :members => client.users.list_for_team(team.id).to_a.size.to_s,
         | 
| 62 | 
            +
                        :created_at => team.created_at,
         | 
| 63 | 
            +
                        :updated_at => team.updated_at
         | 
| 64 | 
            +
                      }
         | 
| 65 | 
            +
                    end
         | 
| 51 66 | 
             
                  end
         | 
| 52 67 | 
             
                end
         | 
| 53 68 | 
             
              end
         | 
| @@ -2,10 +2,14 @@ module Sem | |
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                module Traits
         | 
| 4 4 | 
             
                  module AssociatedWithOrg
         | 
| 5 | 
            +
                    PAGES_PER_CALL = 3
         | 
| 6 | 
            +
             | 
| 5 7 | 
             
                    def list_for_org(org_name)
         | 
| 6 | 
            -
                       | 
| 8 | 
            +
                      pages = Sem::Pagination.pages(PAGES_PER_CALL) do |page_index|
         | 
| 9 | 
            +
                        api.list_for_org(org_name, :page => page_index).to_a
         | 
| 10 | 
            +
                      end
         | 
| 7 11 |  | 
| 8 | 
            -
                       | 
| 12 | 
            +
                      pages.flatten.pmap { |instance| to_hash(instance, org_name) }
         | 
| 9 13 | 
             
                    end
         | 
| 10 14 | 
             
                  end
         | 
| 11 15 | 
             
                end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Sem
         | 
| 2 | 
            +
              module API
         | 
| 3 | 
            +
                module Traits
         | 
| 4 | 
            +
                  module AssociatedWithProject
         | 
| 5 | 
            +
                    def list_for_project(org_name, project_name)
         | 
| 6 | 
            +
                      project = Projects.info(org_name, project_name)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                      instances = api.list_for_project(project[:id]).to_a
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                      instances.map { |instance| to_hash(instance, org_name) }
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def add_to_project(org_name, project_name, instance_name)
         | 
| 14 | 
            +
                      instance = info(org_name, instance_name)
         | 
| 15 | 
            +
                      project = Projects.info(org_name, project_name)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                      api.attach_to_project(instance[:id], project[:id])
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def remove_from_project(org_name, project_name, instance_name)
         | 
| 21 | 
            +
                      instance = info(org_name, instance_name)
         | 
| 22 | 
            +
                      project = Projects.info(org_name, project_name)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      api.detach_from_project(instance[:id], project[:id])
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -2,25 +2,27 @@ module Sem | |
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                module Traits
         | 
| 4 4 | 
             
                  module AssociatedWithSharedConfig
         | 
| 5 | 
            -
                    def list_for_shared_config( | 
| 6 | 
            -
                      shared_config = SharedConfigs.info( | 
| 5 | 
            +
                    def list_for_shared_config(org_name, shared_config_name)
         | 
| 6 | 
            +
                      shared_config = SharedConfigs.info(org_name, shared_config_name)
         | 
| 7 7 |  | 
| 8 | 
            -
                      instances = api.list_for_shared_config(shared_config[:id])
         | 
| 8 | 
            +
                      instances = api.list_for_shared_config(shared_config[:id]).to_a
         | 
| 9 9 |  | 
| 10 10 | 
             
                      instances.map { |instance| to_hash(instance) }
         | 
| 11 11 | 
             
                    end
         | 
| 12 12 |  | 
| 13 | 
            -
                    def add_to_shared_config( | 
| 14 | 
            -
                      shared_config = SharedConfigs.info( | 
| 13 | 
            +
                    def add_to_shared_config(org_name, shared_config_name, params)
         | 
| 14 | 
            +
                      shared_config = SharedConfigs.info(org_name, shared_config_name)
         | 
| 15 15 |  | 
| 16 16 | 
             
                      api.create_for_shared_config(shared_config[:id], params)
         | 
| 17 17 | 
             
                    end
         | 
| 18 18 |  | 
| 19 | 
            -
                    def remove_from_shared_config( | 
| 20 | 
            -
                      instances = list_for_shared_config( | 
| 19 | 
            +
                    def remove_from_shared_config(org_name, shared_config_name, instance_name)
         | 
| 20 | 
            +
                      instances = list_for_shared_config(org_name, shared_config_name)
         | 
| 21 21 |  | 
| 22 22 | 
             
                      selected_instance = instances.find { |instance| instance[:name] == instance_name }
         | 
| 23 23 |  | 
| 24 | 
            +
                      raise Sem::Errors::ResourceNotFound.new("Resource", [org_name, instance_name]) if selected_instance.nil?
         | 
| 25 | 
            +
             | 
| 24 26 | 
             
                      api.delete(selected_instance[:id])
         | 
| 25 27 | 
             
                    end
         | 
| 26 28 | 
             
                  end
         | 
| @@ -2,26 +2,26 @@ module Sem | |
| 2 2 | 
             
              module API
         | 
| 3 3 | 
             
                module Traits
         | 
| 4 4 | 
             
                  module AssociatedWithTeam
         | 
| 5 | 
            -
                    def list_for_team( | 
| 6 | 
            -
                       | 
| 5 | 
            +
                    def list_for_team(org_name, team_name)
         | 
| 6 | 
            +
                      team_id = Teams.name_to_id(org_name, team_name)
         | 
| 7 7 |  | 
| 8 | 
            -
                      instances = api.list_for_team( | 
| 8 | 
            +
                      instances = api.list_for_team(team_id).to_a
         | 
| 9 9 |  | 
| 10 | 
            -
                      instances.map { |instance| to_hash(instance) }
         | 
| 10 | 
            +
                      instances.map { |instance| to_hash(instance, org_name) }
         | 
| 11 11 | 
             
                    end
         | 
| 12 12 |  | 
| 13 | 
            -
                    def add_to_team( | 
| 14 | 
            -
                       | 
| 15 | 
            -
                       | 
| 13 | 
            +
                    def add_to_team(org_name, team_name, instance_name)
         | 
| 14 | 
            +
                      instance_id = name_to_id(org_name, instance_name)
         | 
| 15 | 
            +
                      team_id = Teams.name_to_id(org_name, team_name)
         | 
| 16 16 |  | 
| 17 | 
            -
                      api.attach_to_team( | 
| 17 | 
            +
                      api.attach_to_team(instance_id, team_id)
         | 
| 18 18 | 
             
                    end
         | 
| 19 19 |  | 
| 20 | 
            -
                    def remove_from_team( | 
| 21 | 
            -
                       | 
| 22 | 
            -
                       | 
| 20 | 
            +
                    def remove_from_team(org_name, team_name, instance_name)
         | 
| 21 | 
            +
                      instance_id = name_to_id(org_name, instance_name)
         | 
| 22 | 
            +
                      team_id = Teams.name_to_id(org_name, team_name)
         | 
| 23 23 |  | 
| 24 | 
            -
                      api.detach_from_team( | 
| 24 | 
            +
                      api.detach_from_team(instance_id, team_id)
         | 
| 25 25 | 
             
                    end
         | 
| 26 26 | 
             
                  end
         | 
| 27 27 | 
             
                end
         | 
    
        data/lib/sem/api/traits.rb
    CHANGED