senotrusov-ruby-xml-mapper 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,46 @@
1
+
2
+ # Copyright 2008-2009 Stanislav Senotrusov <senotrusov@gmail.com>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ class RubyXmlMapper::FileCache
17
+ def initialize
18
+ @items = {}
19
+ @mutex = Mutex.new
20
+ end
21
+
22
+ def get filename, &block
23
+ @mutex.synchronize do
24
+ @items[filename] ||= RubyXmlMapper::FileCacheItem.new(filename)
25
+ end
26
+
27
+ @items[filename].get &block
28
+ end
29
+
30
+ def any_changes?
31
+ !no_changes?
32
+ end
33
+
34
+ def no_changes?
35
+ @mutex.synchronize do
36
+ @items.all? { |filename, item| item.no_changes? }
37
+ end
38
+ end
39
+
40
+ def clear
41
+ @mutex.synchronize do
42
+ @items.clear
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,48 @@
1
+
2
+ # Copyright 2008-2009 Stanislav Senotrusov <senotrusov@gmail.com>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+
17
+ class RubyXmlMapper::FileCacheItem
18
+ def initialize filename
19
+ @filename = filename
20
+ @mutex = Mutex.new
21
+ end
22
+
23
+ def get
24
+ raise(RubyXmlMapper::CircularReference, "in `#{@filename}'") if @mutex.locked?
25
+
26
+ @mutex.synchronize do
27
+ mtime = File.mtime(@filename)
28
+
29
+ if @data && @mtime == mtime
30
+ return @data
31
+
32
+ elsif block_given?
33
+ @mtime = mtime
34
+ return (@data = yield)
35
+
36
+ else
37
+ return @data
38
+ end
39
+ end
40
+ end
41
+
42
+ def no_changes?
43
+ @mutex.synchronize do
44
+ File.mtime(@filename) == @mtime
45
+ end
46
+ end
47
+
48
+ end
@@ -23,9 +23,16 @@
23
23
 
24
24
  require 'libxml'
25
25
 
26
+ module RubyXmlMapper
27
+ class CircularReference < StandardError; end
28
+ end
29
+
30
+ require 'ruby-xml-mapper/file_cache_item'
31
+ require 'ruby-xml-mapper/file_cache'
32
+
26
33
  module RubyXmlMapper
27
34
  mattr_accessor :file_cache
28
- self.file_cache = {}
35
+ self.file_cache = RubyXmlMapper::FileCache.new
29
36
 
30
37
  def self.included model
31
38
  model.extend RubyXmlMapper::RubyXmlMapperClassMethods
@@ -154,7 +161,9 @@ module RubyXmlMapper
154
161
  end
155
162
 
156
163
  def new_from_xml_file file_name
157
- RubyXmlMapper.file_cache[file_name] ||= new_from_xml_node(parse_xml_file(file_name))
164
+ RubyXmlMapper.file_cache.get(file_name) do
165
+ new_from_xml_node(parse_xml_file(file_name))
166
+ end
158
167
  end
159
168
 
160
169
  def new_from_xml_node node
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: senotrusov-ruby-xml-mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav Senotrusov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-30 00:00:00 -07:00
12
+ date: 2009-08-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,6 +45,8 @@ files:
45
45
  - README
46
46
  - LICENSE
47
47
  - lib/ruby-xml-mapper
48
+ - lib/ruby-xml-mapper/file_cache_item.rb
49
+ - lib/ruby-xml-mapper/file_cache.rb
48
50
  - lib/ruby-xml-mapper/basic_containers.rb
49
51
  - lib/ruby-xml-mapper.rb
50
52
  - test/rss.rb