p4ruby 2014.2.0.pre2 → 2014.2.0.pre3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 011c5842e9bcd42542f606ee3fba8d6c8d3ac0ad
4
- data.tar.gz: 351a3104d4c3f001da3a324b3fc332f5eeda7330
3
+ metadata.gz: 7d54de1eb7bb72644ffa5f247b42efda01c22783
4
+ data.tar.gz: 73b7022b99ad6a17f3b2737be1a38396514429f1
5
5
  SHA512:
6
- metadata.gz: 8ec0465665f9c152d81ca55dbc49faf73ff1bd2f3435e6af4be77b1294174b944c7d8752784571a0eae833328e86b0a0c1b86f8a2b3b38b80b8e87835cae4961
7
- data.tar.gz: 185136ac0ee80f5ee1b4b07105c7b275a13ad7687e6c39241b41ab2c733ac3a6316a8136be91e75a0972899e0630ef46092be0872188ce63df4a9ea252ce7380
6
+ metadata.gz: 5bbd0db7fa7bbe379a63e8c6b9c3522e6227c8c8c8e3a98166e90a6edb8ac9129e7aa6c625f4eb6bcee777dd6d4a058467e9db59685e77e1bb3ca20ba0744dbc
7
+ data.tar.gz: 7481faabf71db4ec9bbc860cbbf8b1c2ee37af08b534b7baa33f0ec17dd133ca66b52a892f2adc58bd9318fe7592aba3f292272fd6ee044a1cb98ef9b5e76c22
data/ext/P4/p4.cpp CHANGED
@@ -297,6 +297,23 @@ static VALUE p4_set_env( VALUE self, VALUE var, VALUE val )
297
297
  Data_Get_Struct( self, P4ClientApi, p4 );
298
298
  return p4->SetEnv( StringValuePtr( var ), StringValuePtr( val ) );
299
299
  }
300
+
301
+ static VALUE p4_get_enviro_file( VALUE self )
302
+ {
303
+ P4ClientApi *p4;
304
+ Data_Get_Struct( self, P4ClientApi, p4 );
305
+ const StrPtr *enviro_file = p4->GetEnviroFile();
306
+ return P4Utils::ruby_string( enviro_file->Text() );
307
+ }
308
+
309
+ static VALUE p4_set_enviro_file( VALUE self, VALUE rbstr )
310
+ {
311
+ P4ClientApi *p4;
312
+ Data_Get_Struct( self, P4ClientApi, p4 );
313
+ p4->SetEnviroFile( StringValuePtr(rbstr) );
314
+ return Qtrue;
315
+ }
316
+
300
317
  static VALUE p4_get_host( VALUE self )
301
318
  {
302
319
  P4ClientApi *p4;
@@ -1192,6 +1209,8 @@ void Init_P4()
1192
1209
  rb_define_method( cP4, "client=", RUBY_METHOD_FUNC(p4_set_client) , 1 );
1193
1210
  rb_define_method( cP4, "env", RUBY_METHOD_FUNC(p4_get_env) , 1 );
1194
1211
  rb_define_method( cP4, "set_env", RUBY_METHOD_FUNC(p4_set_env) , 2 );
1212
+ rb_define_method( cP4, "enviro_file", RUBY_METHOD_FUNC(p4_get_enviro_file), 0);
1213
+ rb_define_method( cP4, "enviro_file=", RUBY_METHOD_FUNC(p4_set_enviro_file), 1);
1195
1214
  rb_define_method( cP4, "host", RUBY_METHOD_FUNC(p4_get_host) , 0 );
1196
1215
  rb_define_method( cP4, "host=", RUBY_METHOD_FUNC(p4_set_host) , 1 );
1197
1216
  rb_define_method( cP4, "ignore_file",RUBY_METHOD_FUNC(p4_get_ignore) , 0 );
@@ -119,7 +119,18 @@ P4ClientApi::GetEnv( const char *v)
119
119
  {
120
120
  return enviro->Get( v );
121
121
  }
122
-
122
+
123
+ void
124
+ P4ClientApi::SetEnviroFile( const char *c )
125
+ {
126
+ enviro->SetEnviroFile(c);
127
+ }
128
+
129
+ const StrPtr *
130
+ P4ClientApi::GetEnviroFile()
131
+ {
132
+ return enviro->GetEnviroFile();
133
+ }
123
134
 
124
135
  void
125
136
  P4ClientApi::SetApiLevel( int level )
data/ext/P4/p4clientapi.h CHANGED
@@ -69,6 +69,7 @@ public:
69
69
 
70
70
  void SetClient( const char *c ) { client.SetClient( c ); }
71
71
  void SetCwd( const char *c );
72
+ void SetEnviroFile( const char *c );
72
73
  void SetHost( const char *h ) { client.SetHost( h ); }
73
74
  void SetIgnoreFile( const char *f ) { client.SetIgnoreFile( f ); }
74
75
  void SetMaxResults( int v ) { maxResults = v; }
@@ -90,6 +91,7 @@ public:
90
91
  const StrPtr &GetConfig() { return client.GetConfig(); }
91
92
  const StrPtr &GetCwd() { return client.GetCwd(); }
92
93
  const char * GetEnv( const char *v);
94
+ const StrPtr *GetEnviroFile();
93
95
  const StrPtr &GetHost() { return client.GetHost(); }
94
96
  const StrPtr &GetIgnoreFile() { return client.GetIgnoreFile();}
95
97
  const StrPtr &GetLanguage() { return client.GetLanguage(); }
data/ext/P4/specmgr.cpp CHANGED
@@ -26,12 +26,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
26
  *******************************************************************************/
27
27
 
28
28
  /*******************************************************************************
29
- * Name : specmgr.cc
29
+ * Name : specmgr.cc
30
30
  *
31
- * Description : Ruby bindings for the Perforce API. Class for handling
32
- * Perforce specs. This class provides other classes with
33
- * generic support for parsing and formatting Perforce
34
- * specs.
31
+ * Description : Ruby bindings for the Perforce API. Class for handling
32
+ * Perforce specs. This class provides other classes with
33
+ * generic support for parsing and formatting Perforce
34
+ * specs.
35
35
  *
36
36
  ******************************************************************************/
37
37
  #include <ctype.h>
@@ -52,179 +52,262 @@ struct defaultspec {
52
52
  const char *type;
53
53
  const char *spec;
54
54
  } speclist[] = {
55
-
56
55
  {
57
- "branch",
58
- "Branch;code:301;rq;ro;fmt:L;len:32;;"
59
- "Update;code:302;type:date;ro;fmt:L;len:20;;"
60
- "Access;code:303;type:date;ro;fmt:L;len:20;;"
61
- "Owner;code:304;fmt:R;len:32;;"
62
- "Description;code:306;type:text;len:128;;"
63
- "Options;code:309;type:line;len:32;val:"
64
- "unlocked/locked;;"
65
- "View;code:311;type:wlist;words:2;len:64;;"
56
+ "branch",
57
+ "Branch;code:301;rq;ro;fmt:L;len:32;;"
58
+ "Update;code:302;type:date;ro;fmt:L;len:20;;"
59
+ "Access;code:303;type:date;ro;fmt:L;len:20;;"
60
+ "Owner;code:304;fmt:R;len:32;;"
61
+ "Description;code:306;type:text;len:128;;"
62
+ "Options;code:309;type:line;len:32;val:"
63
+ "unlocked/locked;;"
64
+ "View;code:311;type:wlist;words:2;len:64;;"
65
+ },
66
+ {
67
+ "changeX",
68
+ "Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
69
+ "Date;code:202;type:date;ro;fmt:R;seq:3;len:20;;"
70
+ "Client;code:203;ro;fmt:L;seq:2;len:32;;"
71
+ "User;code:204;ro;fmt:L;seq:4;len:32;;"
72
+ "Status;code:205;ro;fmt:R;seq:5;len:10;;"
73
+ "Type;code:211;seq:6;type:select;fmt:L;len:10;"
74
+ "val:public/restricted;;"
75
+ "Description;code:206;type:text;rq;;"
76
+ "Jobs;code:209;type:wlist;words:2;len:32;;"
77
+ "Files;code:210;type:llist;len:64;;"
78
+ },
79
+ {
80
+ "change",
81
+ "Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
82
+ "Date;code:202;type:date;ro;fmt:R;seq:3;len:20;;"
83
+ "Client;code:203;ro;fmt:L;seq:2;len:32;;"
84
+ "User;code:204;ro;fmt:L;seq:4;len:32;;"
85
+ "Status;code:205;ro;fmt:R;seq:5;len:10;;"
86
+ "Type;code:211;seq:6;type:select;fmt:L;len:10;"
87
+ "val:public/restricted;;"
88
+ "Description;code:206;type:text;rq;seq:7;;"
89
+ "JobStatus;code:207;fmt:I;type:select;seq:9;;"
90
+ "Jobs;code:208;type:wlist;seq:8;len:32;;"
91
+ "Files;code:210;type:llist;len:64;;"
92
+ },
93
+ {
94
+ "client",
95
+ "Client;code:301;rq;ro;seq:1;len:32;;"
96
+ "Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
97
+ "Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
98
+ "Owner;code:304;seq:3;fmt:R;len:32;;"
99
+ "Host;code:305;seq:5;fmt:R;len:32;;"
100
+ "Description;code:306;type:text;len:128;;"
101
+ "Root;code:307;rq;type:line;len:64;;"
102
+ "AltRoots;code:308;type:llist;len:64;;"
103
+ "Options;code:309;type:line;len:64;val:"
104
+ "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
105
+ "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
106
+ "SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
107
+ "submitunchanged/submitunchanged+reopen/revertunchanged/"
108
+ "revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
109
+ "LineEnd;code:310;type:select;fmt:L;len:12;val:"
110
+ "local/unix/mac/win/share;;"
111
+ "Stream;code:314;type:line;len:64;;"
112
+ "StreamAtChange;code:316;type:line;len:64;;"
113
+ "ServerID;code:315;type:line;ro;len:64;;"
114
+ "View;code:311;type:wlist;words:2;len:64;;"
115
+ "ChangeView;code:317;type:llist;len:64;;"
116
+ },
117
+ {
118
+ "clientX",
119
+ "Client;code:301;rq;ro;seq:1;len:32;;"
120
+ "Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
121
+ "Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
122
+ "Owner;code:304;seq:3;fmt:R;len:32;;"
123
+ "Host;code:305;seq:5;fmt:R;len:32;;"
124
+ "Description;code:306;type:text;len:128;;"
125
+ "Root;code:307;rq;type:line;len:64;;"
126
+ "AltRoots;code:308;type:llist;len:64;;"
127
+ "Options;code:309;type:line;len:64;val:"
128
+ "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
129
+ "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
130
+ "SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
131
+ "submitunchanged/submitunchanged+reopen/revertunchanged/"
132
+ "revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
133
+ "LineEnd;code:310;type:select;fmt:L;len:12;val:"
134
+ "local/unix/mac/win/share;;"
135
+ "View;code:311;type:wlist;words:2;len:64;;"
136
+ },
137
+ {
138
+ "clientSpecing021",
139
+ "Client;code:301;rq;ro;len:32;;"
140
+ "Update;code:302;type:date;ro;len:20;;"
141
+ "Access;code:303;type:date;ro;len:20;;"
142
+ "Owner;code:304;len:32;;"
143
+ "Host;code:305;len:32;;"
144
+ "Description;code:306;type:text;len:128;;"
145
+ "Root;code:307;rq;type:line;len:64;;"
146
+ "AltRoots;code:308;type:text;len:64;;"
147
+ "Options;code:309;type:line;len:64;val:"
148
+ "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
149
+ "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
150
+ "LineEnd;code:310;type:select;len:12;val:local/unix/mac/win/share;;"
151
+ "View;code:311;type:wlist;words:2;len:64;;"
66
152
  },
67
153
  {
68
- "change",
69
- "Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
70
- "Date;code:202;type:date;ro;fmt:R;seq:3;len:20;;"
71
- "Client;code:203;ro;fmt:L;seq:2;len:32;;"
72
- "User;code:204;ro;fmt:L;seq:4;len:32;;"
73
- "Status;code:205;ro;fmt:R;seq:5;len:10;;"
74
- "Type;code:211;seq:6;type:select;fmt:L;len:10;"
75
- "val:public/restricted;;"
76
- "Description;code:206;type:text;rq;seq:7;;"
77
- "JobStatus;code:207;fmt:I;type:select;seq:9;;"
78
- "Jobs;code:208;type:wlist;seq:8;len:32;;"
79
- "Files;code:210;type:llist;len:64;;"
154
+ "depot",
155
+ "Depot;code:251;rq;ro;len:32;;"
156
+ "Owner;code:252;len:32;;"
157
+ "Date;code:253;type:date;ro;len:20;;"
158
+ "Description;code:254;type:text;len:128;;"
159
+ "Type;code:255;rq;len:10;;"
160
+ "Address;code:256;len:64;;"
161
+ "Suffix;code:258;len:64;;"
162
+ "Map;code:257;rq;len:64;;"
163
+ "SpecMap;code:259;type:wlist;len:64;;"
80
164
  },
81
165
  {
82
- "client",
83
- "Client;code:301;rq;ro;seq:1;len:32;;"
84
- "Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
85
- "Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
86
- "Owner;code:304;seq:3;fmt:R;len:32;;"
87
- "Host;code:305;seq:5;fmt:R;len:32;;"
88
- "Description;code:306;type:text;len:128;;"
89
- "Root;code:307;rq;type:line;len:64;;"
90
- "AltRoots;code:308;type:llist;len:64;;"
91
- "Options;code:309;type:line;len:64;val:"
92
- "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
93
- "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
94
- "SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
95
- "submitunchanged/submitunchanged+reopen/revertunchanged/"
96
- "revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
97
- "LineEnd;code:310;type:select;fmt:L;len:12;val:"
98
- "local/unix/mac/win/share;;"
99
- "Stream;code:314;type:line;len:64;;"
100
- "StreamAtChange;code:316;type:line;len:64;;"
101
- "ServerID;code:315;type:line;ro;len:64;;"
102
- "View;code:311;type:wlist;words:2;len:64;;"
103
- "ChangeView;code:317;type:llist;ro;len:64;;"
166
+ "group",
167
+ "Group;code:401;rq;ro;len:32;;"
168
+ "MaxResults;code:402;type:word;len:12;;"
169
+ "MaxScanRows;code:403;type:word;len:12;;"
170
+ "MaxLockTime;code:407;type:word;len:12;;"
171
+ "Timeout;code:406;type:word;len:12;;"
172
+ "PasswordTimeout;code:409;type:word;len:12;;"
173
+ "Subgroups;code:404;type:wlist;len:32;opt:default;;"
174
+ "Owners;code:408;type:wlist;len:32;opt:default;;"
175
+ "Users;code:405;type:wlist;len:32;opt:default;;"
104
176
  },
105
177
  {
106
- "depot",
107
- "Depot;code:251;rq;ro;len:32;;"
108
- "Owner;code:252;len:32;;"
109
- "Date;code:253;type:date;ro;len:20;;"
110
- "Description;code:254;type:text;len:128;;"
111
- "Type;code:255;rq;len:10;;"
112
- "Address;code:256;len:64;;"
113
- "Suffix;code:258;len:64;;"
114
- "Map;code:257;rq;len:64;;"
115
- "SpecMap;code:259;type:wlist;len:64;;"
178
+ "job",
179
+ "Job;code:101;rq;len:32;;"
180
+ "Status;code:102;type:select;rq;len:10;"
181
+ "pre:open;val:open/suspended/closed;;"
182
+ "User;code:103;rq;len:32;pre:$user;;"
183
+ "Date;code:104;type:date;ro;len:20;pre:$now;;"
184
+ "Description;code:105;type:text;rq;pre:$blank;;"
116
185
  },
117
186
  {
118
- "group",
119
- "Group;code:401;rq;ro;len:32;;"
120
- "MaxResults;code:402;type:word;len:12;;"
121
- "MaxScanRows;code:403;type:word;len:12;;"
122
- "MaxLockTime;code:407;type:word;len:12;;"
123
- "Timeout;code:406;type:word;len:12;;"
124
- "PasswordTimeout;code:409;type:word;len:12;;"
125
- "Subgroups;code:404;type:wlist;len:32;opt:default;;"
126
- "Owners;code:408;type:wlist;len:32;opt:default;;"
127
- "Users;code:405;type:wlist;len:32;opt:default;;"
187
+ "label",
188
+ "Label;code:301;rq;ro;fmt:L;len:32;;"
189
+ "Update;code:302;type:date;ro;fmt:L;len:20;;"
190
+ "Access;code:303;type:date;ro;fmt:L;len:20;;"
191
+ "Owner;code:304;fmt:R;len:32;;"
192
+ "Description;code:306;type:text;len:128;;"
193
+ "Options;code:309;type:line;len:64;val:"
194
+ "unlocked/locked,noautoreload/autoreload;;"
195
+ "Revision;code:312;type:word;words:1;len:64;;"
196
+ "ServerID;code:315;type:line;ro;len:64;;"
197
+ "View;code:311;type:wlist;len:64;;"
128
198
  },
129
199
  {
130
- "job",
131
- "Job;code:101;rq;len:32;;"
132
- "Status;code:102;type:select;rq;len:10;"
133
- "pre:open;val:open/suspended/closed;;"
134
- "User;code:103;rq;len:32;pre:$user;;"
135
- "Date;code:104;type:date;ro;len:20;pre:$now;;"
136
- "Description;code:105;type:text;rq;pre:$blank;;"
200
+ "ldap",
201
+ "Name;code:801;rq;len:32;;"
202
+ "Host;code:802;rq;type:word;words:1;len:128;;"
203
+ "Port;code:803;rq;type:word;words:1;len:5;;"
204
+ "Encryption;code:804;rq;len:10;val:"
205
+ "none/ssl/tls;;"
206
+ "BindMethod;code:805;rq;len:10;val:"
207
+ "simple/search/sasl;;"
208
+ "SimplePattern;code:806;type:line;len:128;;"
209
+ "SearchBaseDN;code:807;type:line;len:128;;"
210
+ "SearchFilter;code:808;type:line;len:128;;"
211
+ "SearchScope;code:809;len:10;val:"
212
+ "baseonly/children/subtree;;"
213
+ "SearchBindDN;code:810;type:line;len:128;;"
214
+ "SearchPasswd;code:811;type:line;len:128;;"
215
+ "SaslRealm;code:812;type:word;words:1;len:128;;"
216
+ "GroupBaseDN;code:813;type:line;len:128;;"
217
+ "GroupSearchFilter;code:814;type:line;len:128;;"
218
+ "GroupSearchScope;code:815;len:10;val:"
219
+ "baseonly/children/subtree;;"
137
220
  },
138
221
  {
139
- "label",
140
- "Label;code:301;rq;ro;fmt:L;len:32;;"
141
- "Update;code:302;type:date;ro;fmt:L;len:20;;"
142
- "Access;code:303;type:date;ro;fmt:L;len:20;;"
143
- "Owner;code:304;fmt:R;len:32;;"
144
- "Description;code:306;type:text;len:128;;"
145
- "Options;code:309;type:line;len:64;val:"
146
- "unlocked/locked,noautoreload/autoreload;;"
147
- "Revision;code:312;type:word;words:1;len:64;;"
148
- "ServerID;code:315;type:line;ro;len:64;;"
149
- "View;code:311;type:wlist;len:64;;"
222
+ "license",
223
+ "License;code:451;len:32;;"
224
+ "License-Expires;code:452;len:10;;"
225
+ "Support-Expires;code:453;len:10;;"
226
+ "Customer;code:454;type:line;len:128;;"
227
+ "Application;code:455;len:32;;"
228
+ "IPaddress;code:456;len:24;;"
229
+ "IPservice;code:461;type:wlist;len:24;;"
230
+ "Platform;code:457;len:32;;"
231
+ "Clients;code:458;len:8;;"
232
+ "Users;code:459;len:8;;"
233
+ "Files;code:460;len:8;;"
150
234
  },
151
235
  {
152
- "license",
153
- "License;code:451;len:32;;"
154
- "License-Expires;code:452;len:10;;"
155
- "Support-Expires;code:453;len:10;;"
156
- "Customer;code:454;type:line;len:128;;"
157
- "Application;code:455;len:32;;"
158
- "IPaddress;code:456;len:24;;"
159
- "IPservice;code:461;type:wlist;len:24;;"
160
- "Platform;code:457;len:32;;"
161
- "Clients;code:458;len:8;;"
162
- "Users;code:459;len:8;;"
163
- "Files;code:460;len:8;;"
236
+ "protect",
237
+ "Protections;code:501;type:wlist;words:5;opt:default;len:64;;"
164
238
  },
165
239
  {
166
- "protect",
167
- "Protections;code:501;type:wlist;words:5;opt:default;len:64;;"
240
+ "specW",
241
+ "Fields;code:351;type:wlist;words:5;rq;;"
242
+ "Required;code:357;type:wlist;;"
243
+ "Readonly;code:358;type:wlist;;"
244
+ "Words;code:352;type:wlist;words:2;;"
245
+ "Formats;code:353;type:wlist;words:3;;"
246
+ "Values;code:354;type:wlist;words:2;;"
247
+ "Presets;code:355;type:wlist;words:2;;"
248
+ "Comments;code:356;type:text;;"
168
249
  },
169
250
  {
170
- "spec",
171
- "Fields;code:351;type:wlist;words:5;rq;;"
172
- "Words;code:352;type:wlist;words:2;;"
173
- "Formats;code:353;type:wlist;words:3;;"
174
- "Values;code:354;type:wlist;words:2;;"
175
- "Presets;code:355;type:wlist;words:2;;"
176
- "Comments;code:356;type:text;;"
251
+ "spec",
252
+ "Fields;code:351;type:wlist;words:5;rq;;"
253
+ "Words;code:352;type:wlist;words:2;;"
254
+ "Formats;code:353;type:wlist;words:3;;"
255
+ "Values;code:354;type:wlist;words:2;;"
256
+ "Presets;code:355;type:wlist;words:2;;"
257
+ "Comments;code:356;type:text;;"
177
258
  },
178
259
  {
179
- "stream",
180
- "Stream;code:701;rq;ro;len:64;;"
181
- "Update;code:705;type:date;ro;fmt:L;len:20;;"
182
- "Access;code:706;type:date;ro;fmt:L;len:20;;"
183
- "Owner;code:704;len:32;;"
184
- "Name;code:703;rq;type:line;len:32;;"
185
- "Parent;code:702;rq;len:64;;"
186
- "Type;code:708;rq;len:32;;"
187
- "Description;code:709;type:text;len:128;;"
188
- "Options;code:707;type:line;len:64;val:"
189
- "allsubmit/ownersubmit,unlocked/locked,"
190
- "toparent/notoparent,fromparent/nofromparent;;"
191
- "Paths;code:710;rq;type:wlist;words:2;maxwords:3;len:64;;"
192
- "Remapped;code:711;type:wlist;words:2;len:64;;"
193
- "Ignored;code:712;type:wlist;words:1;len:64;;"
194
- "View;code:713;type:wlist;words:2;len:64;;"
195
- "ChangeView;code:714;type:llist;ro;len:64;;"
260
+ "stream",
261
+ "Stream;code:701;rq;ro;len:64;;"
262
+ "Update;code:705;type:date;ro;fmt:L;len:20;;"
263
+ "Access;code:706;type:date;ro;fmt:L;len:20;;"
264
+ "Owner;code:704;len:32;;"
265
+ "Name;code:703;rq;type:line;len:32;;"
266
+ "Parent;code:702;rq;len:64;;"
267
+ "Type;code:708;rq;len:32;;"
268
+ "Description;code:709;type:text;len:128;;"
269
+ "Options;code:707;type:line;len:64;val:"
270
+ "allsubmit/ownersubmit,unlocked/locked,"
271
+ "toparent/notoparent,fromparent/nofromparent;;"
272
+ "Paths;code:710;rq;type:wlist;words:2;maxwords:3;len:64;;"
273
+ "Remapped;code:711;type:wlist;words:2;len:64;;"
274
+ "Ignored;code:712;type:wlist;words:1;len:64;;"
275
+ "View;code:713;type:wlist;words:2;len:64;;"
276
+ "ChangeView;code:714;type:llist;ro;len:64;;"
196
277
  },
197
278
  {
198
- "triggers",
199
- "Triggers;code:551;type:wlist;words:4;len:64;opt:default;"
279
+ "triggers",
280
+ "Triggers;code:551;type:wlist;words:4;len:64;opt:default;"
200
281
  },
201
282
  {
202
- "typemap",
203
- "TypeMap;code:601;type:wlist;words:2;len:64;opt:default;"
283
+ "typemap",
284
+ "TypeMap;code:601;type:wlist;words:2;len:64;opt:default;"
204
285
  },
205
286
  {
206
- "user",
207
- "User;code:651;rq;ro;seq:1;len:32;;"
208
- "Type;code:659;ro;fmt:R;len:10;;"
209
- "Email;code:652;fmt:R;rq;seq:3;len:32;;"
210
- "Update;code:653;fmt:L;type:date;ro;seq:2;len:20;;"
211
- "Access;code:654;fmt:L;type:date;ro;len:20;;"
212
- "FullName;code:655;fmt:R;type:line;rq;len:32;;"
213
- "JobView;code:656;type:line;len:64;;"
214
- "Password;code:657;len:32;;"
215
- "Reviews;code:658;type:wlist;len:64;;"
287
+ "user",
288
+ "User;code:651;rq;ro;seq:1;len:32;;"
289
+ "Type;code:659;ro;fmt:R;len:10;;"
290
+ "Email;code:652;fmt:R;rq;seq:3;len:32;;"
291
+ "Update;code:653;fmt:L;type:date;ro;seq:2;len:20;;"
292
+ "Access;code:654;fmt:L;type:date;ro;len:20;;"
293
+ "FullName;code:655;fmt:R;type:line;rq;len:32;;"
294
+ "JobView;code:656;type:line;len:64;;"
295
+ "Password;code:657;len:32;;"
296
+ "AuthMethod;code:662;fmt:L;len:10;val:perforce/ldap;;"
297
+ "Reviews;code:658;type:wlist;len:64;;"
216
298
  },
217
299
  {
218
- "server",
219
- "ServerID;code:751;rq;ro;len:32;;"
220
- "Type;code:752;rq;len:32;;"
221
- "Name;code:753;type:line;len:32;;"
222
- "Address;code:754;type:line;len:32;;"
223
- "Services;code:755;rq;len:128;;"
224
- "Description;code:756;type:text;len:128;;"
225
- "ClientDataFilter;code:757;type:wlist;len:64;;"
226
- "RevisionDataFilter;code:758;type:wlist;len:64;;"
227
- "ArchiveDataFilter;code:759;type:wlist;len:64;;"
300
+ "server",
301
+ "ServerID;code:751;rq;ro;len:32;;"
302
+ "Type;code:752;rq;len:32;;"
303
+ "Name;code:753;type:line;len:32;;"
304
+ "Address;code:754;type:line;len:32;;"
305
+ "Services;code:755;rq;len:128;;"
306
+ "Description;code:756;type:text;len:128;;"
307
+ "User;code:760;type:line;len:64;;"
308
+ "ClientDataFilter;code:757;type:wlist;len:64;;"
309
+ "RevisionDataFilter;code:758;type:wlist;len:64;;"
310
+ "ArchiveDataFilter;code:759;type:wlist;len:64;;"
228
311
  },
229
312
  { 0, 0 }
230
313
  };
@@ -245,7 +328,7 @@ void
245
328
  SpecMgr::AddSpecDef( const char *type, StrPtr &specDef )
246
329
  {
247
330
  if( specs->GetVar( type ) )
248
- specs->RemoveVar( type );
331
+ specs->RemoveVar( type );
249
332
  specs->SetVar( type, specDef );
250
333
  }
251
334
 
@@ -253,7 +336,7 @@ void
253
336
  SpecMgr::AddSpecDef( const char *type, const char *specDef )
254
337
  {
255
338
  if( specs->GetVar( type ) )
256
- specs->RemoveVar( type );
339
+ specs->RemoveVar( type );
257
340
  specs->SetVar( type, specDef );
258
341
  }
259
342
 
@@ -265,7 +348,7 @@ SpecMgr::Reset()
265
348
  specs = new StrBufDict;
266
349
 
267
350
  for( struct defaultspec *sp = &speclist[ 0 ]; sp->type; sp++ )
268
- AddSpecDef( sp->type, sp->spec );
351
+ AddSpecDef( sp->type, sp->spec );
269
352
 
270
353
  }
271
354
 
@@ -276,25 +359,25 @@ SpecMgr::HaveSpecDef( const char *type )
276
359
  }
277
360
 
278
361
  //
279
- // Convert a Perforce StrDict into a Ruby hash. Convert multi-level
280
- // data (Files0, Files1 etc. ) into (nested) array members of the hash.
362
+ // Convert a Perforce StrDict into a Ruby hash. Convert multi-level
363
+ // data (Files0, Files1 etc. ) into (nested) array members of the hash.
281
364
  //
282
365
 
283
366
  VALUE
284
367
  SpecMgr::StrDictToHash( StrDict *dict, VALUE hash )
285
368
  {
286
- StrRef var, val;
287
- int i;
369
+ StrRef var, val;
370
+ int i;
288
371
 
289
372
  if( hash == Qnil )
290
- hash = rb_hash_new();
373
+ hash = rb_hash_new();
291
374
 
292
375
  for ( i = 0; dict->GetVar( i, var, val ); i++ )
293
376
  {
294
- if ( var == "specdef" || var == "func" || var == "specFormatted" )
295
- continue;
377
+ if ( var == "specdef" || var == "func" || var == "specFormatted" )
378
+ continue;
296
379
 
297
- InsertItem( hash, &var, &val );
380
+ InsertItem( hash, &var, &val );
298
381
  }
299
382
  return hash;
300
383
  }
@@ -307,17 +390,17 @@ VALUE
307
390
  SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
308
391
  {
309
392
 
310
- // This converts it to a string, and then to a hash, so we go from one
393
+ // This converts it to a string, and then to a hash, so we go from one
311
394
  // type of dictionary to another, via an intermediate form (a StrBuf).
312
395
 
313
- Error e;
314
- SpecDataTable dictData( dict );
396
+ Error e;
397
+ SpecDataTable dictData( dict );
315
398
  #if P4APIVER_ID >= 513538
316
- Spec s( specDef->Text(), "", &e );
399
+ Spec s( specDef->Text(), "", &e );
317
400
  #else
318
- Spec s( specDef->Text(), "" );
401
+ Spec s( specDef->Text(), "" );
319
402
  #endif
320
- StrBuf form;
403
+ StrBuf form;
321
404
 
322
405
  if( e.Test() ) return Qfalse;
323
406
 
@@ -325,12 +408,12 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
325
408
  s.Format( &dictData, &form );
326
409
 
327
410
  // Now parse the StrBuf into a new P4::Spec object
328
- VALUE spec = NewSpec( specDef );
329
- SpecDataRuby hashData( spec );
411
+ VALUE spec = NewSpec( specDef );
412
+ SpecDataRuby hashData( spec );
330
413
 
331
414
  s.ParseNoValid( form.Text(), &hashData, &e );
332
415
  if( e.Test() ) return Qfalse;
333
-
416
+
334
417
  // Now see if there are any extraTag fields as we'll need to
335
418
  // add those fields into our output. Just iterate over them
336
419
  // extracting the fields and inserting them as we go.
@@ -339,16 +422,16 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
339
422
  for( i = 0; ; i++ )
340
423
  {
341
424
  StrBuf tag;
342
- StrPtr *var;
343
- StrPtr *val;
425
+ StrPtr *var;
426
+ StrPtr *val;
344
427
 
345
428
  tag << et << i;
346
- if( !(var = dict->GetVar( tag ) ) )
429
+ if( !(var = dict->GetVar( tag ) ) )
347
430
  break;
348
431
 
349
- val = dict->GetVar( *var );
350
- if( !val ) continue;
351
-
432
+ val = dict->GetVar( *var );
433
+ if( !val ) continue;
434
+
352
435
  InsertItem( spec, var, val );
353
436
  }
354
437
 
@@ -358,48 +441,48 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
358
441
  VALUE
359
442
  SpecMgr::StringToSpec( const char *type, const char *form, Error *e )
360
443
  {
361
-
362
- StrPtr * specDef = specs->GetVar( type );
363
- VALUE hash = NewSpec( specDef );
364
- SpecDataRuby specData( hash );
444
+
445
+ StrPtr * specDef = specs->GetVar( type );
446
+ VALUE hash = NewSpec( specDef );
447
+ SpecDataRuby specData( hash );
365
448
  #if P4APIVER_ID >= 513538
366
- Spec s( specDef->Text(), "", e );
449
+ Spec s( specDef->Text(), "", e );
367
450
  #else
368
- Spec s( specDef->Text(), "" );
451
+ Spec s( specDef->Text(), "" );
369
452
  #endif
370
453
 
371
- if( !e->Test() )
372
- s.ParseNoValid( form, &specData, e );
454
+ if( !e->Test() )
455
+ s.ParseNoValid( form, &specData, e );
373
456
 
374
457
  if ( e->Test() )
375
- return Qfalse;
458
+ return Qfalse;
376
459
 
377
460
  return hash;
378
461
  }
379
462
 
380
463
 
381
464
  //
382
- // Format routine. updates a StrBuf object with the form content.
465
+ // Format routine. updates a StrBuf object with the form content.
383
466
  // The StrBuf can then be converted to a Ruby string where required.
384
467
  //
385
468
  void
386
469
  SpecMgr::SpecToString( const char *type, VALUE hash, StrBuf &b, Error *e )
387
470
  {
388
471
 
389
- StrBuf buf;
390
- StrPtr * specDef = specs->GetVar( type );
472
+ StrBuf buf;
473
+ StrPtr * specDef = specs->GetVar( type );
391
474
  if ( !specDef )
392
475
  {
393
- e->Set( E_FAILED, "No specdef available. Cannot convert hash to a "
394
- "Perforce form" );
395
- return;
476
+ e->Set( E_FAILED, "No specdef available. Cannot convert hash to a "
477
+ "Perforce form" );
478
+ return;
396
479
  }
397
480
 
398
- SpecDataRuby specData( hash );
481
+ SpecDataRuby specData( hash );
399
482
  #if P4APIVER_ID >= 513538
400
- Spec s( specDef->Text(), "", e );
483
+ Spec s( specDef->Text(), "", e );
401
484
  #else
402
- Spec s( specDef->Text(), "" );
485
+ Spec s( specDef->Text(), "" );
403
486
  #endif
404
487
 
405
488
  if( e->Test() ) return;
@@ -431,29 +514,29 @@ SpecMgr::SpecFields( StrPtr *specDef )
431
514
  // see that changing anytime soon, and it makes this so simple and
432
515
  // reliable. So...
433
516
  //
434
- VALUE hash = rb_hash_new();
435
- Error e;
517
+ VALUE hash = rb_hash_new();
518
+ Error e;
436
519
 
437
520
  #if P4APIVER_ID >= 513538
438
- Spec s( specDef->Text(), "", &e );
521
+ Spec s( specDef->Text(), "", &e );
439
522
  #else
440
- Spec s( specDef->Text(), "" );
523
+ Spec s( specDef->Text(), "" );
441
524
  #endif
442
525
  if( e.Test() ) return Qnil;
443
526
 
444
527
  for( int i = 0; i < s.Count(); i++ )
445
528
  {
446
- StrBuf k;
447
- StrBuf v;
448
- SpecElem * se = s.Get( i );
529
+ StrBuf k;
530
+ StrBuf v;
531
+ SpecElem * se = s.Get( i );
449
532
 
450
- v = se->tag;
451
- k = v;
452
- StrOps::Lower( k );
533
+ v = se->tag;
534
+ k = v;
535
+ StrOps::Lower( k );
453
536
 
454
- rb_hash_aset(hash,
455
- P4Utils::ruby_string( k.Text(), k.Length() ),
456
- P4Utils::ruby_string( v.Text(), v.Length() ) );
537
+ rb_hash_aset(hash,
538
+ P4Utils::ruby_string( k.Text(), k.Length() ),
539
+ P4Utils::ruby_string( v.Text(), v.Length() ) );
457
540
  }
458
541
  return hash;
459
542
  }
@@ -474,13 +557,13 @@ SpecMgr::SplitKey( const StrPtr *key, StrBuf &base, StrBuf &index )
474
557
  index = "";
475
558
  for ( i = key->Length(); i; i-- )
476
559
  {
477
- char prev = (*key)[ i-1 ];
478
- if ( !isdigit( prev ) && prev != ',' )
479
- {
480
- base.Set( key->Text(), i );
481
- index.Set( key->Text() + i );
482
- break;
483
- }
560
+ char prev = (*key)[ i-1 ];
561
+ if ( !isdigit( prev ) && prev != ',' )
562
+ {
563
+ base.Set( key->Text(), i );
564
+ index.Set( key->Text() + i );
565
+ break;
566
+ }
484
567
  }
485
568
  }
486
569
 
@@ -492,16 +575,16 @@ SpecMgr::SplitKey( const StrPtr *key, StrBuf &base, StrBuf &index )
492
575
  void
493
576
  SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
494
577
  {
495
- VALUE ary = 0;
496
- VALUE tary = 0;
497
- VALUE key;
498
- ID idLength = rb_intern( "length" );
499
- StrBuf base, index;
500
- StrRef comma( "," );
578
+ VALUE ary = 0;
579
+ VALUE tary = 0;
580
+ VALUE key;
581
+ ID idLength = rb_intern( "length" );
582
+ StrBuf base, index;
583
+ StrRef comma( "," );
501
584
 
502
585
  SplitKey( var, base, index );
503
586
 
504
- // If there's no index, then we insert into the top level hash
587
+ // If there's no index, then we insert into the top level hash
505
588
  // but if the key is already defined then we need to rename the key. This
506
589
  // is probably one of those special keys like otherOpen which can be
507
590
  // both an array element and a scalar. The scalar comes last, so we
@@ -509,18 +592,18 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
509
592
  // value
510
593
  if ( index == "" )
511
594
  {
512
- ID idHasKey = rb_intern( "has_key?");
513
- ID idPlus = rb_intern( "+" );
514
-
515
- key = P4Utils::ruby_string( var->Text() );
516
- if ( rb_funcall( hash, idHasKey, 1, key ) == Qtrue )
517
- key = rb_funcall( key, idPlus, 1, P4Utils::ruby_string( "s" ) );
518
-
519
- if( P4RDB_DATA )
520
- fprintf( stderr, "... %s -> %s\n", StringValuePtr( key ), val->Text() );
521
-
522
- rb_hash_aset( hash, key, P4Utils::ruby_string( val->Text() ) );
523
- return;
595
+ ID idHasKey = rb_intern( "has_key?");
596
+ ID idPlus = rb_intern( "+" );
597
+
598
+ key = P4Utils::ruby_string( var->Text() );
599
+ if ( rb_funcall( hash, idHasKey, 1, key ) == Qtrue )
600
+ key = rb_funcall( key, idPlus, 1, P4Utils::ruby_string( "s" ) );
601
+
602
+ if( P4RDB_DATA )
603
+ fprintf( stderr, "... %s -> %s\n", StringValuePtr( key ), val->Text() );
604
+
605
+ rb_hash_aset( hash, key, P4Utils::ruby_string( val->Text() ) );
606
+ return;
524
607
  }
525
608
 
526
609
  //
@@ -531,57 +614,57 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
531
614
 
532
615
  if ( Qnil == ary )
533
616
  {
534
- ary = rb_ary_new();
535
- rb_hash_aset( hash, key, ary );
617
+ ary = rb_ary_new();
618
+ rb_hash_aset( hash, key, ary );
536
619
  }
537
620
  else if( rb_obj_is_kind_of( ary, rb_cArray ) != Qtrue )
538
621
  {
539
- //
540
- // There's an index in our var name, but the name is already defined
541
- // and the value it contains is not an array. This means we've got a
542
- // name collision. This can happen in 'p4 diff2' for example, when
543
- // one file gets 'depotFile' and the other gets 'depotFile2'. In
544
- // these cases it makes sense to keep the structure flat so we
545
- // just use the raw variable name.
546
- //
547
- if( P4RDB_DATA )
548
- fprintf( stderr, "... %s -> %s\n", var->Text(), val->Text() );
549
-
550
- rb_hash_aset( hash, P4Utils::ruby_string( var->Text() ) ,
551
- P4Utils::ruby_string( val->Text() ) );
552
- return;
622
+ //
623
+ // There's an index in our var name, but the name is already defined
624
+ // and the value it contains is not an array. This means we've got a
625
+ // name collision. This can happen in 'p4 diff2' for example, when
626
+ // one file gets 'depotFile' and the other gets 'depotFile2'. In
627
+ // these cases it makes sense to keep the structure flat so we
628
+ // just use the raw variable name.
629
+ //
630
+ if( P4RDB_DATA )
631
+ fprintf( stderr, "... %s -> %s\n", var->Text(), val->Text() );
632
+
633
+ rb_hash_aset( hash, P4Utils::ruby_string( var->Text() ) ,
634
+ P4Utils::ruby_string( val->Text() ) );
635
+ return;
553
636
  }
554
637
 
555
638
  // The index may be a simple digit, or it could be a comma separated
556
639
  // list of digits. For each "level" in the index, we need a containing
557
640
  // array.
558
641
  if( P4RDB_DATA )
559
- fprintf( stderr, "... %s -> [", base.Text() );
642
+ fprintf( stderr, "... %s -> [", base.Text() );
560
643
 
561
644
  for( const char *c = 0 ; ( c = index.Contains( comma ) ); )
562
645
  {
563
- StrBuf level;
564
- level.Set( index.Text(), c - index.Text() );
565
- index.Set( c + 1 );
566
-
567
- // Found another level so we need to get/create a nested array
568
- // under the current entry. We use the level as an index so that
569
- // missing entries are left empty deliberately.
570
-
571
- tary = rb_ary_entry( ary, level.Atoi() );
572
- if ( ! RTEST( tary ) )
646
+ StrBuf level;
647
+ level.Set( index.Text(), c - index.Text() );
648
+ index.Set( c + 1 );
649
+
650
+ // Found another level so we need to get/create a nested array
651
+ // under the current entry. We use the level as an index so that
652
+ // missing entries are left empty deliberately.
653
+
654
+ tary = rb_ary_entry( ary, level.Atoi() );
655
+ if ( ! RTEST( tary ) )
573
656
  {
574
- tary = rb_ary_new();
575
- rb_ary_store( ary, level.Atoi(), tary );
576
- }
577
- if( P4RDB_DATA )
578
- fprintf( stderr, "%s][", level.Text() );
579
- ary = tary;
657
+ tary = rb_ary_new();
658
+ rb_ary_store( ary, level.Atoi(), tary );
659
+ }
660
+ if( P4RDB_DATA )
661
+ fprintf( stderr, "%s][", level.Text() );
662
+ ary = tary;
580
663
  }
581
664
  int pos = index.Atoi();
582
665
 
583
666
  if( P4RDB_DATA )
584
- fprintf( stderr, "%d] = %s\n", pos, val->Text() );
667
+ fprintf( stderr, "%d] = %s\n", pos, val->Text() );
585
668
 
586
669
  rb_ary_store( ary, pos, P4Utils::ruby_string( val->Text() ) );
587
670
  }
@@ -593,12 +676,12 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
593
676
  VALUE
594
677
  SpecMgr::NewSpec( StrPtr *specDef )
595
678
  {
596
- ID idNew = rb_intern( "new" );
597
- ID idP4 = rb_intern( "P4" );
598
- ID idP4Spec = rb_intern( "Spec" );
599
- VALUE cP4 = rb_const_get_at( rb_cObject, idP4 );
600
- VALUE cP4Spec = rb_const_get_at( cP4, idP4Spec );
601
- VALUE fields = SpecFields( specDef );
679
+ ID idNew = rb_intern( "new" );
680
+ ID idP4 = rb_intern( "P4" );
681
+ ID idP4Spec = rb_intern( "Spec" );
682
+ VALUE cP4 = rb_const_get_at( rb_cObject, idP4 );
683
+ VALUE cP4Spec = rb_const_get_at( cP4, idP4Spec );
684
+ VALUE fields = SpecFields( specDef );
602
685
 
603
686
  return rb_funcall( cP4Spec, idNew, 1, fields );
604
687
  }
data/lib/P4.rb CHANGED
@@ -35,9 +35,17 @@
35
35
  require_relative 'P4/version'
36
36
 
37
37
  #
38
- # Get the bulk of the definition of the P4 class from the API interface
38
+ # Get the bulk of the definition of the P4 class from the API interface.
39
39
  #
40
- require 'P4.so'
40
+ # If this is our precompiled gem, the shared library will lie underneath a
41
+ # a version specific folder.
42
+ #
43
+ begin
44
+ RUBY_VERSION =~ /(\d+\.\d+)/
45
+ require "#{$1}/P4.so"
46
+ rescue LoadError
47
+ require 'P4.so'
48
+ end
41
49
 
42
50
  #
43
51
  # Add the extra's written purely in ruby.
data/lib/P4/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class P4
2
- Version = VERSION = '2014.2.0.pre2'
2
+ Version = VERSION = '2014.2.0.pre3'
3
3
  end
@@ -316,6 +316,19 @@ New functionality in 2014.2
316
316
  on rubygems.org were unofficial builds, and prone to fail in
317
317
  non-interactive environments like bundler.
318
318
 
319
+ # (SIR#75097 / P4RUBY-169)
320
+ Add `enviro_file` property to P4 object, which underneath, uses the
321
+ new `SetEnviroFile`/`GetEnviroFile` mechanism from the 14.2 C++ API.
322
+
323
+ Bugs fixed in 2014.2.0.pre3
324
+
325
+ * (BUG#75096 / P4RUBY-168)
326
+ Spec mappings updated to 14.2 definitions.
327
+
328
+ * (TASK#76795 / P4RUBY-176)
329
+ Configuring pre-compiled gems for Linux and OS X, for supported
330
+ Ruby versions (2.0, 2.1, 2.2).
331
+
319
332
  Bugs fixed in 2014.2.0.pre2
320
333
 
321
334
  # (BUG#76321 / P4RUBY-171)
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p4ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2014.2.0.pre2
4
+ version: 2014.2.0.pre3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Perforce Software, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-02 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 10.3.2
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 10.3.2
27
- - !ruby/object:Gem::Dependency
28
- name: rake-compiler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.9'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0.9'
41
- - !ruby/object:Gem::Dependency
42
- name: test-unit
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.0'
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
+ dependencies: []
55
13
  description: Ruby extensions to the C++ Perforce API.
56
14
  email: support@perforce.com
57
15
  executables: []
@@ -98,17 +56,17 @@ require_paths:
98
56
  - lib
99
57
  required_ruby_version: !ruby/object:Gem::Requirement
100
58
  requirements:
101
- - - ">="
59
+ - - '>='
102
60
  - !ruby/object:Gem::Version
103
61
  version: '0'
104
62
  required_rubygems_version: !ruby/object:Gem::Requirement
105
63
  requirements:
106
- - - ">"
64
+ - - '>'
107
65
  - !ruby/object:Gem::Version
108
66
  version: 1.3.1
109
67
  requirements: []
110
68
  rubyforge_project:
111
- rubygems_version: 2.2.2
69
+ rubygems_version: 2.4.5
112
70
  signing_key:
113
71
  specification_version: 4
114
72
  summary: Ruby extensions to the C++ Perforce API