phper 0.0.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,6 +2,12 @@ source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
+ gem "rest-client"
6
+ gem 'keystorage', '> 0.1'
7
+ gem 'highline', '> 1.6'
8
+ gem 'command-line-utils' , '>= 0.0.1'
9
+ gem 'launchy'
10
+ gem 'json'
5
11
 
6
12
  # Add dependencies to develop your gem here.
7
13
  # Include everything needed to run rake, tests, features, etc.
data/Gemfile.lock CHANGED
@@ -1,13 +1,24 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ command-line-utils (0.0.2)
5
+ configuration (1.2.0)
4
6
  git (1.2.5)
7
+ highline (1.6.1)
5
8
  jeweler (1.5.2)
6
9
  bundler (~> 1.0.0)
7
10
  git (>= 1.2.5)
8
11
  rake
12
+ json (1.5.1)
13
+ keystorage (0.4.3)
14
+ launchy (0.3.7)
15
+ configuration (>= 0.0.5)
16
+ rake (>= 0.8.1)
17
+ mime-types (1.16)
9
18
  rake (0.8.7)
10
19
  rcov (0.9.9)
20
+ rest-client (1.6.1)
21
+ mime-types (>= 1.16)
11
22
  shoulda (2.11.3)
12
23
 
13
24
  PLATFORMS
@@ -15,6 +26,12 @@ PLATFORMS
15
26
 
16
27
  DEPENDENCIES
17
28
  bundler (~> 1.0.0)
29
+ command-line-utils (>= 0.0.1)
30
+ highline (> 1.6)
18
31
  jeweler (~> 1.5.2)
32
+ json
33
+ keystorage (> 0.1)
34
+ launchy
19
35
  rcov
36
+ rest-client
20
37
  shoulda
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ phper
2
+ =====
3
+
4
+ A CLI utility for PHPer.jp.
5
+
6
+ PHPer.jp is a Platform As a Service of PHP.
7
+
8
+ Requirements
9
+ ------------
10
+
11
+ * Ruby 1.8.7 or later
12
+ * git
13
+
14
+
15
+ Install
16
+ -------
17
+
18
+ `gem install phper`
19
+
20
+
21
+ Usage
22
+ -----
23
+
24
+ ### Usage: phper [options]
25
+ --version show version
26
+ --help show this message
27
+ --debug debug mode
28
+
29
+ ### Commands:
30
+
31
+ * help
32
+ * login
33
+ * logout
34
+ * list
35
+ * create
36
+ * destroy
37
+ * info
38
+ * keys
39
+ * keys:add
40
+ * keys:remove
41
+ * keys:clear
42
+ * servers
43
+ * servers:add
44
+ * servers:remove
45
+ * open
46
+ * mysql:init
47
+ * deploy
48
+
49
+ Contributing to phper
50
+ ---------------------
51
+
52
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
53
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
54
+ * Fork the project
55
+ * Start a feature/bugfix branch
56
+ * Commit and push until you are happy with your contribution
57
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
58
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
59
+
60
+ Copyright
61
+ ---------
62
+
63
+ Copyright (c) 2011 Yoshihiro TAKAHARA. See LICENSE.txt for further details.
64
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.2.3
data/bin/phper CHANGED
@@ -1,2 +1,88 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ $:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
4
+ require 'phper'
5
+ Phper::CLI::run(ARGV)
6
+ exit
2
7
 
8
+
9
+ def urlroot
10
+ "http://tumf:hogehoge@localhost:3000"
11
+ end
12
+
13
+ def url res
14
+ format = "json"
15
+ urlroot + res + "." + format
16
+ end
17
+
18
+ # RestClient.get(url("/projects"))
19
+ # puts RestClient.post url("/projects"),:project => {:name => "fuga6"}
20
+ # puts RestClient.delete url("/projects/tumf-fuga6")
21
+
22
+
23
+
24
+
25
+
26
+
27
+ =begin
28
+
29
+ phper register
30
+
31
+ $ phper login [<username>]
32
+
33
+ $ phper logout
34
+
35
+ $ phper keys
36
+ $ phper keys:add <file>
37
+ $ phper keys:remove <name>
38
+ $ phper keys:clear
39
+
40
+ == git リポジトリを作る
41
+
42
+ $ phper create <project>
43
+ --> gitosis@git.phper.jp:<user>/<project>.git
44
+
45
+ == coding
46
+
47
+ $ git clone gitosis@git.phper.jp:tumf/<project>.git
48
+
49
+ == deploy
50
+
51
+ $ git push phper master
52
+
53
+ * hostが未割り当てならhostを割り当て
54
+ * hostにデプロイ
55
+ --> /var/phper/project
56
+ --> cap
57
+
58
+ == server
59
+
60
+ $ phper server [<docroot>] [--port=<port>] []
61
+
62
+
63
+ * <docroot>をドキュメントルートにしてサーバを構築
64
+ --> /var/phper/project/<docroot>
65
+
66
+ $ phper server [<docroot>] [--name=<fqdn>]
67
+
68
+ * proxyの`/etc/hosts`を更新
69
+ * proxyのnginx設定を更新
70
+ * Apache VirtualHostを設定
71
+ * nameが指定されていなかったら適当に決められる
72
+
73
+ == サーバの設定
74
+
75
+ $ phper server:config
76
+ $ phper server:config:add
77
+ $ phper server:config:clear
78
+
79
+
80
+
81
+ == メンテナンス
82
+
83
+ $ phper server:maintenance <on|off>
84
+
85
+ $ phper server:stop
86
+ $ phper server:start
87
+ $ phper server:restart
88
+ =end
data/lib/phper.rb CHANGED
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Phper
3
+ def name_of_key key
4
+ if key =~ / (\S+)$/
5
+ return $1
6
+ end
7
+ return nil
8
+ end
9
+
10
+ # git remoteの結果からプロジェクトを推測する
11
+ def git_remote(base_dir)
12
+ %x{git remote -v 2> /dev/null }.each_line{ |line|
13
+ if line =~ /\sgitosis@git\.phper\.jp:(.+)\/(.+)\.git\s/
14
+ return [$1,$2].join("-")
15
+ end
16
+ }
17
+ nil
18
+ end
19
+
20
+ def git_remotes(git)
21
+ # %x{git remote add phper #{project["project"]["git"]}}
22
+ r = []
23
+ %x{git remote -v 2> /dev/null }.each_line{ |line|
24
+ if line.include?(git)
25
+ r << $1 if line =~ /^(\S+)/
26
+ end
27
+ }
28
+ r.uniq
29
+ end
30
+
31
+ def in_git?
32
+ %x{git status 2>/dev/null }
33
+ $?.to_i == 0
34
+ end
35
+
36
+ end
37
+ require "rubygems"
38
+ require "json"
39
+ require "highline/import"
40
+ require "keystorage"
41
+ require 'rest-client'
42
+ require 'highline'
43
+ require 'launchy'
44
+ require 'command-line-utils'
45
+ require 'phper/commands'
46
+ require 'phper/cli'
47
+ require 'phper/agent'
48
+
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'phper'
4
+ class Phper::Agent
5
+ include Phper
6
+
7
+ def initialize
8
+ @login = false
9
+ end
10
+
11
+ def log dest
12
+ RestClient.log = dest
13
+ end
14
+
15
+ def login(u,p)
16
+ @auth = {:user => u, :password => p}
17
+ begin
18
+ projects
19
+ @login = true
20
+ rescue => e
21
+ puts e
22
+ @login = false
23
+ end
24
+ end
25
+
26
+ def login?
27
+ @login
28
+ end
29
+
30
+ def projects id = nil
31
+ if id
32
+ get("/projects/%s" % id)
33
+ else
34
+ get("/projects")
35
+ end
36
+ end
37
+
38
+ def projects_create name
39
+ param = {}
40
+ param[:name] = name if name
41
+ post("/projects",{:project => param})
42
+ end
43
+
44
+ def projects_delete name
45
+ delete("/projects/#{name}")
46
+ end
47
+
48
+ def keys
49
+ get("/keys")
50
+ end
51
+
52
+ def keys_create key
53
+ param = {}
54
+ param[:public_key] = key if key
55
+ post("/keys",{:key => param})
56
+ end
57
+
58
+ def keys_delete name
59
+ count = 0
60
+ keys.each { |key|
61
+ if name == name_of_key(key["key"]["public_key"])
62
+ delete("/keys/%i" % key["key"]["id"])
63
+ count += 1
64
+ end
65
+ }
66
+ count
67
+ end
68
+
69
+ def keys_delete_all
70
+ count = 0
71
+ keys.each { |key|
72
+ delete("/keys/%i" % key["key"]["id"])
73
+ count += 1
74
+ }
75
+ count
76
+ end
77
+
78
+ def servers project
79
+ get("/projects/%s/servers" % project)
80
+ end
81
+
82
+ def servers_create project,param
83
+ defaults = get("/projects/%s/servers/new" % project)["server"]
84
+ param[:name] = defaults["name"] unless param.has_key?(:name)
85
+ param[:fqdn] = defaults["fqdn"] unless param.has_key?(:fqdn)
86
+ post("/projects/%s/servers" % project ,{:server => param})
87
+ end
88
+
89
+
90
+ def servers_delete project,name
91
+ count = 0;
92
+ servers(project).each { |s|
93
+ if s["server"]["fqdn"] == name or s["server"]["name"] == name
94
+ delete("/projects/%s/servers/%s"%[project,s["server"]["id"]])
95
+ count += 1
96
+ end
97
+ }
98
+ count
99
+ end
100
+
101
+
102
+
103
+
104
+
105
+
106
+ def post(url,data = {},format=:json)
107
+ call(:post,url,data,format)
108
+ end
109
+
110
+ def get(url,data = {},format=:json)
111
+ call(:get,url,data,format)
112
+ end
113
+
114
+ def put(url,data = {},format=:json)
115
+ call(:put,url,data,format)
116
+ end
117
+
118
+ def delete(url,data = {},format=:json)
119
+ call(:delete,url,data,format)
120
+ end
121
+
122
+ def base_url
123
+ ENV["PHPERJP_URL"] || "https://phper.jp"
124
+ end
125
+
126
+ protected
127
+ def call(method,url,data,format)
128
+ url = "%s%s.%s" % [base_url,url,format.to_s]
129
+ resource = RestClient::Resource.new(url,:user => @auth[:user], :password => @auth[:password])
130
+ parse(resource.send(method.to_s,data),format)
131
+ end
132
+
133
+ def parse(data,format)
134
+ return "" if data.length == 0
135
+ if format == :json
136
+ data = "{}" if data.length < 2
137
+ return JSON.parse(data)
138
+ end
139
+ raise format + "is not support formats."
140
+ end
141
+
142
+ end
data/lib/phper/cli.rb ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'phper'
4
+ class Phper::CLI < CommandLineUtils::CLI
5
+ include Phper
6
+ def initialize
7
+ super
8
+ @commands = Commands.new
9
+ yield self if block_given?
10
+ end
11
+ def dispatch(cmd,cmd_argv)
12
+ @commands.send(cmd.sub(/:/,"_"))
13
+ end
14
+ end
@@ -0,0 +1,326 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'phper'
4
+
5
+ class Phper::Commands < CommandLineUtils::Commands
6
+ include Phper
7
+ def initialize
8
+ super
9
+ @commands += ["login","logout","list","create","destroy","info"]
10
+ @commands += ["keys","keys:add","keys:remove","keys:clear"]
11
+ @commands += ["servers","servers:add","servers:remove"]
12
+ @commands += ["open","mysql:init","deploy"]
13
+
14
+ @agent = Agent.new
15
+ # @cache_file = homedir + "/.phper.cache"
16
+ # @cache = Cache.new(@cache_file)
17
+ yield self if block_given?
18
+ end
19
+
20
+ def homedir
21
+ ENV['HOME']
22
+ end
23
+
24
+ def login
25
+ opt = OptionParser.new
26
+ opt.parse!(@command_options)
27
+ @summery = "Login to phper.jp."
28
+ @banner = ""
29
+ return opt if @help
30
+
31
+ user = ask('Enter user: ') do |q|
32
+ q.validate = /\w+/
33
+ end
34
+
35
+ ok = false
36
+ while(!ok)
37
+ password = ask("Enter your password: ") do |q|
38
+ q.validate = /\w+/
39
+ q.echo = false
40
+ end
41
+
42
+ @agent.login(user,password)
43
+ if @agent.login? # => OK
44
+ ok = true
45
+ Keystorage.set("phper.jp",user,password)
46
+ puts "login OK"
47
+ else
48
+ puts "password mismatch"
49
+ end
50
+ end
51
+ end
52
+
53
+ def logout
54
+ opt = OptionParser.new
55
+ opt.parse!(@command_options)
56
+ @summery = "Logout from phper.jp ."
57
+ @banner = ""
58
+ return opt if @help
59
+ Keystorage.delete("phper.jp")
60
+ end
61
+
62
+
63
+ def list
64
+ opt = OptionParser.new
65
+ opt.parse!(@command_options)
66
+ @summery = "get project list"
67
+ @banner = ""
68
+ return opt if @help
69
+
70
+ start
71
+ @agent.projects.each { |pj|
72
+ puts pj["project"]["id"]
73
+ }
74
+ end
75
+
76
+ def create
77
+ OptionParser.new { |opt|
78
+ opt.parse!(@command_options)
79
+ @summery = "craete project"
80
+ @banner = "[<name>]"
81
+ return opt if @help
82
+ }
83
+ name = @command_options.shift
84
+
85
+ start
86
+ project = @agent.projects_create name
87
+
88
+ puts "Created %s" % project["project"]["id"]
89
+ puts "--> %s" % project["project"]["git"]
90
+ puts "--> mysql://%s:%s@%s/%s" % [project["project"]["dbuser"],
91
+ project["project"]["dbpassword"],
92
+ project["project"]["dbhost"],
93
+ project["project"]["dbname"]]
94
+ # if here
95
+ if in_git? and project["project"]["id"] != git_remote(Dir.pwd)
96
+ %x{git remote add phper #{project["project"]["git"]}}
97
+ end
98
+ end
99
+
100
+ def destroy
101
+ project = nil
102
+ yes = false
103
+ OptionParser.new { |opt|
104
+ opt.on('-y','--yes', 'answer yes for all questions') { |v|
105
+ yes = true
106
+ }
107
+ project = extract_project(opt)
108
+ @summery = "destroy project"
109
+ return opt if @help
110
+ }
111
+ raise "project is not specified." unless project
112
+ yes = true if yes or ask("Destroy #{project}? ",["yes","no"]) == "yes"
113
+ if yes
114
+ start
115
+ @agent.projects_delete project
116
+ puts "Destroyed #{project}"
117
+ # if here
118
+ if in_git? and project["project"]["id"] == git_remote(Dir.pwd)
119
+ git_remotes(project["project"]["git"]){ |name|
120
+ cmd = "git remote rm #{name}"
121
+ %x{#{cmd}}
122
+ puts cmd
123
+ }
124
+ end
125
+ end
126
+ end
127
+
128
+ def keys
129
+ OptionParser.new { |opt|
130
+ opt.parse!(@command_options)
131
+ @summery = "list keys"
132
+ @banner = ""
133
+ return opt if @help
134
+ }
135
+ start
136
+ @agent.keys.each { |key|
137
+ name = name_of_key(key["key"]["public_key"])
138
+ puts name if name
139
+ }
140
+ end
141
+
142
+
143
+ def keys_add
144
+ OptionParser.new { |opt|
145
+ opt.parse!(@command_options)
146
+ @summery = "add keys"
147
+ @banner = "<public key file>"
148
+ return opt if @help
149
+ }
150
+ file = @command_options.shift
151
+ raise "file is not specified." unless file
152
+ key = ""
153
+ File.open(file) { |f|
154
+ key = f.read
155
+ }
156
+ name = name_of_key(key)
157
+ raise "invalid key" unless name
158
+ start
159
+ @agent.keys_create(key)
160
+ puts "key of %s added" % name
161
+ end
162
+
163
+ def keys_remove
164
+ OptionParser.new { |opt|
165
+ opt.parse!(@command_options)
166
+ @summery = "remove key"
167
+ @banner = "<user@host>"
168
+ return opt if @help
169
+ }
170
+ name = @command_options.shift
171
+ raise "key name is not specified." unless name
172
+ start
173
+ count = @agent.keys_delete(name)
174
+ puts "%i key(s) named %s removed" % [count,name]
175
+ end
176
+
177
+ def keys_clear
178
+ OptionParser.new { |opt|
179
+ opt.parse!(@command_options)
180
+ @summery = "remove all keys"
181
+ @banner = ""
182
+ return opt if @help
183
+ }
184
+ start
185
+ count = @agent.keys_delete_all
186
+ puts "%i key(s) removed" % [count]
187
+ end
188
+
189
+ def extract_project opt
190
+ @banner = [@banner,"[--project=<project>]"].join(" ")
191
+ project = nil
192
+ opt.on('--project=PROJECT', 'project') { |v|
193
+ project = full_project_name(v)
194
+ }
195
+ opt.parse!(@command_options)
196
+ return project if project
197
+ git_remote(Dir.pwd)
198
+ end
199
+
200
+ def servers
201
+ project = nil
202
+ OptionParser.new { |opt|
203
+ project = extract_project(opt)
204
+ @summery = "list servers"
205
+ return opt if @help
206
+ }
207
+ raise "project is not specified." unless project
208
+ start
209
+ @agent.servers(project).each { |server|
210
+ puts "%s\thttp://%s" % [server["server"]["name"],server["server"]["fqdn"]]
211
+ }
212
+ end
213
+
214
+ def servers_add
215
+ param = {}
216
+ project = nil
217
+ name = nil
218
+ OptionParser.new { |opt|
219
+ opt.on('--name=NAME', 'Name of this server') { |v|
220
+ param[:name] = v
221
+ }
222
+ opt.on('--root=ROOT', 'Document Root') { |v|
223
+ param[:root] = v
224
+ }
225
+ project = extract_project(opt)
226
+ @banner = "[<host>]"
227
+ @summery = "add server"
228
+ return opt if @help
229
+ }
230
+ raise "project is not specified." unless project
231
+ host = @command_options.shift
232
+ if host
233
+ param[:fqdn] = host
234
+ param[:name] = host unless param.has_key?(:name)
235
+ end
236
+
237
+ start
238
+ server = @agent.servers_create(project,param)["server"]
239
+ puts "Created %s" % server["name"]
240
+ puts "--> http://%s" % server["fqdn"]
241
+ end
242
+
243
+ def servers_remove
244
+ param = {}
245
+ project = nil
246
+ name = nil
247
+ OptionParser.new { |opt|
248
+ project = extract_project(opt)
249
+ @banner = "[<host or name>]"
250
+ @summery = "remove server"
251
+ return opt if @help
252
+ }
253
+ raise "project is not specified." unless project
254
+ name = @command_options.shift
255
+
256
+ start
257
+ count = @agent.servers_delete(project,name)
258
+ puts "%i server(s) named %s removed" % [count,name]
259
+ end
260
+
261
+ def servers_clear
262
+ OptionParser.new { |opt|
263
+ project = extract_project(opt)
264
+ @summery = "remove all servers"
265
+ return opt if @help
266
+ }
267
+ raise "project is not specified." unless project
268
+
269
+ end
270
+
271
+ def open
272
+ project = nil
273
+ OptionParser.new { |opt|
274
+ project = extract_project(opt)
275
+ @banner = "[<host or name pattern>]"
276
+ @summery = "Open URL"
277
+ return opt if @help
278
+ }
279
+ raise "project is not specified." unless project
280
+ start
281
+ servers = @agent.servers(project)
282
+ raise "project #{project} has no servers." if servers.length == 0
283
+ name = @command_options.shift
284
+
285
+ server = nil
286
+ if name
287
+ server = servers.find { |s|
288
+ s["server"]["name"] =~ /^#{name}/ or s["server"]["fqdn"] =~ /^#{name}/
289
+ }
290
+ end
291
+ server = servers.shift unless server
292
+ url = "http://#{server["server"]["fqdn"]}"
293
+ puts "Opening #{url}"
294
+ Launchy.open url
295
+ end
296
+
297
+
298
+
299
+
300
+
301
+
302
+ private
303
+
304
+ def user
305
+ Keystorage.list("phper.jp").shift
306
+ end
307
+
308
+ def password
309
+ Keystorage.get("phper.jp",user)
310
+ end
311
+
312
+ def full_project_name(v)
313
+ return v if v =~ /\-/
314
+ [user,v].join("-")
315
+ end
316
+
317
+ def start
318
+ @agent.log(STDERR) if @options[:debug]
319
+ return true if @agent.login?
320
+ login unless user
321
+ if user
322
+ @agent.login(user,password)
323
+ login unless @agent.login?
324
+ end
325
+ end
326
+ end
data/phper.gemspec ADDED
@@ -0,0 +1,86 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{phper}
8
+ s.version = "0.2.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Yoshihiro TAKAHARA"]
12
+ s.date = %q{2011-02-21}
13
+ s.default_executable = %q{phper}
14
+ s.description = %q{phper}
15
+ s.email = %q{y.takahara@gmail.com}
16
+ s.executables = ["phper"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE.txt",
19
+ "README.md"
20
+ ]
21
+ s.files = [
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "bin/phper",
29
+ "lib/phper.rb",
30
+ "lib/phper/agent.rb",
31
+ "lib/phper/cli.rb",
32
+ "lib/phper/commands.rb",
33
+ "phper.gemspec",
34
+ "test/helper.rb",
35
+ "test/test_phper.rb"
36
+ ]
37
+ s.homepage = %q{http://github.com/tumf/phper}
38
+ s.licenses = ["MIT"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = %q{1.5.0}
41
+ s.summary = %q{phper}
42
+ s.test_files = [
43
+ "test/helper.rb",
44
+ "test/test_phper.rb"
45
+ ]
46
+
47
+ if s.respond_to? :specification_version then
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<rest-client>, [">= 0"])
52
+ s.add_runtime_dependency(%q<keystorage>, ["> 0.1"])
53
+ s.add_runtime_dependency(%q<highline>, ["> 1.6"])
54
+ s.add_runtime_dependency(%q<command-line-utils>, [">= 0.0.1"])
55
+ s.add_runtime_dependency(%q<launchy>, [">= 0"])
56
+ s.add_runtime_dependency(%q<json>, [">= 0"])
57
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
58
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
60
+ s.add_development_dependency(%q<rcov>, [">= 0"])
61
+ else
62
+ s.add_dependency(%q<rest-client>, [">= 0"])
63
+ s.add_dependency(%q<keystorage>, ["> 0.1"])
64
+ s.add_dependency(%q<highline>, ["> 1.6"])
65
+ s.add_dependency(%q<command-line-utils>, [">= 0.0.1"])
66
+ s.add_dependency(%q<launchy>, [">= 0"])
67
+ s.add_dependency(%q<json>, [">= 0"])
68
+ s.add_dependency(%q<shoulda>, [">= 0"])
69
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
71
+ s.add_dependency(%q<rcov>, [">= 0"])
72
+ end
73
+ else
74
+ s.add_dependency(%q<rest-client>, [">= 0"])
75
+ s.add_dependency(%q<keystorage>, ["> 0.1"])
76
+ s.add_dependency(%q<highline>, ["> 1.6"])
77
+ s.add_dependency(%q<command-line-utils>, [">= 0.0.1"])
78
+ s.add_dependency(%q<launchy>, [">= 0"])
79
+ s.add_dependency(%q<json>, [">= 0"])
80
+ s.add_dependency(%q<shoulda>, [">= 0"])
81
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
82
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
83
+ s.add_dependency(%q<rcov>, [">= 0"])
84
+ end
85
+ end
86
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phper
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
- - 0
10
- version: 0.0.0
8
+ - 2
9
+ - 3
10
+ version: 0.2.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Yoshihiro TAKAHARA
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-05 00:00:00 +09:00
18
+ date: 2011-02-21 00:00:00 +09:00
19
19
  default_executable: phper
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -29,11 +29,99 @@ dependencies:
29
29
  - 0
30
30
  version: "0"
31
31
  version_requirements: *id001
32
+ name: rest-client
33
+ prerelease: false
34
+ type: :runtime
35
+ - !ruby/object:Gem::Dependency
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">"
40
+ - !ruby/object:Gem::Version
41
+ hash: 9
42
+ segments:
43
+ - 0
44
+ - 1
45
+ version: "0.1"
46
+ version_requirements: *id002
47
+ name: keystorage
48
+ prerelease: false
49
+ type: :runtime
50
+ - !ruby/object:Gem::Dependency
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">"
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 1
59
+ - 6
60
+ version: "1.6"
61
+ version_requirements: *id003
62
+ name: highline
63
+ prerelease: false
64
+ type: :runtime
65
+ - !ruby/object:Gem::Dependency
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 29
72
+ segments:
73
+ - 0
74
+ - 0
75
+ - 1
76
+ version: 0.0.1
77
+ version_requirements: *id004
78
+ name: command-line-utils
79
+ prerelease: false
80
+ type: :runtime
81
+ - !ruby/object:Gem::Dependency
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ version_requirements: *id005
92
+ name: launchy
93
+ prerelease: false
94
+ type: :runtime
95
+ - !ruby/object:Gem::Dependency
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ version_requirements: *id006
106
+ name: json
107
+ prerelease: false
108
+ type: :runtime
109
+ - !ruby/object:Gem::Dependency
110
+ requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ version_requirements: *id007
32
120
  name: shoulda
33
121
  prerelease: false
34
122
  type: :development
35
123
  - !ruby/object:Gem::Dependency
36
- requirement: &id002 !ruby/object:Gem::Requirement
124
+ requirement: &id008 !ruby/object:Gem::Requirement
37
125
  none: false
38
126
  requirements:
39
127
  - - ~>
@@ -44,12 +132,12 @@ dependencies:
44
132
  - 0
45
133
  - 0
46
134
  version: 1.0.0
47
- version_requirements: *id002
135
+ version_requirements: *id008
48
136
  name: bundler
49
137
  prerelease: false
50
138
  type: :development
51
139
  - !ruby/object:Gem::Dependency
52
- requirement: &id003 !ruby/object:Gem::Requirement
140
+ requirement: &id009 !ruby/object:Gem::Requirement
53
141
  none: false
54
142
  requirements:
55
143
  - - ~>
@@ -60,12 +148,12 @@ dependencies:
60
148
  - 5
61
149
  - 2
62
150
  version: 1.5.2
63
- version_requirements: *id003
151
+ version_requirements: *id009
64
152
  name: jeweler
65
153
  prerelease: false
66
154
  type: :development
67
155
  - !ruby/object:Gem::Dependency
68
- requirement: &id004 !ruby/object:Gem::Requirement
156
+ requirement: &id010 !ruby/object:Gem::Requirement
69
157
  none: false
70
158
  requirements:
71
159
  - - ">="
@@ -74,7 +162,7 @@ dependencies:
74
162
  segments:
75
163
  - 0
76
164
  version: "0"
77
- version_requirements: *id004
165
+ version_requirements: *id010
78
166
  name: rcov
79
167
  prerelease: false
80
168
  type: :development
@@ -86,16 +174,20 @@ extensions: []
86
174
 
87
175
  extra_rdoc_files:
88
176
  - LICENSE.txt
89
- - README.rdoc
177
+ - README.md
90
178
  files:
91
179
  - Gemfile
92
180
  - Gemfile.lock
93
181
  - LICENSE.txt
94
- - README.rdoc
182
+ - README.md
95
183
  - Rakefile
96
184
  - VERSION
97
185
  - bin/phper
98
186
  - lib/phper.rb
187
+ - lib/phper/agent.rb
188
+ - lib/phper/cli.rb
189
+ - lib/phper/commands.rb
190
+ - phper.gemspec
99
191
  - test/helper.rb
100
192
  - test/test_phper.rb
101
193
  has_rdoc: true
data/README.rdoc DELETED
@@ -1,19 +0,0 @@
1
- = phper
2
-
3
- Description goes here.
4
-
5
- == Contributing to phper
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
- * Fork the project
10
- * Start a feature/bugfix branch
11
- * Commit and push until you are happy with your contribution
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2011 Yoshihiro TAKAHARA. See LICENSE.txt for
18
- further details.
19
-