utsup 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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