entrepot 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.idea/.name ADDED
@@ -0,0 +1 @@
1
+ 216_entrepot
data/.idea/.rakeTasks ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Settings><!--This file was automatically generated by Ruby plugin.
3
+ You are allowed to:
4
+ 1. Remove rake task
5
+ 2. Add existing rake tasks
6
+ To add existing rake tasks automatically delete this file and reload the project.
7
+ --><RakeGroup description="" fullCmd="" taksId="rake" /></Settings>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="FacetManager">
4
+ <facet type="gem" name="Gem">
5
+ <configuration>
6
+ <option name="GEM_APP_ROOT_PATH" value="$MODULE_DIR$" />
7
+ <option name="GEM_APP_TEST_PATH" value="" />
8
+ <option name="GEM_APP_LIB_PATH" value="$MODULE_DIR$/lib" />
9
+ </configuration>
10
+ </facet>
11
+ </component>
12
+ <component name="NewModuleRootManager">
13
+ <content url="file://$MODULE_DIR$" />
14
+ <orderEntry type="inheritedJdk" />
15
+ <orderEntry type="sourceFolder" forTests="false" />
16
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, RVM: ruby-1.9.3-p448 [global]) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="rake (v10.1.0, RVM: ruby-1.9.3-p448 [global]) [gem]" level="application" />
18
+ </component>
19
+ </module>
20
+
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
4
+ </project>
5
+
data/.idea/misc.xml ADDED
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" project-jdk-name="RVM: ruby-1.9.3-p448 [global]" project-jdk-type="RUBY_SDK" />
4
+ </project>
5
+
data/.idea/modules.xml ADDED
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/216_entrepot.iml" filepath="$PROJECT_DIR$/.idea/216_entrepot.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
9
+
@@ -0,0 +1,5 @@
1
+ <component name="DependencyValidationManager">
2
+ <state>
3
+ <option name="SKIP_IMPORT_STATEMENTS" value="false" />
4
+ </state>
5
+ </component>
data/.idea/vcs.xml ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
7
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in entrepot.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Bernhard Weichel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # _entrepot_ - entrepot supported processing
2
+
3
+ Ruby is excellent for transforming and filtering data.
4
+
5
+ Rubyists often use these capabilities to manipulate large amounts of data in a multi-step pipeline way.
6
+ Entrepot memorizes the results along the way to speed up repetitive processing. If only parts of the original data change, not all of it has to be recomputed.
7
+
8
+ Immerdiate results are stored on disk, to enable defered processing and reuse of previous results.
9
+
10
+ To some extend entrepot can be considered as a kind of entrepot. But
11
+
12
+ - entities in entrepot have no expiration date
13
+ - entrepot also handles the processing of entities
14
+
15
+ # Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'entrepot'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install entrepot
28
+
29
+ # Usage
30
+
31
+ require 'entrepot'
32
+ proc = Entrepot.new( :entrepotfolder => "zz_myentrepot",
33
+ :salt => "1234",
34
+ :mkname => lambda{|f, salt, mdsum|
35
+ "_#{salt}_#{f.basename}_#{mdsum}"}
36
+ :logger = $log
37
+ :mode = :active
38
+ )
39
+ proc.mode = :active # :active | :refresh | :passive
40
+
41
+ Dir["*.tex"].each do |filename|
42
+ object = File.open(filename).read
43
+ result = proc.process(object, file ) do | object, file |
44
+ l_result = mytransform( object )
45
+ l_result
46
+ end
47
+
48
+ puts result
49
+
50
+ Note that the entrepot is configured when the entrepot object is created. If
51
+ you want to change the options, simply create a new entrepot object with
52
+ the desire options.
53
+
54
+ ## options
55
+
56
+ ':entrepot'
57
+ : This is the folder where entrepot crates the entrepot
58
+
59
+ ':salt'
60
+ : The content is salted by this in order to ensure that the entrepot
61
+ matches the current version of the software.
62
+
63
+ ':mkname'
64
+ : A procedure yielding a string which is used as filename for an
65
+ individual entrepot.
66
+
67
+ ':logger'
68
+ : a logger object which is used to log the entrepot operation. Messages
69
+ are sent by logger.info
70
+
71
+ ':mode'
72
+ : Sets the operation mode of the entrepot. This allows to disable caching
73
+ for debug purposes. The following values apply:
74
+
75
+ ':active'
76
+ : the entrepot is active
77
+
78
+ 'refresh'
79
+ : the entrepot files are rebuilt, but not read before
80
+
81
+ 'passive'
82
+ : caching does not operate at all. Cache files are neither read
83
+ nor read
84
+
85
+ ## methods
86
+
87
+ 'files'
88
+ : provides an array of files for a given name available in the entrepot
89
+
90
+ 'clean'
91
+ : cleans all entrepot entries. In this all files in the entrepot are
92
+ cleaned. Thereby basename and mdsum are replaced by "\*" in order to
93
+ get a globber.
94
+
95
+ Of course cou can also manually delete the files in the entrepot
96
+ directoy
97
+
98
+ 'process'
99
+ : performs a entrepot supported processing.
100
+
101
+ # Contributing
102
+
103
+ 1. Fork it
104
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
105
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
106
+ 4. Push to the branch (`git push origin my-new-feature`)
107
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ require 'rake/clean'
4
+
5
+ desc "Run specs"
6
+ RSpec::Core::RakeTask.new(:spec, :focus) do |t, args|
7
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
8
+ if args[:focus] then
9
+ usetags="--tag #{args[:focus]}"
10
+ else
11
+ usetags="--tag ~exp"
12
+ end
13
+ t.rspec_opts = [usetags,
14
+ " -fd -fd --out ./testresults/testresults.log -fh --out ./testresults/testresults.html"]
15
+ # Put spec opts in a file named .rspec in root
16
+ end
data/entrepot.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'entrepot/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "entrepot"
8
+ spec.version = Entrepot::VERSION
9
+ spec.authors = ["Bernhard Weichel"]
10
+ spec.email = ["github.com@nospam.weichel21.de"]
11
+ spec.description = %q{a helper class do do a chached processing}
12
+ spec.summary = %q{Ruby is excellent for transforming and filtering data.
13
+
14
+ Rubyists often use these capabilities to manipulate large amounts of data in a multi-step pipeline way.
15
+ Entrepot memorizes the results along the way to speed up repetitive processing. If only parts of the original data change, not all of it has to be recomputed.
16
+
17
+ Immerdiate results are stored on disk, to enable defered processing and reuse of previous results.
18
+ }
19
+ spec.homepage = ""
20
+ spec.license = "MIT"
21
+
22
+ spec.files = `git ls-files`.split($/)
23
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
25
+ spec.require_paths = ["lib"]
26
+
27
+
28
+ spec.add_runtime_dependency 'digest'
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.3"
31
+ spec.add_development_dependency "rake"
32
+ spec.add_development_dependency "fileutils"
33
+ spec.add_development_dependency "rspec"
34
+ spec.add_development_dependency "pry"
35
+
36
+ end
data/lib/entrepot.rb ADDED
@@ -0,0 +1,115 @@
1
+ require "entrepot/version"
2
+ require 'digest'
3
+
4
+ module Entrepot
5
+ class Entrepot
6
+
7
+ #
8
+ # the Constructor
9
+ # @param args [Hash] Hash of options
10
+ #
11
+ def initialize(args)
12
+ @options = args
13
+ if @options[:mkname].nil?
14
+ @options[:mkname] = lambda{|cachename, salt, mdsum|
15
+ "_#{salt}_#{File.basename(cachename)}_#{mdsum}.cache"
16
+ }
17
+ end
18
+
19
+ if @options[:salt].nil?
20
+ @options[:salt] = "_"
21
+ end
22
+
23
+ if @options[:mode].nil?
24
+ @options[:mode] = :active
25
+ end
26
+
27
+ if @options[:entrepotfolder].nil?
28
+ @ptions[:entrepotfolder] = "zz_entrepot"
29
+ end
30
+ end
31
+
32
+
33
+ #
34
+ # provide a list of cachfiles for a given name
35
+ #
36
+ # @param name [String] The name of the cache
37
+ #
38
+ # @return [Array of String] list of cache filenames
39
+ #
40
+ def files(name)
41
+ Dir[_cachefile(name, @options[:salt], "*")].select{|f| File.file?(f)}
42
+ end
43
+
44
+
45
+ #
46
+ # Clean the cache for a given name
47
+ #
48
+ # @param name [String] Name of the cache to be cleaned
49
+ #
50
+ # @return [Nil] [description]
51
+ def clean(name)
52
+ files(name).each{|f|
53
+ log "delete: #{f}"
54
+ File.delete(f)
55
+ nil
56
+ }
57
+ end
58
+
59
+
60
+ #
61
+ # yield a result using the cache
62
+ #
63
+ # @param object [String] The input data to be processed
64
+ # @param name [String] The name of the cache, usually a filename
65
+ # @param &block [lambda] Procedure to process the string. Note that
66
+ # the block shall yield one object as a result of processing.
67
+ #
68
+ # @return [Object] The result of the processing
69
+ #
70
+ def process(object, name, &block)
71
+
72
+ FileUtils.mkdir_p(@options[:entrepotfolder])
73
+
74
+ salt = @options[:salt]
75
+ digest = Digest::MD5.hexdigest(object + salt)
76
+ cachefile = _cachefile(name, salt, digest)
77
+
78
+ # examine the cache
79
+ dumpset = {:salt => nil}
80
+ if @options[:mode] == :active
81
+ if File.exists?(cachefile)
82
+ File.open(cachefile, "rb"){|f| dumpset = Marshal.load(f)}
83
+ end
84
+ end
85
+
86
+ # examine the success: Salt is read from the cachefile!
87
+ if dumpset[:salt] != salt
88
+ dumpset = {:salt => salt}
89
+ log "reprocessing #{name}"
90
+
91
+ result = block.call(object, name) # yield the expected result
92
+
93
+ dumpset[:result] = result
94
+ if [:active, :refresh].include? @options[:mode]
95
+ File.open(cachefile, "wb"){|f| Marshal.dump(dumpset, f)}
96
+ end
97
+ else
98
+ log "using cache for #{name}"
99
+ result = dumpset[:result]
100
+ end
101
+ result
102
+ end
103
+
104
+ private
105
+
106
+ def log(message)
107
+ logger = @options[:logger]
108
+ logger.info(message) if logger.respond_to? :info
109
+ end
110
+
111
+ def _cachefile(name, salt, digest)
112
+ "#{@options[:entrepotfolder]}/#{@options[:mkname].call(name, @options[:salt], digest)}"
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,3 @@
1
+ module Entrepot
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,128 @@
1
+ $:.unshift 'lib'
2
+ require 'entrepot'
3
+ require 'fileutils'
4
+
5
+ class Logger
6
+ def info(message)
7
+ puts "[ INFO] #{message}"
8
+ end
9
+ end
10
+
11
+ describe "cachew" do
12
+
13
+ before :all do
14
+ end
15
+
16
+ it 'performs a chached process' do
17
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
18
+ :entrepotfolder => 'zz_cache',
19
+ :logger => Logger.new
20
+ )
21
+
22
+ data = "foobar " + Time.now.to_s
23
+ name = "a/b/c/foobar.txt"
24
+ result = cacheproc.process( data, name ) do | data, name |
25
+ data
26
+ end
27
+
28
+ result = cacheproc.process( data, name ) do | data, name |
29
+ data + Time.now().to_s
30
+ end
31
+ result.should== data
32
+ end
33
+
34
+ it 'manages the cachefolder' do
35
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
36
+ :entrepotfolder => 'zz_cache/x2',
37
+ :logger => Logger.new
38
+ )
39
+ name = "a/b/c/foobar.txt"
40
+ cacheproc.clean(name)
41
+
42
+ cacheproc.process(Time.now.to_s, name) do |data, name|
43
+ data
44
+ end
45
+
46
+ cacheproc.files(name).count.should == 1
47
+ cacheproc.clean(name)
48
+ cacheproc.files(name).count.should == 0
49
+ end
50
+
51
+ it 'can be turned off' do
52
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
53
+ :entrepotfolder => 'zz_cache',
54
+ :logger => Logger.new,
55
+ :mode => :passive
56
+ )
57
+
58
+ data = "foobar " + Time.now.to_s
59
+ name = "a/b/c/foobar.txt"
60
+ result = cacheproc.process( data, name ) do | data, name |
61
+ data
62
+ end
63
+
64
+ newdata = data + Time.now().to_s
65
+ result = cacheproc.process( data, name ) do | data, name |
66
+ newdata
67
+ end
68
+ result.should== newdata
69
+ end
70
+
71
+ it 'can refresh the cache' do
72
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
73
+ :entrepotfolder => 'zz_cache',
74
+ :logger => Logger.new,
75
+ :mode => :active
76
+ )
77
+
78
+ data = "foobar " + Time.now.to_s
79
+ name = "a/b/c/foobar.txt"
80
+ result = cacheproc.process( data, name ) do | data, name |
81
+ data
82
+ end
83
+
84
+ newdata = data + Time.now().to_s
85
+ result1 = cacheproc.process( data, name ) do | data, name |
86
+ newdata
87
+ end
88
+
89
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
90
+ :entrepotfolder => 'zz_cache',
91
+ :logger => Logger.new,
92
+ :mode => :refresh
93
+ )
94
+
95
+ result2 = cacheproc.process( data, name ) do | data, name |
96
+ newdata
97
+ end
98
+
99
+ result1.should== data
100
+ result2.should== newdata
101
+ end
102
+
103
+ it "can specify the cache filename" do
104
+ cacheproc = Entrepot::Entrepot.new(:salt => "x2",
105
+ :entrepotfolder => 'zz_cache',
106
+ :mkname => lambda do |f, salt, mdsum|
107
+ "_#{mdsum}_#{f}_#{salt}"
108
+ end,
109
+
110
+ :logger => Logger.new,
111
+
112
+ :mode => :refresh
113
+ )
114
+ name = nil;Time.now()
115
+ cacheproc.clean(name)
116
+ result2 = cacheproc.process( "a", name ) do | data, name |
117
+ "foo"
118
+ end
119
+ result2 = cacheproc.process( "b", name ) do | data, name |
120
+ "foo"
121
+ end
122
+
123
+ a=Dir["zz_cache/_*_#{name}_x2"]
124
+ a.count.should==2
125
+ cacheproc.clean(name)
126
+ end
127
+
128
+ end
@@ -0,0 +1,305 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+ <head>
7
+ <title>RSpec results</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+ <meta http-equiv="Expires" content="-1" />
10
+ <meta http-equiv="Pragma" content="no-cache" />
11
+ <style type="text/css">
12
+ body {
13
+ margin: 0;
14
+ padding: 0;
15
+ background: #fff;
16
+ font-size: 80%;
17
+ }
18
+ </style>
19
+ <script type="text/javascript">
20
+ // <![CDATA[
21
+
22
+ function addClass(element_id, classname) {
23
+ document.getElementById(element_id).className += (" " + classname);
24
+ }
25
+
26
+ function removeClass(element_id, classname) {
27
+ var elem = document.getElementById(element_id);
28
+ var classlist = elem.className.replace(classname,'');
29
+ elem.className = classlist;
30
+ }
31
+
32
+ function moveProgressBar(percentDone) {
33
+ document.getElementById("rspec-header").style.width = percentDone +"%";
34
+ }
35
+
36
+ function makeRed(element_id) {
37
+ removeClass(element_id, 'passed');
38
+ removeClass(element_id, 'not_implemented');
39
+ addClass(element_id,'failed');
40
+ }
41
+
42
+ function makeYellow(element_id) {
43
+ var elem = document.getElementById(element_id);
44
+ if (elem.className.indexOf("failed") == -1) { // class doesn't includes failed
45
+ if (elem.className.indexOf("not_implemented") == -1) { // class doesn't include not_implemented
46
+ removeClass(element_id, 'passed');
47
+ addClass(element_id,'not_implemented');
48
+ }
49
+ }
50
+ }
51
+
52
+ function apply_filters() {
53
+ var passed_filter = document.getElementById('passed_checkbox').checked;
54
+ var failed_filter = document.getElementById('failed_checkbox').checked;
55
+ var pending_filter = document.getElementById('pending_checkbox').checked;
56
+
57
+ assign_display_style("example passed", passed_filter);
58
+ assign_display_style("example failed", failed_filter);
59
+ assign_display_style("example not_implemented", pending_filter);
60
+
61
+ assign_display_style_for_group("example_group passed", passed_filter);
62
+ assign_display_style_for_group("example_group not_implemented", pending_filter, pending_filter || passed_filter);
63
+ assign_display_style_for_group("example_group failed", failed_filter, failed_filter || pending_filter || passed_filter);
64
+ }
65
+
66
+ function get_display_style(display_flag) {
67
+ var style_mode = 'none';
68
+ if (display_flag == true) {
69
+ style_mode = 'block';
70
+ }
71
+ return style_mode;
72
+ }
73
+
74
+ function assign_display_style(classname, display_flag) {
75
+ var style_mode = get_display_style(display_flag);
76
+ var elems = document.getElementsByClassName(classname)
77
+ for (var i=0; i<elems.length;i++) {
78
+ elems[i].style.display = style_mode;
79
+ }
80
+ }
81
+
82
+ function assign_display_style_for_group(classname, display_flag, subgroup_flag) {
83
+ var display_style_mode = get_display_style(display_flag);
84
+ var subgroup_style_mode = get_display_style(subgroup_flag);
85
+ var elems = document.getElementsByClassName(classname)
86
+ for (var i=0; i<elems.length;i++) {
87
+ var style_mode = display_style_mode;
88
+ if ((display_flag != subgroup_flag) && (elems[i].getElementsByTagName('dt')[0].innerHTML.indexOf(", ") != -1)) {
89
+ elems[i].style.display = subgroup_style_mode;
90
+ } else {
91
+ elems[i].style.display = display_style_mode;
92
+ }
93
+ }
94
+ }
95
+
96
+ // ]]>
97
+ </script>
98
+ <style type="text/css">
99
+ #rspec-header {
100
+ background: #65C400; color: #fff; height: 4em;
101
+ }
102
+
103
+ .rspec-report h1 {
104
+ margin: 0px 10px 0px 10px;
105
+ padding: 10px;
106
+ font-family: "Lucida Grande", Helvetica, sans-serif;
107
+ font-size: 1.8em;
108
+ position: absolute;
109
+ }
110
+
111
+ #label {
112
+ float:left;
113
+ }
114
+
115
+ #display-filters {
116
+ float:left;
117
+ padding: 28px 0 0 40%;
118
+ font-family: "Lucida Grande", Helvetica, sans-serif;
119
+ }
120
+
121
+ #summary {
122
+ float:right;
123
+ padding: 5px 10px;
124
+ font-family: "Lucida Grande", Helvetica, sans-serif;
125
+ text-align: right;
126
+ }
127
+
128
+ #summary p {
129
+ margin: 0 0 0 2px;
130
+ }
131
+
132
+ #summary #totals {
133
+ font-size: 1.2em;
134
+ }
135
+
136
+ .example_group {
137
+ margin: 0 10px 5px;
138
+ background: #fff;
139
+ }
140
+
141
+ dl {
142
+ margin: 0; padding: 0 0 5px;
143
+ font: normal 11px "Lucida Grande", Helvetica, sans-serif;
144
+ }
145
+
146
+ dt {
147
+ padding: 3px;
148
+ background: #65C400;
149
+ color: #fff;
150
+ font-weight: bold;
151
+ }
152
+
153
+ dd {
154
+ margin: 5px 0 5px 5px;
155
+ padding: 3px 3px 3px 18px;
156
+ }
157
+
158
+ dd .duration {
159
+ padding-left: 5px;
160
+ text-align: right;
161
+ right: 0px;
162
+ float:right;
163
+ }
164
+
165
+ dd.example.passed {
166
+ border-left: 5px solid #65C400;
167
+ border-bottom: 1px solid #65C400;
168
+ background: #DBFFB4; color: #3D7700;
169
+ }
170
+
171
+ dd.example.not_implemented {
172
+ border-left: 5px solid #FAF834;
173
+ border-bottom: 1px solid #FAF834;
174
+ background: #FCFB98; color: #131313;
175
+ }
176
+
177
+ dd.example.pending_fixed {
178
+ border-left: 5px solid #0000C2;
179
+ border-bottom: 1px solid #0000C2;
180
+ color: #0000C2; background: #D3FBFF;
181
+ }
182
+
183
+ dd.example.failed {
184
+ border-left: 5px solid #C20000;
185
+ border-bottom: 1px solid #C20000;
186
+ color: #C20000; background: #FFFBD3;
187
+ }
188
+
189
+
190
+ dt.not_implemented {
191
+ color: #000000; background: #FAF834;
192
+ }
193
+
194
+ dt.pending_fixed {
195
+ color: #FFFFFF; background: #C40D0D;
196
+ }
197
+
198
+ dt.failed {
199
+ color: #FFFFFF; background: #C40D0D;
200
+ }
201
+
202
+
203
+ #rspec-header.not_implemented {
204
+ color: #000000; background: #FAF834;
205
+ }
206
+
207
+ #rspec-header.pending_fixed {
208
+ color: #FFFFFF; background: #C40D0D;
209
+ }
210
+
211
+ #rspec-header.failed {
212
+ color: #FFFFFF; background: #C40D0D;
213
+ }
214
+
215
+
216
+ .backtrace {
217
+ color: #000;
218
+ font-size: 12px;
219
+ }
220
+
221
+ a {
222
+ color: #BE5C00;
223
+ }
224
+
225
+ /* Ruby code, style similar to vibrant ink */
226
+ .ruby {
227
+ font-size: 12px;
228
+ font-family: monospace;
229
+ color: white;
230
+ background-color: black;
231
+ padding: 0.1em 0 0.2em 0;
232
+ }
233
+
234
+ .ruby .keyword { color: #FF6600; }
235
+ .ruby .constant { color: #339999; }
236
+ .ruby .attribute { color: white; }
237
+ .ruby .global { color: white; }
238
+ .ruby .module { color: white; }
239
+ .ruby .class { color: white; }
240
+ .ruby .string { color: #66FF00; }
241
+ .ruby .ident { color: white; }
242
+ .ruby .method { color: #FFCC00; }
243
+ .ruby .number { color: white; }
244
+ .ruby .char { color: white; }
245
+ .ruby .comment { color: #9933CC; }
246
+ .ruby .symbol { color: white; }
247
+ .ruby .regex { color: #44B4CC; }
248
+ .ruby .punct { color: white; }
249
+ .ruby .escape { color: white; }
250
+ .ruby .interp { color: white; }
251
+ .ruby .expr { color: white; }
252
+
253
+ .ruby .offending { background-color: gray; }
254
+ .ruby .linenum {
255
+ width: 75px;
256
+ padding: 0.1em 1em 0.2em 0;
257
+ color: #000000;
258
+ background-color: #FFFBD3;
259
+ }
260
+
261
+ </style>
262
+ </head>
263
+ <body>
264
+ <div class="rspec-report">
265
+
266
+ <div id="rspec-header">
267
+ <div id="label">
268
+ <h1>RSpec Code Examples</h1>
269
+ </div>
270
+
271
+ <div id="display-filters">
272
+ <input id="passed_checkbox" name="passed_checkbox" type="checkbox" checked onchange="apply_filters()" value="1"> <label for="passed_checkbox">Passed</label>
273
+ <input id="failed_checkbox" name="failed_checkbox" type="checkbox" checked onchange="apply_filters()" value="2"> <label for="failed_checkbox">Failed</label>
274
+ <input id="pending_checkbox" name="pending_checkbox" type="checkbox" checked onchange="apply_filters()" value="3"> <label for="pending_checkbox">Pending</label>
275
+ </div>
276
+
277
+ <div id="summary">
278
+ <p id="totals">&nbsp;</p>
279
+ <p id="duration">&nbsp;</p>
280
+ </div>
281
+ </div>
282
+
283
+
284
+ <div class="results">
285
+ <div id="div_group_1" class="example_group passed">
286
+ <dl style="margin-left: 0px;">
287
+ <dt id="example_group_1" class="passed">cachew</dt>
288
+ <script type="text/javascript">moveProgressBar('20.0');</script>
289
+ <dd class="example passed"><span class="passed_spec_name">performs a chached process</span><span class='duration'>0.00950s</span></dd>
290
+ <script type="text/javascript">moveProgressBar('40.0');</script>
291
+ <dd class="example passed"><span class="passed_spec_name">manages the cachefolder</span><span class='duration'>0.00067s</span></dd>
292
+ <script type="text/javascript">moveProgressBar('60.0');</script>
293
+ <dd class="example passed"><span class="passed_spec_name">can be turned off</span><span class='duration'>0.00025s</span></dd>
294
+ <script type="text/javascript">moveProgressBar('80.0');</script>
295
+ <dd class="example passed"><span class="passed_spec_name">can refresh the cache</span><span class='duration'>0.00064s</span></dd>
296
+ <script type="text/javascript">moveProgressBar('100.0');</script>
297
+ <dd class="example passed"><span class="passed_spec_name">can specify the cache filename</span><span class='duration'>0.00096s</span></dd>
298
+ </dl>
299
+ </div>
300
+ <script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>0.01291 seconds</strong>";</script>
301
+ <script type="text/javascript">document.getElementById('totals').innerHTML = "5 examples, 0 failures";</script>
302
+ </div>
303
+ </div>
304
+ </body>
305
+ </html>
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: entrepot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Bernhard Weichel
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: digest
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: fileutils
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: pry
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: a helper class do do a chached processing
111
+ email:
112
+ - github.com@nospam.weichel21.de
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .idea/.name
119
+ - .idea/.rakeTasks
120
+ - .idea/216_entrepot.iml
121
+ - .idea/encodings.xml
122
+ - .idea/misc.xml
123
+ - .idea/modules.xml
124
+ - .idea/scopes/scope_settings.xml
125
+ - .idea/vcs.xml
126
+ - Gemfile
127
+ - LICENSE.txt
128
+ - README.md
129
+ - Rakefile
130
+ - entrepot.gemspec
131
+ - lib/entrepot.rb
132
+ - lib/entrepot/version.rb
133
+ - spec/entrepot_spec.rb
134
+ - testresults/testresults.html
135
+ homepage: ''
136
+ licenses:
137
+ - MIT
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ none: false
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubyforge_project:
156
+ rubygems_version: 1.8.25
157
+ signing_key:
158
+ specification_version: 3
159
+ summary: Ruby is excellent for transforming and filtering data. Rubyists often use
160
+ these capabilities to manipulate large amounts of data in a multi-step pipeline
161
+ way. Entrepot memorizes the results along the way to speed up repetitive processing.
162
+ If only parts of the original data change, not all of it has to be recomputed. Immerdiate
163
+ results are stored on disk, to enable defered processing and reuse of previous results.
164
+ test_files:
165
+ - spec/entrepot_spec.rb
166
+ has_rdoc: