barron 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/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,151 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rdoc'
4
+ require 'date'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
7
+
8
+ #############################################################################
9
+ #
10
+ # Helper functions
11
+ #
12
+ #############################################################################
13
+
14
+ def name
15
+ @name ||= Dir['*.gemspec'].first.split('.').first
16
+ end
17
+
18
+ def version
19
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
20
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
21
+ end
22
+
23
+ def date
24
+ Date.today.to_s
25
+ end
26
+
27
+ def rubyforge_project
28
+ name
29
+ end
30
+
31
+ def gemspec_file
32
+ "#{name}.gemspec"
33
+ end
34
+
35
+ def gem_file
36
+ "#{name}-#{version}.gem"
37
+ end
38
+
39
+ def replace_header(head, header_name)
40
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
41
+ end
42
+
43
+ #############################################################################
44
+ #
45
+ # Standard tasks
46
+ #
47
+ #############################################################################
48
+
49
+ task :default => [:test, :features]
50
+
51
+ require 'rake/testtask'
52
+ Rake::TestTask.new(:test) do |test|
53
+ if `which pygmentize` == ''
54
+ puts "You must have Pygments installed to run the tests."
55
+ exit 1
56
+ end
57
+ test.libs << 'lib' << 'test'
58
+ test.pattern = 'test/**/test_*.rb'
59
+ test.verbose = true
60
+ end
61
+
62
+ desc "Generate RCov test coverage and open in your browser"
63
+ task :coverage do
64
+ require 'rcov'
65
+ sh "rm -fr coverage"
66
+ sh "rcov test/test_*.rb"
67
+ sh "open coverage/index.html"
68
+ end
69
+
70
+ require 'rdoc/task'
71
+ Rake::RDocTask.new do |rdoc|
72
+ rdoc.rdoc_dir = 'rdoc'
73
+ rdoc.title = "#{name} #{version}"
74
+ rdoc.rdoc_files.include('README*')
75
+ rdoc.rdoc_files.include('lib/**/*.rb')
76
+ end
77
+
78
+ desc "Open an irb session preloaded with this library"
79
+ task :console do
80
+ sh "irb -rubygems -r ./lib/#{name}.rb"
81
+ end
82
+
83
+ #############################################################################
84
+ #
85
+ # Custom tasks (add your own tasks here)
86
+ #
87
+ #############################################################################
88
+
89
+ begin
90
+ require 'cucumber/rake/task'
91
+ Cucumber::Rake::Task.new(:features) do |t|
92
+ t.cucumber_opts = "--format progress"
93
+ end
94
+ rescue LoadError
95
+ desc 'Cucumber rake task not available'
96
+ task :features do
97
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
98
+ end
99
+ end
100
+
101
+ #############################################################################
102
+ #
103
+ # Packaging tasks
104
+ #
105
+ #############################################################################
106
+
107
+ task :release => :build do
108
+ unless `git branch` =~ /^\* master$/
109
+ puts "You must be on the master branch to release!"
110
+ exit!
111
+ end
112
+ sh "git commit --allow-empty -m 'Release #{version}'"
113
+ sh "git tag v#{version}"
114
+ sh "git push origin master"
115
+ sh "git push origin v#{version}"
116
+ sh "gem push pkg/#{name}-#{version}.gem"
117
+ end
118
+
119
+ task :build => :gemspec do
120
+ sh "mkdir -p pkg"
121
+ sh "gem build #{gemspec_file}"
122
+ sh "mv #{gem_file} pkg"
123
+ end
124
+
125
+ task :gemspec do
126
+ # read spec file and split out manifest section
127
+ spec = File.read(gemspec_file)
128
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
129
+
130
+ # replace name version and date
131
+ replace_header(head, :name)
132
+ replace_header(head, :version)
133
+ replace_header(head, :date)
134
+ #comment this out if your rubyforge_project has a different name
135
+ # replace_header(head, :rubyforge_project)
136
+
137
+ # determine file list from git ls-files
138
+ files = `git ls-files`.
139
+ split("\n").
140
+ sort.
141
+ reject { |file| file =~ /^\./ }.
142
+ reject { |file| file =~ /^(rdoc|pkg|coverage)/ }.
143
+ map { |file| " #{file}" }.
144
+ join("\n")
145
+
146
+ # piece file back together and write
147
+ manifest = " s.files = %w[\n#{files}\n ]\n"
148
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
149
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
150
+ puts "Updated #{gemspec_file}"
151
+ end
data/barron.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ Gem::Specification.new do |s|
2
+ s.specification_version = 2 if s.respond_to? :specification_version=
3
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
+ s.rubygems_version = '1.3.5'
5
+
6
+ s.name = 'barron'
7
+ s.version = '0.1.0'
8
+ s.date = '2012-01-04'
9
+
10
+ s.summary = "Barron helps you with locking"
11
+ s.description = "Barron uses file-system locks, but eventually configurable backends would be nice. Robert Barron patented a double-acting tumbler lock in 1778."
12
+
13
+ s.authors = ["Matthew Beale"]
14
+ s.email = 'matt.beale@madhatted.com'
15
+ s.homepage = 'http://github.com/mixonic/barron'
16
+
17
+ s.require_paths = %w[lib]
18
+
19
+ s.executables = ["barron"]
20
+
21
+ s.rdoc_options = ["--charset=UTF-8"]
22
+ s.extra_rdoc_files = %w[]
23
+
24
+ s.add_development_dependency('rake', "~> 0.9")
25
+ s.add_development_dependency('rdoc', "~> 3.11")
26
+
27
+ # = MANIFEST =
28
+ s.files = %w[
29
+ Gemfile
30
+ Rakefile
31
+ barron.gemspec
32
+ bin/barron
33
+ lib/barron.rb
34
+ lib/barron/tmpfile.rb
35
+ ]
36
+ # = MANIFEST =
37
+
38
+ s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
39
+ end
data/bin/barron ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
+
5
+ help = <<HELP
6
+ Barron uses filesystem locks, but provides an identical
7
+ backend across a Ruby process (via gem) and the command-line.
8
+
9
+ Basic Command Line Usage:
10
+ # Return success if available, error if not
11
+ barron "locked-resource"
12
+ # Block until the resource is free
13
+ barron "locked-resource" --block
14
+
15
+ Other options follow:
16
+
17
+ HELP
18
+
19
+ require 'optparse'
20
+ require 'barron'
21
+
22
+ resource = nil
23
+ options = {
24
+ :block => false
25
+ }
26
+ opts = OptionParser.new do |opts|
27
+ opts.banner = help
28
+
29
+ opts.on("--tmpdir [DIRECTORY]", "Where to write the lockfiles") do |directory|
30
+ options[:tmpdir] = directory unless directory.nil?
31
+ end
32
+
33
+ opts.on("--block", "If barron should block until the lock is released") do
34
+ options[:block] = true
35
+ end
36
+
37
+ opts.on("--version", "Display current version") do
38
+ puts "Spinto " + Spinto::VERSION
39
+ exit 0
40
+ end
41
+ end
42
+
43
+ # Read command line options into `options` hash
44
+ opts.parse!
45
+
46
+
47
+ # Get source and destintation from command line
48
+ case ARGV.size
49
+ when 1
50
+ resource = ARGV[0]
51
+ else
52
+ puts "Invalid options. Run `barron --help` for assistance."
53
+ exit(1)
54
+ end
55
+
56
+ # Fire the lock, return success if it is free,
57
+ # or hang until it is free.
58
+ Barron.lock resource, options do
59
+ $stdout.puts "Requested resource is free."
60
+ exit(0)
61
+ end
62
+
63
+ # Unless barron was told to hang, we will pass
64
+ # through to here when barron cannot get a lock.
65
+ # So return failue.
66
+ $stderr.puts "Requested resource is being used."
67
+ exit(1)
data/lib/barron.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Barron
2
+ require 'barron/tmpfile'
3
+
4
+ VERSION = '0.1.0'
5
+
6
+ def lock *args, &block
7
+ Barron.lock *args, &block
8
+ end
9
+
10
+ class << self
11
+
12
+ def lock *args, &block
13
+ Barron::Tmpfile.lock *args, &block
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,30 @@
1
+ module Barron::Tmpfile
2
+
3
+ require 'digest/md5'
4
+
5
+ class << self
6
+
7
+ def lock name, options={}
8
+ options = {
9
+ :block => true,
10
+ :tmpdir => '/tmp'
11
+ }.merge(options)
12
+ value = nil
13
+ open("#{options[:tmpdir]}/barron-#{Digest::MD5.hexdigest("#{name}")}", File::RDWR|File::CREAT, 0666) do |f|
14
+ begin
15
+ if options[:block]
16
+ f.flock(File::LOCK_EX)
17
+ value = yield f
18
+ elsif f.flock(File::LOCK_EX|File::LOCK_NB)
19
+ value = yield f
20
+ end
21
+ ensure
22
+ f.flock(File::LOCK_UN)
23
+ end
24
+ end
25
+ value
26
+ end
27
+
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: barron
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Matthew Beale
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-01-04 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ prerelease: false
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 25
28
+ segments:
29
+ - 0
30
+ - 9
31
+ version: "0.9"
32
+ type: :development
33
+ requirement: *id001
34
+ name: rake
35
+ - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ hash: 17
43
+ segments:
44
+ - 3
45
+ - 11
46
+ version: "3.11"
47
+ type: :development
48
+ requirement: *id002
49
+ name: rdoc
50
+ description: Barron uses file-system locks, but eventually configurable backends would be nice. Robert Barron patented a double-acting tumbler lock in 1778.
51
+ email: matt.beale@madhatted.com
52
+ executables:
53
+ - barron
54
+ extensions: []
55
+
56
+ extra_rdoc_files: []
57
+
58
+ files:
59
+ - Gemfile
60
+ - Rakefile
61
+ - barron.gemspec
62
+ - bin/barron
63
+ - lib/barron.rb
64
+ - lib/barron/tmpfile.rb
65
+ homepage: http://github.com/mixonic/barron
66
+ licenses: []
67
+
68
+ post_install_message:
69
+ rdoc_options:
70
+ - --charset=UTF-8
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ required_rubygems_version: !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
+ requirements: []
92
+
93
+ rubyforge_project:
94
+ rubygems_version: 1.8.13
95
+ signing_key:
96
+ specification_version: 2
97
+ summary: Barron helps you with locking
98
+ test_files: []
99
+