tsafe 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f4f86e8634d75137b3cc4e0028ea91ecd817b3bb
4
+ data.tar.gz: a808258388e5f91e46968714eb244f9441d32923
5
+ SHA512:
6
+ metadata.gz: 5e1cd00910e7af20774471c76ba8458ff24534cfa466b31ad94bccfc6c5396cbada12771423f9fa0469e89f0450ecae6ecca8c2c392af87998261fa9185031c7
7
+ data.tar.gz: 02b4accddafaf35f3aceb98bf309bdccd58c67361ed41ebc0be2e146e98971c8e03965ede29d70785165aabc22f5cfd002ef70cc8701190024b61abb3b32bf8c
@@ -0,0 +1,73 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ DisplayCopNames: true
5
+ DisplayStyleGuide: true
6
+ Exclude:
7
+ - tsafe.gemspec
8
+
9
+ # https://github.com/AtomLinter/linter-rubocop/issues/2
10
+ Style/FileName:
11
+ Enabled: false
12
+
13
+ # Metrics/LineLength:
14
+ # Max: 160
15
+
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+
19
+ Metrics/AbcSize:
20
+ Max: 25
21
+
22
+ Metrics/ClassLength:
23
+ Max: 250
24
+
25
+ Style/AccessModifierIndentation:
26
+ EnforcedStyle: outdent
27
+
28
+ Style/AlignParameters:
29
+ EnforcedStyle: with_fixed_indentation
30
+
31
+ Style/ClassAndModuleChildren:
32
+ EnforcedStyle: compact
33
+
34
+ Style/ConditionalAssignment:
35
+ Enabled: false
36
+
37
+ Style/Documentation:
38
+ Enabled: false
39
+
40
+ Style/EmptyLines:
41
+ Enabled: false
42
+
43
+ Style/MultilineMethodCallIndentation:
44
+ EnforcedStyle: indented
45
+
46
+ Style/MultilineOperationIndentation:
47
+ EnforcedStyle: indented
48
+
49
+ Style/StringLiterals:
50
+ EnforcedStyle: double_quotes
51
+
52
+ Style/StringLiteralsInInterpolation:
53
+ Enabled: false
54
+
55
+ Style/NilComparison:
56
+ Enabled: false
57
+
58
+ Style/SignalException:
59
+ EnforcedStyle: only_raise
60
+
61
+ Style/MultilineOperationIndentation:
62
+ EnforcedStyle: indented
63
+
64
+ Style/SpaceInsideHashLiteralBraces:
65
+ EnforcedStyle: no_space
66
+
67
+ Style/TrivialAccessors:
68
+ ExactNameMatch: true
69
+ Enabled: true
70
+
71
+ # Disabled on purpose: https://github.com/bbatsov/rubocop/issues/1758
72
+ Style/ClosingParenthesisIndentation:
73
+ Enabled: false
@@ -0,0 +1,18 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2016-02-08 11:42:03 +0100 using RuboCop version 0.37.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 7
10
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
11
+ # URISchemes: http, https
12
+ Metrics/LineLength:
13
+ Max: 298
14
+
15
+ # Offense count: 1
16
+ Style/ClassAndModuleCamelCase:
17
+ Exclude:
18
+ - 'lib/tsafe_mrswlock_synmodule.rb'
data/Gemfile CHANGED
@@ -10,4 +10,6 @@ group :development do
10
10
  gem "rdoc", "~> 3.12"
11
11
  gem "bundler", ">= 1.0.0"
12
12
  gem "jeweler", "~> 1.8.3"
13
+ gem "best_practice_project", github: "kaspernj/best_practice_project", require: false
14
+ gem "rubocop", "0.37.0", require: false
13
15
  end
@@ -1,17 +1,61 @@
1
+ GIT
2
+ remote: git://github.com/kaspernj/best_practice_project.git
3
+ revision: 9c747dd3b66ee18010c6f5c839e05c36452d44ea
4
+ specs:
5
+ best_practice_project (0.0.9)
6
+ auto_autoloader
7
+
1
8
  GEM
2
9
  remote: http://rubygems.org/
3
10
  specs:
11
+ addressable (2.4.0)
12
+ ast (2.2.0)
13
+ auto_autoloader (0.0.4)
14
+ string-cases
15
+ builder (3.2.2)
4
16
  diff-lcs (1.1.3)
5
- git (1.2.5)
6
- jeweler (1.8.4)
17
+ faraday (0.8.11)
18
+ multipart-post (~> 1.2.0)
19
+ git (1.2.9.1)
20
+ github_api (0.10.1)
21
+ addressable
22
+ faraday (~> 0.8.1)
23
+ hashie (>= 1.2)
24
+ multi_json (~> 1.4)
25
+ nokogiri (~> 1.5.2)
26
+ oauth2
27
+ hashie (3.4.3)
28
+ highline (1.7.8)
29
+ jeweler (1.8.8)
30
+ builder
7
31
  bundler (~> 1.0)
8
32
  git (>= 1.2.5)
33
+ github_api (= 0.10.1)
34
+ highline (>= 1.6.15)
35
+ nokogiri (= 1.5.10)
9
36
  rake
10
37
  rdoc
11
- json (1.7.3)
12
- json (1.7.3-java)
13
- rake (0.9.2.2)
14
- rdoc (3.12)
38
+ json (1.8.3)
39
+ json (1.8.3-java)
40
+ jwt (1.5.1)
41
+ multi_json (1.11.2)
42
+ multi_xml (0.5.5)
43
+ multipart-post (1.2.0)
44
+ nokogiri (1.5.10)
45
+ nokogiri (1.5.10-java)
46
+ oauth2 (1.1.0)
47
+ faraday (>= 0.8, < 0.10)
48
+ jwt (~> 1.0, < 1.5.2)
49
+ multi_json (~> 1.3)
50
+ multi_xml (~> 0.5)
51
+ rack (>= 1.2, < 3)
52
+ parser (2.3.0.3)
53
+ ast (~> 2.2)
54
+ powerpack (0.1.1)
55
+ rack (1.6.4)
56
+ rainbow (2.1.0)
57
+ rake (10.5.0)
58
+ rdoc (3.12.2)
15
59
  json (~> 1.4)
16
60
  rspec (2.8.0)
17
61
  rspec-core (~> 2.8.0)
@@ -21,13 +65,27 @@ GEM
21
65
  rspec-expectations (2.8.0)
22
66
  diff-lcs (~> 1.1.2)
23
67
  rspec-mocks (2.8.0)
68
+ rubocop (0.37.0)
69
+ parser (>= 2.3.0.2, < 3.0)
70
+ powerpack (~> 0.1)
71
+ rainbow (>= 1.99.1, < 3.0)
72
+ ruby-progressbar (~> 1.7)
73
+ unicode-display_width (~> 0.3)
74
+ ruby-progressbar (1.7.5)
75
+ string-cases (0.0.4)
76
+ unicode-display_width (0.3.1)
24
77
 
25
78
  PLATFORMS
26
79
  java
27
80
  ruby
28
81
 
29
82
  DEPENDENCIES
83
+ best_practice_project!
30
84
  bundler (>= 1.0.0)
31
85
  jeweler (~> 1.8.3)
32
86
  rdoc (~> 3.12)
33
87
  rspec (~> 2.8.0)
88
+ rubocop (= 0.37.0)
89
+
90
+ BUNDLED WITH
91
+ 1.11.2
@@ -1,9 +1,9 @@
1
- = tsafe
1
+ = Tsafe
2
2
 
3
- Description goes here.
3
+ Various classes for thread safe operations in Ruby and JRuby.
4
4
 
5
5
  == Contributing to tsafe
6
-
6
+
7
7
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
8
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
9
  * Fork the project.
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'rubygems'
4
- require 'bundler'
3
+ require "rubygems"
4
+ require "bundler"
5
5
  begin
6
6
  Bundler.setup(:default, :development)
7
7
  rescue Bundler::BundlerError => e
@@ -9,41 +9,44 @@ rescue Bundler::BundlerError => e
9
9
  $stderr.puts "Run `bundle install` to install missing gems"
10
10
  exit e.status_code
11
11
  end
12
- require 'rake'
12
+ require "rake"
13
13
 
14
- require 'jeweler'
14
+ require "jeweler"
15
15
  Jeweler::Tasks.new do |gem|
16
16
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
17
  gem.name = "tsafe"
18
18
  gem.homepage = "http://github.com/kaspernj/tsafe"
19
19
  gem.license = "MIT"
20
- gem.summary = %Q{Threadsafe proxy, array, hash and framework for making other classes threadsafe.}
21
- gem.description = %Q{Proxy-objects for making another object threadsafe by proxying calls through mutex and method_missing. Monitored array and hash where all methods are going through monitor. Threadsafe class for including into a class that extends another class in order to make it threadsafe.}
20
+ gem.summary = %(Threadsafe proxy, array, hash and framework for making other classes threadsafe.)
21
+ gem.description = %(Proxy-objects for making another object threadsafe by proxying calls through mutex and method_missing. Monitored array and hash where all methods are going through monitor. Threadsafe class for including into a class that extends another class in order to make it threadsafe.)
22
22
  gem.email = "k@spernj.org"
23
23
  gem.authors = ["Kasper Johansen"]
24
24
  # dependencies defined in Gemfile
25
25
  end
26
26
  Jeweler::RubygemsDotOrgTasks.new
27
27
 
28
- require 'rspec/core'
29
- require 'rspec/core/rake_task'
28
+ require "rspec/core"
29
+ require "rspec/core/rake_task"
30
30
  RSpec::Core::RakeTask.new(:spec) do |spec|
31
- spec.pattern = FileList['spec/**/*_spec.rb']
31
+ spec.pattern = FileList["spec/**/*_spec.rb"]
32
32
  end
33
33
 
34
34
  RSpec::Core::RakeTask.new(:rcov) do |spec|
35
- spec.pattern = 'spec/**/*_spec.rb'
35
+ spec.pattern = "spec/**/*_spec.rb"
36
36
  spec.rcov = true
37
37
  end
38
38
 
39
- task :default => :spec
39
+ task default: :spec
40
40
 
41
- require 'rdoc/task'
41
+ require "rdoc/task"
42
42
  Rake::RDocTask.new do |rdoc|
43
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
43
+ version = File.exist?("VERSION") ? File.read("VERSION") : ""
44
44
 
45
- rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.rdoc_dir = "rdoc"
46
46
  rdoc.title = "tsafe #{version}"
47
- rdoc.rdoc_files.include('README*')
48
- rdoc.rdoc_files.include('lib/**/*.rb')
47
+ rdoc.rdoc_files.include("README*")
48
+ rdoc.rdoc_files.include("lib/**/*.rb")
49
49
  end
50
+
51
+ require "best_practice_project"
52
+ BestPracticeProject.load_tasks
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.11
1
+ 0.0.12
@@ -1,24 +1,24 @@
1
1
  require "monitor"
2
2
 
3
- #This module contains various tools to handle thread-safety easily and pretty.
3
+ # This module contains various tools to handle thread-safety easily and pretty.
4
4
  module Tsafe
5
- #Autoloader for subclasses.
5
+ # Autoloader for subclasses.
6
6
  def self.const_missing(name)
7
- filep = "#{File.dirname(__FILE__)}/tsafe_#{name.to_s.downcase}"
8
-
9
- if RUBY_ENGINE == "jruby" and File.exists?("#{filep}_jruby.rb")
10
- require "#{filep}_jruby.rb"
7
+ file_path = "#{File.dirname(__FILE__)}/tsafe_#{name.to_s.downcase}"
8
+
9
+ if RUBY_ENGINE == "jruby" && File.exist?("#{file_path}_jruby.rb")
10
+ require "#{file_path}_jruby.rb"
11
11
  else
12
- require filep
12
+ require file_path
13
13
  end
14
-
15
- raise "Still not loaded: '#{name}'." if !Tsafe.const_defined?(name)
16
- return Tsafe.const_get(name)
14
+
15
+ return Tsafe.const_get(name) if Tsafe.const_defined?(name)
16
+ super
17
17
  end
18
-
19
- #JRuby can corrupt an array in a threadded env. Use this method to only get a synchronized array when running JRuby in order to not having to write "if RUBY_ENGINE"-stuff.
18
+
19
+ # JRuby can corrupt an array in a threadded env. Use this method to only get a synchronized array when running JRuby in order to not having to write "if RUBY_ENGINE"-stuff.
20
20
  def self.std_array
21
21
  return Tsafe::MonArray.new if RUBY_ENGINE == "jruby"
22
- return []
22
+ []
23
23
  end
24
- end
24
+ end
@@ -1,12 +1,14 @@
1
- #Predefined synchronized array.
1
+ # Predefined synchronized array.
2
2
  #
3
3
  #===Examples
4
4
  # arr = Tsafe::MonArray.new
5
5
  # arr << 5
6
6
  # ret = arr[0]
7
7
  class Tsafe::MonArray < ::Array
8
+ # rubocop:disable Style/ClassVars
8
9
  @@tsafe_mrswlock_w_methods = [:<<, :collect, :collect!, :compact!, :delete, :delete_at, :delete_if, :drop, :drop_while, :fill, :flatten!, :insert, :keep_if, :map, :map!, :replace, :shuffle!, :slice!, :shift, :sort!, :sort_by!, :unshift]
9
10
  @@tsafe_mrswlock_r_methods = [:each, :each_index, :take_while]
10
-
11
+ # rubocop:enable Style/ClassVars
12
+
11
13
  include Tsafe::Mrswlock_synmodule
12
- end
14
+ end
@@ -1,12 +1,14 @@
1
- #Predefined synchronized hash.
1
+ # Predefined synchronized hash.
2
2
  #
3
3
  #===Examples
4
4
  # h = Tsafe::MonHash.new
5
5
  # h['test'] = 'trala'
6
6
  # ret = h['test']
7
7
  class Tsafe::MonHash < ::Hash
8
+ # rubocop:disable Style/ClassVars
8
9
  @@tsafe_mrswlock_w_methods = [:[]=, :clear, :delete, :delete_if, :keep_if, :merge!, :rehash, :reject!, :replace, :select!, :shift, :store, :update, :values_at]
9
10
  @@tsafe_mrswlock_r_methods = [:each, :each_key, :each_pair, :each_value]
10
-
11
+ # rubocop:enable Style/ClassVars
12
+
11
13
  include Tsafe::Mrswlock_synmodule
12
- end
14
+ end
@@ -1,4 +1,4 @@
1
- #This module can be included on a class to make all method-calls synchronized (by using monitor). Examples with array and hash are below.
1
+ # This module can be included on a class to make all method-calls synchronized (by using monitor). Examples with array and hash are below.
2
2
  #
3
3
  #===Examples
4
4
  # class MySyncedClass < SomeOtherClassThatNeedsToBeSynchronized
@@ -7,23 +7,23 @@
7
7
  module Tsafe::Monitored
8
8
  def self.included(base)
9
9
  base.to_s.split("::").inject(Object, :const_get).class_eval do
10
- self.instance_methods.each do |method_name|
11
- #These two methods create warnings under JRuby.
10
+ instance_methods.each do |method_name|
11
+ # These two methods create warnings under JRuby.
12
12
  if RUBY_ENGINE == "jruby"
13
- next if method_name == :instance_exec or method_name == :instance_eval
13
+ next if method_name == :instance_exec || method_name == :instance_eval
14
14
  end
15
-
15
+
16
16
  new_method_name = "_ts_#{method_name}"
17
17
  alias_method(new_method_name, method_name)
18
-
18
+
19
19
  define_method method_name do |*args, &block|
20
- #Need to use monitor, since the internal calls might have to run not-synchronized, and we have just overwritten the internal methods.
21
- @_ts_mutex = Monitor.new if !@_ts_mutex
20
+ # Need to use monitor, since the internal calls might have to run not-synchronized, and we have just overwritten the internal methods.
21
+ @_ts_mutex = Monitor.new unless @_ts_mutex
22
22
  @_ts_mutex.synchronize do
23
- return self._ts___send__(new_method_name, *args, &block)
23
+ return _ts___send__(new_method_name, *args, &block)
24
24
  end
25
25
  end
26
26
  end
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -7,70 +7,66 @@ class Tsafe::Mrswlock
7
7
  @reads = 0
8
8
  @w_mutex = Mutex.new
9
9
  @threads_read_stopped = []
10
-
11
- #This variable is used to allow reads from the writing thread (monitor-behavior).
10
+
11
+ # This variable is used to allow reads from the writing thread (monitor-behavior).
12
12
  @locked_by = nil
13
-
14
- #This hash holds thread-IDs for threads that are reading.
13
+
14
+ # This hash holds thread-IDs for threads that are reading.
15
15
  @reading_threads = {}
16
16
  end
17
-
17
+
18
18
  # Runs the given block through the read-synchronization.
19
19
  def rsync
20
20
  begin
21
- begin
22
- tid = Thread.current.__id__
23
-
24
- while @w_mutex.locked? and @locked_by != tid
25
- @threads_read_stopped << Thread.current
26
- Thread.stop
27
- end
28
-
29
- @threads_read_stopped.delete(Thread.current)
30
- @reading_threads[tid] = true
31
- @reads += 1
32
- yield
33
- ensure
34
- @reading_threads.delete(tid)
35
- @reads -= 1
21
+ tid = Thread.current.__id__
22
+
23
+ while @w_mutex.locked? && @locked_by != tid
24
+ @threads_read_stopped << Thread.current
25
+ Thread.stop
36
26
  end
27
+
28
+ @threads_read_stopped.delete(Thread.current)
29
+ @reading_threads[tid] = true
30
+ @reads += 1
31
+ yield
37
32
  ensure
38
- #Restart stopped writing-thread.
39
- @threads_write_stopped.run if @threads_write_stopped and @reads <= 0
33
+ @reading_threads.delete(tid)
34
+ @reads -= 1
40
35
  end
36
+ ensure
37
+ # Restart stopped writing-thread.
38
+ @threads_write_stopped.run if @threads_write_stopped && @reads <= 0
41
39
  end
42
-
43
- #Runs the given block through the write-synchronization (locks both reading and writing).
40
+
41
+ # Runs the given block through the write-synchronization (locks both reading and writing).
44
42
  #===Examples
45
43
  # lock.wsync do
46
44
  # #do something within lock.
47
45
  # end
48
46
  def wsync
49
- begin
50
- @w_mutex.synchronize do
51
- begin
52
- tid = Thread.current.__id__
53
- @locked_by = tid
54
-
55
- #Wait for any reads to finish that might have started while we were getting the lock.
56
- #Also allow write if there is only one reading thread and that reading thread is the current thread.
57
- while @reads > 0
58
- raise ThreadError, "Deadlock: Writing is not allowed while reading." if @reading_threads.key?(tid)
59
- @threads_write_stopped = Thread.current
60
- Thread.stop
61
- end
62
-
63
- yield
64
- ensure
65
- @locked_by = nil
66
- @threads_write_stopped = nil
47
+ @w_mutex.synchronize do
48
+ begin
49
+ tid = Thread.current.__id__
50
+ @locked_by = tid
51
+
52
+ # Wait for any reads to finish that might have started while we were getting the lock.
53
+ # Also allow write if there is only one reading thread and that reading thread is the current thread.
54
+ while @reads > 0
55
+ raise ThreadError, "Deadlock: Writing is not allowed while reading." if @reading_threads.key?(tid)
56
+ @threads_write_stopped = Thread.current
57
+ Thread.stop
67
58
  end
59
+
60
+ yield
61
+ ensure
62
+ @locked_by = nil
63
+ @threads_write_stopped = nil
68
64
  end
69
- ensure
70
- #Restart any stopped reading-threads.
71
- while thread = @threads_read_stopped.shift
72
- thread.run
73
- end
65
+ end
66
+ ensure
67
+ # Restart any stopped reading-threads.
68
+ while (thread = @threads_read_stopped.shift)
69
+ thread.run
74
70
  end
75
71
  end
76
- end
72
+ end