utsup 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.1
2
+
3
+ * added Differ
4
+
1
5
  === 0.0.5
2
6
 
3
7
  * added sup push
data/Manifest.txt CHANGED
@@ -10,8 +10,16 @@ lib/hooks/post-checkout
10
10
  lib/hooks/post-merge
11
11
  lib/hooks/post-receive
12
12
  lib/sup.rb
13
+ lib/sup/differ/differ_control.rb
14
+ lib/sup/differ/differ_run.rb
15
+ lib/sup/differ/differ.rb
16
+ lib/sup/yamlize.rb
17
+ lib/sup/command.rb
18
+ lib/sup/help.rb
19
+ lib/sup/api.rb
13
20
  script/console
14
21
  script/destroy
15
22
  script/generate
16
23
  test/test_helper.rb
17
24
  test/test_sup.rb
25
+ test/test_yamler.rb
data/PostInstall.txt CHANGED
@@ -1 +1,13 @@
1
- Add your api key to ~/.utsup
1
+ =======================================
2
+ UtSup Installed!
3
+ =======================================
4
+
5
+ Be sure to sign up for an account at http://utsup.com
6
+
7
+ Then, to begin using, first run:
8
+
9
+ sup setup <your-api-key>
10
+
11
+ Thanks for using UtSup!
12
+ - Lemur Heavy Industries (http://lemurheavy.com)
13
+
data/Rakefile CHANGED
@@ -14,9 +14,10 @@ $hoe = Hoe.spec 'utsup' do
14
14
  self.developer 'Nick Merwin', 'nick@lemurheavy.com'
15
15
  self.post_install_message = File.read('PostInstall.txt')
16
16
  self.rubyforge_name = self.name
17
- self.extra_deps = [['schacon-git']]
17
+ self.extra_deps = [['schacon-git'],['daemons']]
18
18
  # self.spec_extras[:extensions] = "extconf.rb"
19
19
  self.spec_extras[:rdoc_options] = ""
20
+ self.spec_extras[:homepage] = %q{http://github.com/yickster/utsup_gem}
20
21
 
21
22
  end
22
23
 
data/lib/sup/api.rb ADDED
@@ -0,0 +1,42 @@
1
+ module Sup
2
+ # ==============================
3
+ # API's
4
+ # ==============================
5
+
6
+ module Api
7
+ class Base < ActiveResource::Base
8
+ cattr_accessor :project_id
9
+ self.user = "api"
10
+ end
11
+
12
+ class Status < Base
13
+ def self.add(attributes)
14
+ unless self.project_id
15
+ puts "You're not in a Sup project. Run 'sup init' to add this directory."
16
+ return
17
+ end
18
+
19
+ create attributes.merge({:project_id => @@project_id, :branch => Sup::current_branch_name, :version => VERSION})
20
+
21
+ rescue ActiveResource::ResourceNotFound
22
+ puts "Your project_id was invalid, check #{PROJECT_CONFIG_PATH}"
23
+ rescue SocketError
24
+ Sup::socket_error
25
+ end
26
+ end
27
+
28
+ class Project < Base
29
+
30
+ end
31
+
32
+ class User < Base
33
+ def self.check_name(name)
34
+ begin
35
+ get :check_name, :name => name
36
+ rescue ActiveResource::ResourceNotFound
37
+ false
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,98 @@
1
+ module Sup
2
+ # ==============================
3
+ # Command Line Controller
4
+ # ==============================
5
+
6
+ module Command
7
+ class << self
8
+ def run(command, args)
9
+ bench = Time.now
10
+
11
+ # no configure
12
+ case command
13
+ when "setup":
14
+ return Sup::setup args.last
15
+ end
16
+
17
+ Sup::configure
18
+
19
+ case command
20
+
21
+ when "help":
22
+ puts HELP_TEXT
23
+
24
+ when "version":
25
+ puts VERSION
26
+
27
+ when "init":
28
+ Sup::init args.first
29
+ Differ::restart! # to reload projects.yml
30
+ puts "Supified!"
31
+
32
+ when "in":
33
+ Sup::check_in args.last
34
+ Differ::start!
35
+ puts "Checked in."
36
+
37
+ when "out":
38
+ Sup::check_out args.last
39
+ Differ::stop!
40
+ puts "Checked out."
41
+
42
+ # --- Git -----------------
43
+ when "git":
44
+ Sup::git_update args
45
+ when "push":
46
+ Sup::git_update "push"
47
+
48
+ when "nm":
49
+ Sup::undo
50
+ puts "Undid last Supdate."
51
+
52
+ when "remove":
53
+ File.unlink File.join(Dir.pwd, PROJECT_CONFIG_PATH)
54
+ # TODO: remove git hooks
55
+ puts "De-Supified."
56
+
57
+ when "users":
58
+ Sup::get_users
59
+
60
+ when "all":
61
+ Sup::get_statuses :today => true
62
+
63
+ when "search":
64
+ # TODO: search
65
+
66
+ when "start"
67
+ Differ::start!
68
+ puts "Started."
69
+ when "stop"
70
+ Differ::stop!
71
+ puts "Stopped."
72
+
73
+ when /.+/:
74
+
75
+ # TODO: combine user_name check and supdate into one ActiveResource call -- do name-check & return or supdate on server
76
+ if Api::User.check_name(command)
77
+ Sup::get_statuses :name => command, :today => true
78
+ return
79
+ end
80
+
81
+ # implicit text update: sup "chillin"
82
+ Sup::update command
83
+ puts "Supdated."
84
+
85
+ else
86
+ # full status check
87
+ Sup::get_statuses
88
+ end
89
+
90
+ # TODO: config file option to set verbosity
91
+ puts "UtSup? v.#{VERSION} (#{Time.now - bench}s)"
92
+
93
+ rescue SocketError
94
+ Sup::socket_error
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,84 @@
1
+ module Sup
2
+ module Differ
3
+ INTERVAL = 5
4
+ # TODO: pull interval out of config.yml?
5
+
6
+ class << self
7
+ def run
8
+ @projects = Project.all
9
+
10
+ loop do
11
+ @projects.map &:diff!
12
+ sleep INTERVAL
13
+ end
14
+ end
15
+
16
+ def start!
17
+ `ruby #{File.join(File.expand_path(File.dirname(__FILE__)),'differ_control.rb')} start`
18
+ end
19
+
20
+ def stop!
21
+ `ruby #{File.join(File.expand_path(File.dirname(__FILE__)),'differ_control.rb')} stop`
22
+ end
23
+
24
+ def restart!
25
+ stop! && start!
26
+ end
27
+ end
28
+ end
29
+
30
+ # TODO: marshal dump these directly to yaml? or store in sqlite db
31
+ class Project
32
+ attr_accessor :current_diff
33
+ def initialize(id, path)
34
+ @id, @path = id, path
35
+ @current_diff = ""
36
+ @current_changed_files = {}
37
+ end
38
+
39
+ def diff!
40
+ # figure out which specific files have changed since the last diff
41
+
42
+ @changed_files = []
43
+ @current_diffs = []
44
+
45
+ Dir.chdir @path
46
+ diff = `git diff`
47
+
48
+ if diff != @current_diff
49
+ @current_diff = diff
50
+
51
+ # get array of changed files from git diff
52
+ `git diff --stat`.scan(/^ (.*?)\s{1,}\|/m).flatten.each do |file|
53
+
54
+ # get specific diff for file
55
+ file_diff = `git diff #{file}`
56
+
57
+ # if different from previous diff, store path and diff
58
+ if @current_changed_files[file] != file_diff
59
+ @current_changed_files[file] = file_diff
60
+ @changed_files << file
61
+ @current_diffs << file_diff
62
+ end
63
+ end
64
+
65
+ supdate! unless @changed_files.empty?
66
+ end
67
+ end
68
+
69
+ def supdate!
70
+ Sup::configure
71
+ Sup::Api::Status.add :status_type => "StatusDiff", :message => @changed_files*', ',
72
+ :text => @current_diffs*'\n'
73
+ end
74
+
75
+ class << self
76
+ def all
77
+ [].yamlize(GLOBAL_PROJECT_CONFIG_PATH).map do |project_config|
78
+ new project_config['id'], project_config['path']
79
+ end
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'daemons'
3
+
4
+ options = {
5
+ :app_name => "utsup",
6
+ :backtrace => true,
7
+ :monitor => true,
8
+ :multiple => false,
9
+ :dir_mode => :normal,
10
+ :dir => File.join(File.expand_path('~'), '.utsup'),
11
+ :log_output => true
12
+ }
13
+
14
+ Daemons.run(File.join(File.dirname(__FILE__), 'differ_run.rb'), options)
@@ -0,0 +1,2 @@
1
+ require 'sup'
2
+ Sup::Differ.run
data/lib/sup/help.rb ADDED
@@ -0,0 +1,43 @@
1
+ module Sup
2
+ HELP_TEXT = <<-eos
3
+ =======================================
4
+ UtSup Client v.#{VERSION}
5
+ by Nick Merwin (Lemur Heavy Industries)
6
+ =======================================
7
+
8
+ === Examples:
9
+ sup setup
10
+
11
+ cd /some-project/ && sup init
12
+ sup in "whatup"
13
+ sup
14
+ sup "just chillin"
15
+ sup out "later"
16
+
17
+ === Commands:
18
+
19
+ help # show this message
20
+ version # show version
21
+
22
+ setup <api_key> # initializes global config file
23
+
24
+ init <project name> # initilize current directory
25
+
26
+ "<message>" # send status update for current project
27
+ nm # destroy your last supdate
28
+
29
+ (no command) # get all user's current status
30
+ all # get all user's statuses over the past day
31
+
32
+ in "<message>" # check in to project
33
+ out "<message>" # check out of project
34
+
35
+ users # get list of users in company
36
+ <user name> # get last day's worth of status updates from specified user
37
+
38
+ push # triggers a git push + update
39
+
40
+ start # starts differ
41
+ stop # stops differ
42
+ eos
43
+ end
@@ -0,0 +1,59 @@
1
+ =begin
2
+ ======
3
+ Yamlize
4
+ ======
5
+
6
+ by Nick Merwin 10.31.09
7
+
8
+ Why? Bored with writing yaml loaders + dumpers.
9
+ =end
10
+
11
+ require 'yaml'
12
+ class Yamlize
13
+ attr_reader :path, :attributes
14
+
15
+ def initialize(path, type=Hash, &block)
16
+ @path = File.expand_path path
17
+ File.open(@path,'w'){} unless File.exists?(@path)
18
+ @attributes = YAML.load_file(@path) || type.new
19
+
20
+ if block_given?
21
+ yield self
22
+ save
23
+ end
24
+ rescue Errno::ENOTDIR
25
+ raise "Path invalid."
26
+ rescue Errno::ENOENT
27
+ raise "Path invalid."
28
+ end
29
+
30
+ def method_missing(name, *args, &block)
31
+ if attribute = name.to_s[/(.*?)=/,1]
32
+ @attributes[attribute] = args.first
33
+ return
34
+ end
35
+
36
+ begin
37
+ if !@attributes[name.to_s].nil?
38
+ return @attributes[name.to_s]
39
+ end
40
+ rescue TypeError
41
+ end
42
+
43
+ if @attributes.respond_to?(name)
44
+ return @attributes.send name, *args, &block
45
+ end
46
+
47
+ super name, *args
48
+ end
49
+
50
+ def save
51
+ File.open(@path,'w'){|f| YAML.dump @attributes, f}
52
+ end
53
+ end
54
+
55
+ class Object
56
+ def yamlize(path, &block)
57
+ Yamlize.new path, self.class, &block
58
+ end
59
+ end
data/lib/sup.rb CHANGED
@@ -1,66 +1,56 @@
1
+ # TODO: testing suite
2
+
1
3
  $:.unshift(File.dirname(__FILE__)) unless
2
4
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
5
 
6
+ require 'rubygems'
4
7
  require 'active_resource'
5
- require 'yaml'
6
8
  require 'git'
7
9
 
8
- module Sup
9
- VERSION = '0.0.9'
10
- GIT_HOOKS = %w(post-commit post-receive post-merge post-checkout) #TODO: post-rebase?
11
-
12
- GLOBAL_CONFIG_PATH = '~/.utsup'
13
- PROJECT_CONFIG_PATH = '.git/utsup.yml'
14
-
15
- HELP_TEXT = <<-eos
16
- =======================================
17
- UtSup Client v.0.0.1
18
- by Nick Merwin (Lemur Heavy Industries)
19
- =======================================
10
+ require 'sup/yamlize'
20
11
 
21
- === Examples:
22
- sup setup
23
-
24
- sup init
25
- sup in "whatup"
26
- sup
27
- sup "just chillin"
28
- sup out "later"
29
-
30
- === Commands:
31
-
32
- help # show this message
33
- version # show version
34
-
35
- setup # initializes global config file
12
+ require 'sup/differ/differ'
13
+ require 'sup/api'
14
+ require 'sup/command'
36
15
 
37
- init <project name> # initilize current directory
38
-
39
- "<message>" # send status update for current project
40
- nm # destroy your last supdate
41
-
42
- (no command) # get all user's current status
43
- all # get all user's statuses over the past day
44
-
45
- in "<message>" # check in to project
46
- out "<message>" # check out of project
47
-
48
- users # get list of users in company
49
- <user name> # get last day's worth of status updates from specified user
16
+ module Sup
17
+ VERSION = '0.1.0'
18
+ GIT_HOOKS = %w(post-commit post-receive post-merge post-checkout) #TODO: post-rebase?
50
19
 
51
- push # triggers a git push + update
52
- eos
20
+ GLOBAL_CONFIG_PATH = '~/.utsup/config.yml'
21
+ GLOBAL_PROJECT_CONFIG_PATH = '~/.utsup/projects.yml'
22
+ PROJECT_CONFIG_PATH = '.git/utsup.yml'
53
23
 
54
24
  class << self
55
25
 
56
- def setup
26
+ # ===========================
27
+ # Setup
28
+ # ===========================
29
+
30
+ def setup(api_key="your api key here")
31
+ require 'fileutils'
32
+
57
33
  # --- global init
58
34
  global_config_path = File.expand_path(GLOBAL_CONFIG_PATH)
59
35
 
36
+ # for back-compat with old config file
37
+ oldpath = File.dirname(global_config_path)
38
+ if File.exists?(oldpath) && !File.directory?(oldpath)
39
+ FileUtils.mv oldpath, oldpath+'.bak'
40
+ FileUtils.mkdir File.dirname(global_config_path)
41
+ FileUtils.mv oldpath+'.bak', global_config_path
42
+ end
43
+
60
44
  unless File.exists?(global_config_path)
61
- require 'ftools'
62
- File.copy File.join(File.dirname(__FILE__), 'config/utsup.sample'), global_config_path
63
- puts "Initialized ~/.utsup, go change your api_key value."
45
+ FileUtils.mkdir File.dirname(global_config_path)
46
+ FileUtils.copy File.join(File.dirname(__FILE__), 'config/utsup.sample'), global_config_path
47
+
48
+ Yamlize.new global_config_path do |global_config|
49
+ global_config.api_key = api_key
50
+ end
51
+
52
+ puts "Initialized ~/.utsup/config.yml"
53
+
64
54
  else
65
55
  puts "You're good to go."
66
56
  end
@@ -76,18 +66,33 @@ eos
76
66
  project_title = File.basename(Dir.pwd) if project_title.blank? || project_title == "."
77
67
  project = Api::Project.create :title => project_title
78
68
 
79
- project_config_path = File.join(Dir.pwd, PROJECT_CONFIG_PATH)
69
+ # add project id to .git
70
+ Yamlize.new File.join(Dir.pwd, PROJECT_CONFIG_PATH) do |project_config|
71
+ project_config.project_id = project.id
72
+ end
80
73
 
81
- project_config = YAML.load_file(project_config_path) rescue {}
82
- project_config["project_id"] = project.id
83
- File.open(project_config_path,'w'){|f| YAML.dump( project_config, f )}
74
+ # add project path and id to global project config (for differ)
75
+ Yamlize.new GLOBAL_PROJECT_CONFIG_PATH, Array do |global_project_config|
76
+ global_project_config << {'path'=>Dir.pwd, 'id'=>project.id}
77
+ global_project_config.uniq!
78
+ end
84
79
 
85
80
  # --- write git hooks
81
+ #TODO: option to manually add hooks if they already have some...
86
82
  GIT_HOOKS.each do |hook|
87
- File.open(File.join(Dir.pwd, '.git/hooks/', hook), 'w', 0775) do |f|
88
- f.write(File.read(File.join(File.dirname(__FILE__),'hooks',hook)))
83
+ path = File.join(Dir.pwd, '.git/hooks/', hook)
84
+ hook_cmd = File.read(File.join(File.dirname(__FILE__),'hooks',hook))
85
+
86
+ if File.exists?(path)
87
+ puts "You already have a git hook here: #{path}"
88
+ puts "Please make sure it's executable add this to it:"
89
+ puts hook_cmd + "\n"
90
+ next
91
+ end
92
+
93
+ File.open(path, 'w', 0775) do |f|
94
+ f.write hook_cmd
89
95
  end
90
- #TODO: make sure files are executable if already existed
91
96
  end
92
97
 
93
98
  end
@@ -97,17 +102,20 @@ eos
97
102
  # ===========================
98
103
 
99
104
  def configure
100
- global_config_path = File.expand_path(GLOBAL_CONFIG_PATH)
101
- global_config = YAML.load_file(global_config_path)
102
105
 
103
- project_config_path = File.join(Dir.pwd, PROJECT_CONFIG_PATH)
104
- project_config = YAML.load_file(project_config_path) rescue {}
106
+ global_config = Yamlize.new GLOBAL_CONFIG_PATH
107
+ project_config = Yamlize.new(File.join(Dir.pwd, PROJECT_CONFIG_PATH)) rescue {}
108
+ global_project_config = Yamlize.new GLOBAL_PROJECT_CONFIG_PATH
109
+
110
+ unless global_config['api_key']
111
+ puts "You need to run 'sup setup <api_key>' first, thanks!"
112
+ exit 0
113
+ end
105
114
 
106
115
  # --- configure API
107
116
  Api::Base.project_id = project_config['project_id']
108
117
  Api::Base.password = project_config['api_key'] || global_config['api_key']
109
118
  Api::Base.site = "http://#{project_config['domain'] || global_config['domain'] || 'utsup.com'}"
110
-
111
119
  end
112
120
 
113
121
  # ===========================
@@ -218,131 +226,12 @@ eos
218
226
  puts user.to_command_line
219
227
  end
220
228
  end
221
-
222
- end
223
-
224
- # ==============================
225
- # API's
226
- # ==============================
227
-
228
- module Api
229
- class Base < ActiveResource::Base
230
- cattr_accessor :project_id
231
- self.user = "api"
232
- end
233
-
234
- class Status < Base
235
- def self.add(attributes)
236
- unless self.project_id
237
- puts "You're not in a project."
238
- return
239
- end
240
-
241
- create attributes.merge({:project_id => @@project_id, :branch => Sup::current_branch_name})
242
-
243
- rescue ActiveResource::ResourceNotFound
244
- puts "Your project_id was invalid, check #{PROJECT_CONFIG_PATH}"
245
- end
246
- end
247
-
248
- class Project < Base
249
-
250
- end
251
229
 
252
- class User < Base
253
- def self.check_name(name)
254
- begin
255
- get :check_name, :name => name
256
- rescue ActiveResource::ResourceNotFound
257
- false
258
- end
259
- end
230
+ def socket_error
231
+ puts "UtSup? v.#{VERSION} Offline."
260
232
  end
261
- end
262
-
263
- # ==============================
264
- # Command Line Controller
265
- # ==============================
266
-
267
- module Command
268
- class << self
269
- def run(command, args)
270
- bench = Time.now
271
-
272
- # no configure
273
- case command
274
- when "setup":
275
- return Sup::setup
276
- end
277
-
278
- Sup::configure
279
-
280
- case command
281
-
282
- when "help":
283
- puts HELP_TEXT
284
-
285
- when "version":
286
- puts VERSION
287
-
288
- when "init":
289
- Sup::init args.first
290
- puts "Supified!"
291
233
 
292
- when "in":
293
- Sup::check_in args.last
294
- puts "Checked in."
295
- when "out":
296
- Sup::check_out args.last
297
- puts "Checked out."
298
-
299
- # --- Git -----------------
300
- when "git":
301
- Sup::git_update args
302
- when "push":
303
- Sup::git_update "push"
304
-
305
- when "nm":
306
- Sup::undo
307
- puts "Undid last Supdate."
308
-
309
- when "remove":
310
- File.unlink File.join(Dir.pwd, PROJECT_CONFIG_PATH)
311
- # TODO: remove git hooks
312
- puts "De-Supified."
313
-
314
- when "users":
315
- Sup::get_users
316
-
317
- when "all":
318
- Sup::get_statuses :today => true
319
-
320
- when "search":
321
- # TODO: search
322
-
323
- when /.+/:
324
-
325
- # TODO: combine user_name check and supdate into one ActiveResource call -- do name-check & return or supdate on server
326
- if Api::User.check_name(command)
327
- Sup::get_statuses :name => command, :today => true
328
- return
329
- end
330
-
331
- # implicit text update: sup "chillin"
332
- Sup::update command
333
- puts "Supdated."
334
-
335
- else
336
- # full status check
337
- Sup::get_statuses
338
- end
339
-
340
- # TODO: config file option to set verbosity
341
- puts "UtSup? v.#{VERSION} (#{Time.now - bench}s)"
342
- end
343
- end
344
234
  end
345
-
346
235
  end
347
236
 
348
237
 
data/test/test_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  require 'stringio'
2
2
  require 'test/unit'
3
3
  require File.dirname(__FILE__) + '/../lib/sup'
4
+
5
+ # require 'ruby-debug'
@@ -0,0 +1,94 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestYamler < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @test_path = File.join(File.dirname(__FILE__),"yamler_test.yml")
7
+ @test_path2 = File.join(File.dirname(__FILE__),"yamler_test2.yml")
8
+ end
9
+
10
+ def teardown
11
+ File.unlink @test_path if File.exists?(@test_path)
12
+ File.unlink @test_path2 if File.exists?(@test_path2)
13
+ end
14
+
15
+ def test_init
16
+ Yamler.new @test_path
17
+ assert File.exists?(@test_path)
18
+ end
19
+
20
+ def test_setter
21
+ @obj = Yamler.new @test_path
22
+ @obj.name = "nick merwin"
23
+ @obj.title = "programmer"
24
+
25
+ assert_equal "nick merwin", @obj.name
26
+ assert_equal "programmer", @obj.title
27
+
28
+ assert_equal "nick merwin", @obj['name']
29
+ assert_equal "programmer", @obj['title']
30
+
31
+ begin
32
+ @obj.blah
33
+ rescue
34
+ assert_equal NoMethodError, $!.class
35
+ end
36
+ end
37
+
38
+ def test_save
39
+ @obj = Yamler.new @test_path
40
+ @obj.name = "nick merwin"
41
+
42
+ @obj.save
43
+
44
+ @obj2 = Yamler.new @test_path
45
+ assert_equal "nick merwin", @obj2.name
46
+ end
47
+
48
+ def test_block
49
+ Yamler.new @test_path do |obj|
50
+ obj.name = "nick merwin"
51
+ end
52
+
53
+ @obj = Yamler.new @test_path
54
+ assert_equal "nick merwin", @obj.name
55
+ end
56
+
57
+ def test_type
58
+ @obj = Yamler.new @test_path
59
+ assert_equal Hash, @obj.attributes.class
60
+
61
+ @obj2 = Yamler.new @test_path2, Array
62
+ assert_equal Array, @obj2.attributes.class
63
+
64
+ @obj2 << 1
65
+ assert_equal 1, @obj2.first
66
+ end
67
+
68
+ def test_yamlize_array
69
+ a = [].yamlize @test_path
70
+
71
+ a << 1
72
+ a.save
73
+
74
+ # test some array functions
75
+ b = [].yamlize @test_path
76
+ assert_equal 1, b.first
77
+ assert_equal [2], b.map{|i| i+1}
78
+
79
+ b << 1
80
+ b.uniq!
81
+ assert_equal [1], b.attributes
82
+ end
83
+
84
+ def test_yamlize_hash
85
+ a = {}.yamlize @test_path
86
+
87
+ a.first = 1
88
+ a.save
89
+
90
+ b = {}.yamlize @test_path
91
+ assert_equal 1, b.first
92
+ end
93
+
94
+ end
metadata CHANGED
@@ -1,36 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utsup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Merwin
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIDNDCCAhygAwIBAgIBADANBgkqhkiG9w0BAQUFADBAMQ0wCwYDVQQDDARuaWNr
14
- MRowGAYKCZImiZPyLGQBGRYKbGVtdXJoZWF2eTETMBEGCgmSJomT8ixkARkWA2Nv
15
- bTAeFw0wOTA5MjkyMzEzMDVaFw0xMDA5MjkyMzEzMDVaMEAxDTALBgNVBAMMBG5p
16
- Y2sxGjAYBgoJkiaJk/IsZAEZFgpsZW11cmhlYXZ5MRMwEQYKCZImiZPyLGQBGRYD
17
- Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3uflg3FiN5qVj79C
18
- hL+IdQJI+t1bGLrcx38cgFk9wzsBWb4OuGJdfRfUputDQ1f0q+tmRO834YuiEzq9
19
- Ekhv8GMQ4KepU6E6d1mbBVSovuDljxpprGDP1Aj/ahiG4vU26gE9IjNFxwlkRPov
20
- jVgUNVU2iXtd7pAM3EeEIzSFXfoTOGl1sk6UXMlMRyD6rkuIHiM08+7Q6UMdkO49
21
- fMqF49DeMrlJfY4HBbegAF4dpWNY3SPhFWtOcdtCRF0AplB7HtR5laBsAdHjz3gM
22
- klk+KNM5vptxWJPIqvXWS4pPudBCwz40gXRGR+BpU0UQiTqp1FiKCgL7DI4/Tm62
23
- CHNMvwIDAQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
24
- DtwNA5H16pAiznZOti8bEjba8tUwDQYJKoZIhvcNAQEFBQADggEBALYguz5G0/OJ
25
- xT+pCJlgQuU5XbKPx9dibev3ixqDaXz6F3rofNyskUGuCz80pIxwuVjsf7SC/l6x
26
- iSqV4RZvqrQvgMa2VIQrbIfVya59CyFl+nlENev58nSZHo/3+AOK/rCLrvyRbv+y
27
- NZocOuJdRiSWjnnRga8ccYA/Hu5OQsqUi3zWcZJx9Pf1yik/TGQBB5fVCg3wc/tT
28
- 86mx1YMM5+6jp62bpABA/ztg5a1AwPjLztZO+kdsa5JPAe8kEORjgFUQd0bgoG1k
29
- CGOLg0n36R4a1G+c6Meu9GeNGECbxY/1lzZOU9gfTqKd3DB+14BvAyvc5dTbR/RX
30
- DrswbWvrKlA=
31
- -----END CERTIFICATE-----
10
+ cert_chain: []
32
11
 
33
- date: 2009-10-21 00:00:00 -07:00
12
+ date: 2009-10-31 00:00:00 -07:00
34
13
  default_executable:
35
14
  dependencies:
36
15
  - !ruby/object:Gem::Dependency
@@ -43,6 +22,16 @@ dependencies:
43
22
  - !ruby/object:Gem::Version
44
23
  version: "0"
45
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: daemons
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
46
35
  - !ruby/object:Gem::Dependency
47
36
  name: hoe
48
37
  type: :development
@@ -51,7 +40,7 @@ dependencies:
51
40
  requirements:
52
41
  - - ">="
53
42
  - !ruby/object:Gem::Version
54
- version: 2.3.3
43
+ version: 2.3.2
55
44
  version:
56
45
  description: utsup.com client
57
46
  email:
@@ -77,16 +66,29 @@ files:
77
66
  - lib/hooks/post-merge
78
67
  - lib/hooks/post-receive
79
68
  - lib/sup.rb
69
+ - lib/sup/differ/differ_control.rb
70
+ - lib/sup/differ/differ_run.rb
71
+ - lib/sup/differ/differ.rb
72
+ - lib/sup/yamlize.rb
73
+ - lib/sup/command.rb
74
+ - lib/sup/help.rb
75
+ - lib/sup/api.rb
80
76
  - script/console
81
77
  - script/destroy
82
78
  - script/generate
83
79
  - test/test_helper.rb
84
80
  - test/test_sup.rb
81
+ - test/test_yamler.rb
85
82
  has_rdoc: true
86
- homepage: http://github.com/yickster/utsup
83
+ homepage: http://github.com/yickster/utsup_gem
87
84
  licenses: []
88
85
 
89
- post_install_message: Add your api key to ~/.utsup
86
+ post_install_message: "=======================================\n\
87
+ UtSup Installed!\n\
88
+ =======================================\n\n\
89
+ Be sure to sign up for an account at http://utsup.com\n\n\
90
+ Then, to begin using, first run:\n\n sup setup <your-api-key>\n\n\
91
+ Thanks for using UtSup!\n - Lemur Heavy Industries (http://lemurheavy.com)\n "
90
92
  rdoc_options: []
91
93
 
92
94
  require_paths:
@@ -106,10 +108,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
108
  requirements: []
107
109
 
108
110
  rubyforge_project: utsup
109
- rubygems_version: 1.3.4
111
+ rubygems_version: 1.3.5
110
112
  signing_key:
111
113
  specification_version: 3
112
114
  summary: utsup.com client
113
115
  test_files:
114
116
  - test/test_helper.rb
115
117
  - test/test_sup.rb
118
+ - test/test_yamler.rb
data.tar.gz.sig DELETED
Binary file
metadata.gz.sig DELETED
Binary file