p4_web_api_client 2014.2.0.pre1

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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/lib/p4_web_api_client/client/branches.rb +41 -0
  3. data/lib/p4_web_api_client/client/changes.rb +17 -0
  4. data/lib/p4_web_api_client/client/clients.rb +40 -0
  5. data/lib/p4_web_api_client/client/depots.rb +42 -0
  6. data/lib/p4_web_api_client/client/files.rb +30 -0
  7. data/lib/p4_web_api_client/client/groups.rb +41 -0
  8. data/lib/p4_web_api_client/client/jobs.rb +36 -0
  9. data/lib/p4_web_api_client/client/labels.rb +41 -0
  10. data/lib/p4_web_api_client/client/protections.rb +19 -0
  11. data/lib/p4_web_api_client/client/run.rb +38 -0
  12. data/lib/p4_web_api_client/client/servers.rb +38 -0
  13. data/lib/p4_web_api_client/client/streams.rb +38 -0
  14. data/lib/p4_web_api_client/client/triggers.rb +18 -0
  15. data/lib/p4_web_api_client/client/users.rb +38 -0
  16. data/lib/p4_web_api_client/client.rb +86 -0
  17. data/lib/p4_web_api_client/connection.rb +98 -0
  18. data/lib/p4_web_api_client/errors/perforce_problem.rb +25 -0
  19. data/lib/p4_web_api_client/errors/resource_not_found.rb +10 -0
  20. data/lib/p4_web_api_client/errors/server_error.rb +9 -0
  21. data/lib/p4_web_api_client/errors/unauthenticated.rb +11 -0
  22. data/lib/p4_web_api_client/errors.rb +4 -0
  23. data/lib/p4_web_api_client/models/branch.rb +66 -0
  24. data/lib/p4_web_api_client/models/change.rb +71 -0
  25. data/lib/p4_web_api_client/models/client.rb +129 -0
  26. data/lib/p4_web_api_client/models/depot.rb +97 -0
  27. data/lib/p4_web_api_client/models/dir.rb +45 -0
  28. data/lib/p4_web_api_client/models/file.rb +70 -0
  29. data/lib/p4_web_api_client/models/group.rb +102 -0
  30. data/lib/p4_web_api_client/models/label.rb +75 -0
  31. data/lib/p4_web_api_client/models/protections.rb +34 -0
  32. data/lib/p4_web_api_client/models/server.rb +96 -0
  33. data/lib/p4_web_api_client/models/stream.rb +111 -0
  34. data/lib/p4_web_api_client/models/triggers.rb +34 -0
  35. data/lib/p4_web_api_client/models/user.rb +75 -0
  36. data/lib/p4_web_api_client/models.rb +14 -0
  37. data/lib/p4_web_api_client/version.rb +3 -0
  38. data/lib/p4_web_api_client.rb +6 -0
  39. data/spec/branches_spec.rb +63 -0
  40. data/spec/change_spec.rb +16 -0
  41. data/spec/clients_spec.rb +64 -0
  42. data/spec/depots_spec.rb +62 -0
  43. data/spec/files_spec.rb +36 -0
  44. data/spec/groups_spec.rb +63 -0
  45. data/spec/init.base/init_p4d.rb +52 -0
  46. data/spec/jobs_spec.rb +66 -0
  47. data/spec/labels_spec.rb +62 -0
  48. data/spec/lib/test_connections.rb +28 -0
  49. data/spec/protections_spec.rb +31 -0
  50. data/spec/run_input_spec.rb +23 -0
  51. data/spec/run_spec.rb +21 -0
  52. data/spec/servers_spec.rb +64 -0
  53. data/spec/streams_spec.rb +74 -0
  54. data/spec/triggers_spec.rb +22 -0
  55. data/spec/users_spec.rb +78 -0
  56. metadata +285 -0
@@ -0,0 +1,25 @@
1
+ module P4WebApiClient
2
+ module Errors
3
+ # It's likely that many 'unknown server errors' are actually errors from
4
+ # the Perforce server. This exception allows your client code to inspect
5
+ # the returned information to **potentially** handle issues the API code
6
+ # was unable to deal with. This can happen in cases of funky Perforce
7
+ # server configurations.
8
+ #
9
+ # Expect at least one message describing the problem. Each message contains
10
+ # 3 attributes: 'MessageCode', 'MessageSeverity', and 'MessageText'. You
11
+ # probably should only use the message code for any error handling logic,
12
+ # reserving the other fields for diagnostic usage.
13
+ class PerforceProblem < Exception
14
+ attr_accessor :messages
15
+
16
+ def initialize(messages)
17
+ @messages = messages
18
+ end
19
+
20
+ def to_s
21
+ "PerforceProblem<@messages:[#{@messages}]>"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ module P4WebApiClient
2
+ module Errors
3
+ # This is an unlikely exception case, actually. In some cases (not all) if
4
+ # a resource is to be edited, and it doesn't exist, you may get this error.
5
+ # But most of the time your code should probably consider this a problem
6
+ # in your client logic, and likely not handle it directly.
7
+ class ResourceNotFound < Exception
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module P4WebApiClient
2
+ module Errors
3
+ # This is a generic response for generic problems the API doesn't really
4
+ # receive any other diagnostic issue with. You should *not* trust the
5
+ # client object after receiving this.
6
+ class ServerError < Exception
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module P4WebApiClient
2
+ module Errors
3
+ # This is just basically the 403 error type, which doesn't have much
4
+ # diagnostic information. This can happen if your session is invalid
5
+ # with perforce, you've used an invalid token, etc. Basically, you need
6
+ # to create a new session and make sure the auth string you're sending over
7
+ # is correct.
8
+ class Unauthenticated < Exception
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ require 'p4_web_api_client/errors/perforce_problem'
2
+ require 'p4_web_api_client/errors/resource_not_found'
3
+ require 'p4_web_api_client/errors/server_error'
4
+ require 'p4_web_api_client/errors/unauthenticated'
@@ -0,0 +1,66 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ require 'time'
4
+
5
+ module P4WebApiClient
6
+ module Models
7
+ # Models the output of a branch spec in the system.
8
+ #
9
+ # See also:
10
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_branch.html
11
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_branches.html
12
+ class Branch
13
+ # The branch name and primary ID
14
+ attr_accessor :branch
15
+
16
+ # Perforce login of the branch owner, this field is not important unless
17
+ # `option` is :locked
18
+ attr_accessor :owner
19
+
20
+ # DateTime of the last access to the branch spec
21
+ attr_accessor :access
22
+
23
+ # DateTime when the branch was last changed
24
+ attr_accessor :update
25
+
26
+ # Either :unlocked or :locked
27
+ attr_accessor :options
28
+
29
+ # Short description of the branch's purpose
30
+ attr_accessor :description
31
+
32
+ # Mappings from one set of depot files to another set of files. Each
33
+ # mapping is a string in the array of mappings, separated by whitespace
34
+ # (or possibly enquoted with '' characters)
35
+ attr_accessor :view
36
+
37
+ def initialize(obj = {})
38
+ @branch = obj['Branch'] if obj.key?('Branch')
39
+ @owner = obj['Owner'] if obj.key?('Owner')
40
+ @access = Time.at(obj['Access']).to_datetime if obj.key('Access')
41
+ @update = Time.at(obj['Update']).to_datetime if obj.key('Update')
42
+ @options = obj['Options'].to_sym if obj.key?('Options')
43
+ @description = obj['Description'] if obj.key?('Description')
44
+ @view = obj['View'].map(&:clone) if obj.key?('View')
45
+
46
+ # If the user has defined symbols in the Ruby-ish API, then use that
47
+ # too, but we expect the data to be in the right format.
48
+ obj.each_key do |key|
49
+ accessor = "#{key}="
50
+ send(accessor, obj[key]) if self.respond_to?(accessor)
51
+ end
52
+ end
53
+
54
+ def to_internal_hash
55
+ hash = {
56
+ Branch: @branch
57
+ }
58
+ hash[:Owner] = @owner if @owner
59
+ hash[:Options] = @options if @options
60
+ hash[:Description] = @description if @description
61
+ hash[:View] = @view if @view
62
+ hash
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,71 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ require 'time'
4
+
5
+ module P4WebApiClient
6
+ module Models
7
+ # Represents typical changelist descriptions
8
+ #
9
+ # In the future, this may be used to represent changelist specifications,
10
+ # but currently only models output of the GET /v1/changes command.
11
+ #
12
+ # See also:
13
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_changes.html
14
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_change.html
15
+ class Change
16
+ # If path information exists, this is a depot path specifier that
17
+ # indicates what files this changelist affects. (This is not documented.)
18
+ attr_accessor :path
19
+
20
+ # A string ID of the change
21
+ attr_accessor :change
22
+
23
+ # DateTime indicating when the change was created
24
+ attr_accessor :date
25
+
26
+ # String client ID the changelist is associated with
27
+ attr_accessor :client
28
+
29
+ # Perforce login of the person who owns this changelist (a string)
30
+ attr_accessor :user
31
+
32
+ # One of :pending, :shelved, :submitted, or :new. Probably :submitted
33
+ attr_accessor :status
34
+
35
+ # One of :restricted or :public
36
+ attr_accessor :type
37
+
38
+ # Textual string description of changelist. Must be set for changes
39
+ # who have their `status` set to :submitted
40
+ attr_accessor :description
41
+
42
+ # An array of job IDs fixed by this changelist
43
+ attr_accessor :jobs
44
+
45
+ # An array of file paths being submitted in this changelist
46
+ attr_accessor :files
47
+
48
+ def initialize(obj = {})
49
+ @path = obj['Path'] if obj.key?('Path')
50
+ @change = obj['Change'] if obj.key?('Change')
51
+ @date = Time.at(obj['Date']).to_datetime if obj.key?('Date')
52
+ @client = obj['Client'] if obj.key?('Client')
53
+ @user = obj['User'] if obj.key?('User')
54
+ @status = obj['Status'].to_sym if obj.key?('Status')
55
+ @type = obj['Type'].to_sym if obj.key?('Type')
56
+ @description = obj['Description'] if obj.key?('Description')
57
+ # Create copies of these arrays. It's unlikely they'll change but it's
58
+ # probably not a good idea to just maintain references to the parent
59
+ @jobs = obj['Jobs'].map(&:clone) if obj.key?('Jobs')
60
+ @files = obj['Files'].map(&:clone) if obj.key?('Files')
61
+
62
+ # If the user has defined symbols in the Ruby-ish API, then use that
63
+ # too, but we expect the data to be in the right format.
64
+ obj.each_key do |key|
65
+ accessor = "#{key}="
66
+ send(accessor, obj[key]) if self.respond_to?(accessor)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,129 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ require 'time'
4
+
5
+ module P4WebApiClient
6
+ module Models
7
+ # Models the client spec used to define client workspaces in the Perforce
8
+ # system.
9
+ #
10
+ # See also:
11
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_client.html
12
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_clients.html
13
+ class Client
14
+ # The client workspace name and primary ID
15
+ attr_accessor :client
16
+
17
+ # Perforce login of the user who owns the workspace
18
+ attr_accessor :owner
19
+
20
+ # DateTime when the workspace was last modified
21
+ attr_accessor :update
22
+
23
+ # DateTime when the workspace was last used
24
+ attr_accessor :access
25
+
26
+ # The name of the workstation this workspace resides. If set, client
27
+ # operations can *only* be run from this host.
28
+ attr_accessor :host
29
+
30
+ # Textual description of the workspace
31
+ attr_accessor :description
32
+
33
+ # Directory (on the local host) relative to which all files in the `view`
34
+ # are specified. If you change this setting, you must 'physically'
35
+ # relocate any files that currently reside there.
36
+ attr_accessor :root
37
+
38
+ # Up to two alternate cleint workspace roots
39
+ #
40
+ # This enables users to use the same Perforce client on multiple platforms
41
+ #
42
+ # See the command reference for more details:
43
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_client.html
44
+ attr_accessor :alt_roots
45
+
46
+ # A single string defining a set of switches the change behavior of
47
+ # different commands on the client.
48
+ #
49
+ # See the command reference for more details:
50
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_client.html
51
+ attr_accessor :options
52
+
53
+ # A single string that governs default behavior of p4 submit on this
54
+ # client.
55
+ #
56
+ # See the command reference for more details:
57
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_client.html
58
+ attr_accessor :submit_options
59
+
60
+ # Configure CR/LF conversion
61
+ #
62
+ # See the command reference for more details:
63
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_client.html
64
+ attr_accessor :line_end
65
+
66
+ # Associates the workspace with the specified stream.
67
+ attr_accessor :stream
68
+
69
+ # A changelist number that sets a back-in-time view of a stream.
70
+ attr_accessor :stream_at_change
71
+
72
+ # If set, restricts the usage of the workspace to the named server.
73
+ attr_accessor :server_id
74
+
75
+ # Array of strings that specifies the mappings between files in the depot
76
+ # and files in the workspace.
77
+ attr_accessor :view
78
+
79
+ # Restricts access to depot paths to a particular point in time.
80
+ attr_accessor :change_view
81
+
82
+ def initialize(obj = {})
83
+ @client = obj['Client'] if obj.key?('Client')
84
+ @owner = obj['Owner'] if obj.key?('Owner')
85
+ @access = Time.at(obj['Access']).to_datetime if obj.key?('Access')
86
+ @update = Time.at(obj['Update']).to_datetime if obj.key?('Update')
87
+ @host = obj['Host'] if obj.key?('Host')
88
+ @description = obj['Description'] if obj.key?('Description')
89
+ @root = obj['Root'] if obj.key?('Root')
90
+ @alt_roots = obj['AltRoots'].map(&:clone) if obj.key?('AltRoots')
91
+ @options = obj['Options'] if obj.key?('Options')
92
+ @submit_options = obj['SubmitOptions'] if obj.key?('SubmitOptions')
93
+ @line_end = obj['LineEnd'] if obj.key?('LineEnd')
94
+ @stream = obj['Stream'] if obj.key?('Stream')
95
+ @stream_at_change = obj['StreamAtChange'] if obj.key?('StreamAtChange')
96
+ @server_id = obj['ServerID'] if obj.key?('ServerID')
97
+ @view = obj['View'].map(&:clone) if obj.key?('View')
98
+ @change_view = obj['ChangeView'].map(&:clone) if obj.key?('ChangeView')
99
+
100
+ # If the user has defined symbols in the Ruby-ish API, then use that
101
+ # too, but we expect the data to be in the right format.
102
+ obj.each_key do |key|
103
+ accessor = "#{key}="
104
+ send(accessor, obj[key]) if self.respond_to?(accessor)
105
+ end
106
+ end
107
+
108
+ def to_internal_hash
109
+ hash = {
110
+ Client: @client
111
+ }
112
+ hash[:Owner] = @owner if @owner
113
+ hash[:Host] = @host if @host
114
+ hash[:Description] = @description if @description
115
+ hash[:Root] = @root if @root
116
+ hash[:AltRoots] = @alt_roots if @alt_roots
117
+ hash[:Options] = @options if @options
118
+ hash[:SubmitOptions] = @submit_options if @submit_options
119
+ hash[:LineEnd] = @line_end if @line_end
120
+ hash[:Stream] = @stream if @stream
121
+ hash[:StreamAtChange] = @stream_at_change if @stream_at_change
122
+ hash[:ServerID] = @server_id if @server_id
123
+ hash[:View] = @view if @view
124
+ hash[:ChangeView] = @change_view if @change_view
125
+ hash
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ module P4WebApiClient
4
+ module Models
5
+ # Model that can be obtained via file browsing (the files command with no
6
+ # arguments) *or* via the list_depots command.
7
+ #
8
+ # This implements a few methods to assist in file browsing, since our
9
+ # underlying data is actually quite inconsistent. These methods are shared
10
+ # between Dir, and File:
11
+ #
12
+ # * name - The name without any parent specifier
13
+ # * depot_path - The typical '//depot/dir1/file' style path specifier
14
+ # * browsable? - Can you list children of this path?
15
+ #
16
+ # For more details on the output fields, see
17
+ # http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_depot.html
18
+ class Depot
19
+ # The depot name
20
+ attr_accessor :depot
21
+
22
+ # DateTime associated with the depot
23
+ attr_accessor :date
24
+
25
+ # :local, :remote, :spec, :stream, :unload, or :archive
26
+ attr_accessor :type
27
+
28
+ # If type is :remote, this is likely the P4PORT address of the remote
29
+ # server. May not be set in all cases.
30
+ attr_accessor :address
31
+
32
+ # If type is :local, :spec, or :archive, this points to the relative
33
+ # location of the depot subdirectory. See command reference for more
34
+ # details
35
+ attr_accessor :map
36
+
37
+ # Short description of the depot's purpose. Optional
38
+ attr_accessor :description
39
+
40
+ # The user who owns the depot.
41
+ attr_accessor :owner
42
+
43
+ # If type is :spec, this holds an optional suffix for generated paths
44
+ # to objects in the spec depot. See command reference for more details.
45
+ attr_accessor :suffix
46
+
47
+ # When type is :spec, an optional description of what specs should be
48
+ # saved. See command reference for more details.
49
+ attr_accessor :spec_map
50
+
51
+ def initialize(obj = {})
52
+ @depot = obj['Depot'] if obj.key?('Depot')
53
+ @date = Time.at(obj['Date']).to_datetime if obj.key?('Date')
54
+ @type = obj['Type'].to_sym if obj.key?('Type')
55
+ @address = obj['Address'] if obj.key?('Address')
56
+ @map = obj['Map'] if obj.key?('Map')
57
+ @description = obj['Description'] if obj.key?('Description')
58
+ @owner = obj['Owner'] if obj.key?('Owner')
59
+ @suffix = obj['Suffix'] if obj.key?('Suffix')
60
+ @spec_map = obj['SpecMap'] if obj.key?('SpecMap')
61
+
62
+ # If the user has defined symbols in the Ruby-ish API, then use that
63
+ # too, but we expect the data to be in the right format.
64
+ obj.each_key do |key|
65
+ accessor = "#{key}="
66
+ send(accessor, obj[key]) if self.respond_to?(accessor)
67
+ end
68
+ end
69
+
70
+ def name
71
+ depot
72
+ end
73
+
74
+ def depot_path
75
+ "//#{depot}"
76
+ end
77
+
78
+ # You should always be able to list files and dirs of a depot (I think),
79
+ # you just might not get any results.
80
+ def browsable?
81
+ true
82
+ end
83
+
84
+ def to_internal_hash
85
+ hash = {
86
+ Depot: @depot
87
+ }
88
+ hash[:Type] = @type if @type
89
+ hash[:Address] = @address if @address
90
+ hash[:Map] = @map if @map
91
+ hash[:Description] = @description if @description
92
+ hash[:Owner] = @owner if @owner
93
+ hash
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ module P4WebApiClient
4
+ module Models
5
+ # Model that can be obtained during file browsing - represents directories
6
+ # in the system.
7
+ #
8
+ # This implements a few methods to assist in file browsing, since our
9
+ # underlying data is actually quite inconsistent. These methods are shared
10
+ # between Depot, Dir, and File:
11
+ #
12
+ # * name - The name without any parent specifier
13
+ # * depot_path - The typical '//depot/dir1/file' style path specifier
14
+ # * browsable? - Can you list children of this path?
15
+ #
16
+ # For more information, also see http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_dirs.html
17
+ class Dir
18
+ # The depot path to this particular directory
19
+ attr_accessor :dir
20
+
21
+ def initialize(obj = {})
22
+ @dir = obj['Dir'] if obj.key?('Dir')
23
+
24
+ # If the user has defined symbols in the Ruby-ish API, then use that
25
+ # too, but we expect the data to be in the right format.
26
+ obj.each_key do |key|
27
+ accessor = "#{key}="
28
+ send(accessor, obj[key]) if self.respond_to?(accessor)
29
+ end
30
+ end
31
+
32
+ def name
33
+ dir.split('/').last
34
+ end
35
+
36
+ def depot_path
37
+ dir
38
+ end
39
+
40
+ def browsable?
41
+ true
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,70 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ module P4WebApiClient
4
+ module Models
5
+ # Model that can be obtained during file browsing - represents head
6
+ # revisions of active files in the system.
7
+ #
8
+ # This implements a few methods to assist in file browsing, since our
9
+ # underlying data is actually quite inconsistent. These methods are shared
10
+ # between Depot, Dir, and File:
11
+ #
12
+ # * name - The name without any parent specifier
13
+ # * depot_path - The typical '//depot/dir1/file' style path specifier
14
+ # * browsable? - Can you list children of this path?
15
+ #
16
+ # For more information, also see http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_files.html
17
+ class File
18
+ # The depot path of the file
19
+ attr_accessor :depot_file
20
+
21
+ # Revision number of the file
22
+ attr_accessor :revision
23
+
24
+ # Changelist id that created this file revision - should be a string
25
+ attr_accessor :change
26
+
27
+ # Action taken at the head, one of :add, :edit, :delete, :branch,
28
+ # :move_add, :move_delete, :integrate, :import, :purge, or :archive
29
+ attr_accessor :action
30
+
31
+ # File type - one of :text, :binary, :symlink, :apple, :resource,
32
+ # :unicode, :utf16
33
+ #
34
+ # See http://www.perforce.com/perforce/r14.2/manuals/cmdref/file.types.html
35
+ attr_accessor :type
36
+
37
+ # DateTime of when the file revision was created
38
+ attr_accessor :date
39
+
40
+ def initialize(obj = {})
41
+ @depot_file = obj['DepotFile'] if obj.key?('DepotFile')
42
+ @revision = obj['Revision'].to_i if obj.key?('Revision')
43
+ @change = obj['Change'] if obj.key?('Change')
44
+ @action = obj['Action'].gsub(/\//, '_').to_sym if obj.key?('Action')
45
+ @type = obj['Type'].to_sym if obj.key?('Type')
46
+ @date = Time.at(obj['Date']).to_datetime if obj.key?('Date')
47
+
48
+ # If the user has defined symbols in the Ruby-ish API, then use that
49
+ # too, but we expect the data to be in the right format.
50
+ obj.each_key do |key|
51
+ accessor = "#{key}="
52
+ send(accessor, obj[key]) if self.respond_to?(accessor)
53
+ end
54
+ end
55
+
56
+ # Synonym of depot_file, used for consistency between Depot, Dir, and File
57
+ def depot_path
58
+ depot_file
59
+ end
60
+
61
+ def browsable?
62
+ false
63
+ end
64
+
65
+ def name
66
+ depot_file.split('/').last
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,102 @@
1
+ # Copyright (c) 2014 Perforce Software, Inc. All rights reserved.
2
+
3
+ module P4WebApiClient
4
+ module Models
5
+ # Models the output of the group spec.
6
+ #
7
+ # See also:
8
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_group.html
9
+ # - http://www.perforce.com/perforce/r14.2/manuals/cmdref/p4_groups.html
10
+ class Group
11
+ # The name and primary ID of the group
12
+ attr_accessor :group
13
+
14
+ # The maximum number of results that members of this group can acccess
15
+ # from the service from a single command
16
+ attr_accessor :max_results
17
+
18
+ # The maximum number of rows that members of this group can scan from the
19
+ # service from a single command.
20
+ attr_accessor :max_scan_rows
21
+
22
+ # The maximum length of time (in milliseconds) that any one operation can
23
+ # lock any database table when scanning data.
24
+ attr_accessor :max_lock_time
25
+
26
+ # The duration (in sections) of the validity of a session ticket created
27
+ # by
28
+ attr_accessor :timeout
29
+
30
+ # The length of time (in seconds) for which passwords for users in this
31
+ # group remain valid. To disable password aging, use a value of unset.
32
+ attr_accessor :password_timeout
33
+
34
+ # An array of the Perforce usernames of the group members.
35
+ attr_accessor :users
36
+
37
+ # Array of names of other Perforce groups
38
+ attr_accessor :subgroups
39
+
40
+ # Array of names of other Perforce users, that are allowed to admin this
41
+ # group. This is independent of group membership. A group owner should
42
+ # also be a part of the users group if they are intended to take part
43
+ # in the group
44
+ attr_accessor :owners
45
+
46
+ def initialize(obj = {})
47
+ @group = obj['Group'] if obj.key?('Group')
48
+
49
+ @max_results = obj['MaxResults'].to_i if obj.key?('MaxResults') &&
50
+ obj['MaxResults'] != 'unset'
51
+ @max_results = nil if @max_results == 0
52
+
53
+ @max_scan_rows = obj['MaxScanRows'].to_i \
54
+ if obj.key?('MaxScanRows') && obj['MaxScanRows'] != 'unset'
55
+ @max_scan_rows = nil if @max_scan_rows == 0
56
+
57
+ @max_lock_time = obj['MaxLockTime'].to_i \
58
+ if obj.key?('MaxLockTime') && obj['MaxLockTime'] != 'unset'
59
+ @max_lock_time = nil if @max_lock_time == 0
60
+
61
+ @timeout = obj['Timeout'].to_i \
62
+ if obj.key?('Timeout') && obj['Timeout'] != 'unset'
63
+ @timeout = nil if @timeout == 0
64
+
65
+ @password_timeout = obj['PasswordTimeout'].to_i \
66
+ if obj.key?('PasswordTimeout') && obj['PasswordTimeout'] != 'unset'
67
+ @password_timeout = nil if @password_timeout == 0
68
+
69
+ @users = obj['Users'].map(&:clone) if obj.key?('Users')
70
+ @users = [] unless @users
71
+ @subgroups = obj['Subgroups'].map(&:clone) if obj.key?('Subgroups')
72
+ @subgroups = [] unless @subgroups
73
+ @owners = obj['Owners'].map(&:clone) if obj.key?('Owners')
74
+ @owners = [] unless @owners
75
+
76
+ # If the user has defined symbols in the Ruby-ish API, then use that
77
+ # too, but we expect the data to be in the right format.
78
+ obj.each_key do |key|
79
+ accessor = "#{key}="
80
+ send(accessor, obj[key]) if self.respond_to?(accessor)
81
+ end
82
+ end
83
+
84
+ def to_internal_hash
85
+ hash = {
86
+ Group: @group
87
+ }
88
+
89
+ hash[:MaxResults] = @max_results.to_s if @max_results
90
+ hash[:MaxScanRows] = @max_scan_rows.to_s if @max_scan_rows
91
+ hash[:MaxLockTime] = @max_lock_time.to_s if @max_lock_time
92
+ hash[:Timeout] = @timeout if @timeout
93
+ hash[:PasswordTimeout] = @password_timeout if @password_timeout
94
+ hash[:Users] = @users if @users
95
+ hash[:Subgroups] = @subgroups if @subgroups
96
+ hash[:Owners] = @owners if @owners
97
+
98
+ hash
99
+ end
100
+ end
101
+ end
102
+ end