amee-data-persistence 1.0.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/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.8.7@amee-data-persistence
data/CHANGELOG.txt ADDED
@@ -0,0 +1,4 @@
1
+ = Changelog
2
+
3
+ == 1.0.0
4
+ * Initial public release
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Dependencies
4
+ gem "amee-data-abstraction","~> 1.0.0"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "bundler", "~> 1.0.0"
10
+ gem "jeweler", "~> 1.6.4"
11
+ gem 'rspec', '1.3.0'
12
+ gem 'rcov'
13
+ gem 'rspec_spinner', '1.1.3'
14
+ gem 'flexmock', '> 0.8.6'
15
+ gem 'activerecord', '~> 2.3.5'
16
+ gem 'sqlite3'
17
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,48 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activerecord (2.3.12)
5
+ activesupport (= 2.3.12)
6
+ activesupport (2.3.12)
7
+ amee (3.0.1)
8
+ activesupport (~> 2.3.5)
9
+ json
10
+ log4r
11
+ nokogiri (~> 1.4.3.1)
12
+ amee-data-abstraction (1.0.0)
13
+ amee (~> 3.0)
14
+ quantify (= 1.1.0)
15
+ uuidtools (= 2.1.2)
16
+ flexmock (0.9.0)
17
+ git (1.2.5)
18
+ jeweler (1.6.4)
19
+ bundler (~> 1.0)
20
+ git (>= 1.2.5)
21
+ rake
22
+ json (1.5.3)
23
+ log4r (1.1.9)
24
+ nokogiri (1.4.3.1)
25
+ quantify (1.1.0)
26
+ activesupport
27
+ rake (0.9.2)
28
+ rcov (0.9.10)
29
+ rspec (1.3.0)
30
+ rspec_spinner (1.1.3)
31
+ rtui
32
+ rtui (0.2.2)
33
+ sqlite3 (1.3.4)
34
+ uuidtools (2.1.2)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ activerecord (~> 2.3.5)
41
+ amee-data-abstraction (~> 1.0.0)
42
+ bundler (~> 1.0.0)
43
+ flexmock (> 0.8.6)
44
+ jeweler (~> 1.6.4)
45
+ rcov
46
+ rspec (= 1.3.0)
47
+ rspec_spinner (= 1.1.3)
48
+ sqlite3
data/LICENSE.txt ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2011, AMEE UK Ltd.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ Neither the name of AMEE UK Ltd nor the names of its contributors may be
15
+ used to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.txt ADDED
@@ -0,0 +1,89 @@
1
+ == amee-data-persistence
2
+
3
+ The amee-data-persistence gem provides database support for use in conjunction
4
+ with the amee-data-abstraction gem.
5
+
6
+ Licensed under the BSD 3-Clause license (See LICENSE.txt for details)
7
+
8
+ Authors: James Hetherington, James Smith, Andrew Berkeley, George Palmer
9
+
10
+ Copyright: Copyright (c) 2011 AMEE UK Ltd
11
+
12
+ Homepage: http://github.com/AMEE/amee-data-persistence
13
+
14
+ Documentation: http://rubydoc.info/gems/amee-data-persistence
15
+ == INSTALLATION
16
+
17
+ gem install amee-data-persistence
18
+
19
+ == REQUIREMENTS
20
+
21
+ * ruby 1.8.7
22
+ * rubygems >= 1.5
23
+
24
+ All gem requirements should be installed as part of the rubygems installation process
25
+ above, but are listed here for completeness.
26
+
27
+ * amee-data-abstraction ~> 1.0.0
28
+
29
+ == USAGE
30
+
31
+ The library repesents calculations as
32
+ database records using two classes (<i>AMEE::Db::Calculation</i> and
33
+ <i>AMEE::Db::Term</i>) both of which inherit <i>ActiveRecord::Base</i>.
34
+
35
+ The library also defines the <i>AMEE::DataAbstraction::PersistenceSupport</i>
36
+ module which is mixed into the <i>AMEE::DataAbstraction::OngoingCalculation</i>
37
+ class by default when the library is required. The module provides a number of
38
+ class and instance methods which provide an interface between the
39
+ <i>AMEE::DataAbstraction::OngoingCalculation</i> class (and its instances) and
40
+ the database. It is via these methods that the persistence functionality
41
+ provided by the <i>AMEE::Db</i> classes is principally used.
42
+
43
+ The level of data storage can be configured to three distinct levels, representing
44
+ the range of calculation terms which are persisted: all; outputs and metadata only;
45
+ and metadata only.
46
+
47
+ The global persistence storage level and migrations for the database tables
48
+ (under /db/migrate) can be generated using the command line generator command:
49
+
50
+ $ script/generate persistence <storage_level>
51
+
52
+ where <storage_level> can be either 'everything', 'outputs' or 'metadata', e.g.,
53
+
54
+ $ script/generate persistence everything
55
+
56
+
57
+ === Example usage
58
+
59
+ my_calculation = OngoingCalculation.find(:first)
60
+
61
+ #=> <AMEE::DataAbstraction::OngoingCalculation ... >
62
+
63
+ my_calculation = OngoingCalculation.find(28)
64
+
65
+ #=> <AMEE::DataAbstraction::OngoingCalculation ... >
66
+
67
+ my_calculation = OngoingCalculation.find(:all)
68
+
69
+ #=> <AMEE::DataAbstraction::CalculationCollection ... >
70
+
71
+ my_calculation = OngoingCalculation.find_by_type(:all, :electricity)
72
+
73
+ #=> <AMEE::DataAbstraction::CalculationCollection ... >
74
+
75
+ my_calculation.id #= 28
76
+
77
+ my_calculation.db_calculation #=> <AMEE::Db::Calculation ... >
78
+
79
+ my_calculation.to_hash #=> { :profile_uid => "EYR758EY36WY",
80
+ :profile_item_uid => "W83URT48DY3W",
81
+ :type => { :value => 'car' },
82
+ :distance => { :value => 1600,
83
+ :unit => <Quantify::Unit::SI> },
84
+ :co2 => { :value => 234.1,
85
+ :unit => <Quantify::Unit::NonSI> }}
86
+
87
+ my_calculation.save #=> true
88
+
89
+ my_calculation.delete #=> nil
data/Rakefile ADDED
@@ -0,0 +1,102 @@
1
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ # encoding: utf-8
5
+
6
+ require 'rubygems'
7
+ require 'bundler'
8
+ begin
9
+ Bundler.setup(:default, :development)
10
+ rescue Bundler::BundlerError => e
11
+ $stderr.puts e.message
12
+ $stderr.puts "Run `bundle install` to install missing gems"
13
+ exit e.status_code
14
+ end
15
+ require 'rake'
16
+ require 'spec'
17
+ require 'spec/rake/spectask'
18
+
19
+ task :default => [:spec]
20
+
21
+ Spec::Rake::SpecTask.new do |t|
22
+ t.spec_opts = ['--options', "spec/spec.opts"]
23
+ t.spec_files = FileList['spec/**/*_spec.rb']
24
+ t.rcov = true
25
+ t.rcov_opts = ['--exclude', 'spec,/*ruby*,']
26
+ end
27
+
28
+ require 'jeweler'
29
+ # Fix for Jeweler to use stable branch
30
+ class Jeweler
31
+ module Commands
32
+ class ReleaseToGit
33
+ def run
34
+ unless clean_staging_area?
35
+ system "git status"
36
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
37
+ end
38
+ repo.checkout('stable')
39
+ repo.push('origin', 'stable')
40
+ if release_not_tagged?
41
+ output.puts "Tagging #{release_tag}"
42
+ repo.add_tag(release_tag)
43
+ output.puts "Pushing #{release_tag} to origin"
44
+ repo.push('origin', release_tag)
45
+ end
46
+ end
47
+ end
48
+ class ReleaseGemspec
49
+ def run
50
+ unless clean_staging_area?
51
+ system "git status"
52
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
53
+ end
54
+ repo.checkout('stable')
55
+ regenerate_gemspec!
56
+ commit_gemspec! if gemspec_changed?
57
+ output.puts "Pushing stable to origin"
58
+ repo.push('origin', 'stable')
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ Jeweler::Tasks.new do |gem|
65
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
66
+ gem.name = "amee-data-persistence"
67
+ gem.homepage = "http://github.com/AMEE/amee-data-persistence"
68
+ gem.license = "BSD 3-Clause"
69
+ gem.summary = %Q{Persistent storage of calculations performed against the AMEE API}
70
+ gem.description = %Q{Part of the AMEEappkit, this gem provides storage and retrival of data provided by the amee-data-abstraction gem}
71
+ gem.email = "help@amee.com"
72
+ gem.authors = ["James Hetherington", "Andrew Berkeley", "James Smith", "George Palmer"]
73
+ # dependencies defined in Gemfile
74
+ end
75
+ Jeweler::RubygemsDotOrgTasks.new
76
+
77
+ require 'rake/testtask'
78
+ Rake::TestTask.new(:test) do |test|
79
+ test.libs << 'lib' << 'test'
80
+ test.pattern = 'test/**/test_*.rb'
81
+ test.verbose = true
82
+ end
83
+
84
+ require 'rcov/rcovtask'
85
+ Rcov::RcovTask.new do |test|
86
+ test.libs << 'test'
87
+ test.pattern = 'test/**/test_*.rb'
88
+ test.verbose = true
89
+ test.rcov_opts << '--exclude "gems/*"'
90
+ end
91
+
92
+ task :default => :test
93
+
94
+ require 'rake/rdoctask'
95
+ Rake::RDocTask.new do |rdoc|
96
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
97
+
98
+ rdoc.rdoc_dir = 'rdoc'
99
+ rdoc.title = "amee-data-persistence #{version}"
100
+ rdoc.rdoc_files.include('README*')
101
+ rdoc.rdoc_files.include('lib/**/*.rb')
102
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,93 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{amee-data-persistence}
8
+ s.version = "1.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["James Hetherington", "Andrew Berkeley", "James Smith", "George Palmer"]
12
+ s.date = %q{2011-08-11}
13
+ s.description = %q{Part of the AMEEappkit, this gem provides storage and retrival of data provided by the amee-data-abstraction gem}
14
+ s.email = %q{help@amee.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.txt"
18
+ ]
19
+ s.files = [
20
+ ".rvmrc",
21
+ "CHANGELOG.txt",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.txt",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "amee-data-persistence.gemspec",
29
+ "amee-data-persistence.tmproj",
30
+ "generators/persistence/persistence_generator.rb",
31
+ "generators/persistence/templates/config/persistence.yml.erb",
32
+ "generators/persistence/templates/db/migrate/001_create_persistence_tables.rb",
33
+ "generators/persistence/templates/db/migrate/002_add_unit_columns.rb",
34
+ "generators/persistence/templates/db/migrate/003_add_value_types.rb",
35
+ "init.rb",
36
+ "lib/amee-data-persistence.rb",
37
+ "lib/amee/data_abstraction/calculation_collection.rb",
38
+ "lib/amee/data_abstraction/persistence_support.rb",
39
+ "lib/amee/db/calculation.rb",
40
+ "lib/amee/db/config.rb",
41
+ "lib/amee/db/term.rb",
42
+ "rails/init.rb",
43
+ "spec/amee/db/calculation_spec.rb",
44
+ "spec/amee/db/config_spec.rb",
45
+ "spec/amee/db/persistence_support_spec.rb",
46
+ "spec/amee/db/term_spec.rb",
47
+ "spec/database.yml",
48
+ "spec/spec.opts",
49
+ "spec/spec_helper.rb"
50
+ ]
51
+ s.homepage = %q{http://github.com/AMEE/amee-data-persistence}
52
+ s.licenses = ["BSD 3-Clause"]
53
+ s.require_paths = ["lib"]
54
+ s.rubygems_version = %q{1.6.2}
55
+ s.summary = %q{Persistent storage of calculations performed against the AMEE API}
56
+
57
+ if s.respond_to? :specification_version then
58
+ s.specification_version = 3
59
+
60
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
+ s.add_runtime_dependency(%q<amee-data-abstraction>, ["~> 1.0.0"])
62
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
65
+ s.add_development_dependency(%q<rcov>, [">= 0"])
66
+ s.add_development_dependency(%q<rspec_spinner>, ["= 1.1.3"])
67
+ s.add_development_dependency(%q<flexmock>, ["> 0.8.6"])
68
+ s.add_development_dependency(%q<activerecord>, ["~> 2.3.5"])
69
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
70
+ else
71
+ s.add_dependency(%q<amee-data-abstraction>, ["~> 1.0.0"])
72
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
73
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
74
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
75
+ s.add_dependency(%q<rcov>, [">= 0"])
76
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
77
+ s.add_dependency(%q<flexmock>, ["> 0.8.6"])
78
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
79
+ s.add_dependency(%q<sqlite3>, [">= 0"])
80
+ end
81
+ else
82
+ s.add_dependency(%q<amee-data-abstraction>, ["~> 1.0.0"])
83
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
84
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
85
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
86
+ s.add_dependency(%q<rcov>, [">= 0"])
87
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
88
+ s.add_dependency(%q<flexmock>, ["> 0.8.6"])
89
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
90
+ s.add_dependency(%q<sqlite3>, [">= 0"])
91
+ end
92
+ end
93
+
@@ -0,0 +1,27 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>documents</key>
6
+ <array>
7
+ <dict>
8
+ <key>expanded</key>
9
+ <true/>
10
+ <key>name</key>
11
+ <string>amee-data-persistence</string>
12
+ <key>regexFolderFilter</key>
13
+ <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
14
+ <key>sourceDirectory</key>
15
+ <string></string>
16
+ </dict>
17
+ </array>
18
+ <key>fileHierarchyDrawerWidth</key>
19
+ <integer>200</integer>
20
+ <key>metaData</key>
21
+ <dict/>
22
+ <key>showFileHierarchyDrawer</key>
23
+ <true/>
24
+ <key>windowFrame</key>
25
+ <string>{{193, 217}, {1390, 940}}</string>
26
+ </dict>
27
+ </plist>
@@ -0,0 +1,97 @@
1
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ # :title: Class: PersistenceGenerator
5
+
6
+ # The global persistence storage level and migrations for the database tables can be
7
+ # generated the <i>PersistenceGenerator</i> class.
8
+ #
9
+ # The level of data storage for <i>AMEE::Db</i> can be configured to three
10
+ # distinct levels, representing the range of calculation terms which are
11
+ # persisted: all; outputs and metadata only; and metadata only.
12
+ #
13
+ # To set the global persistence level and generate migration files in /db/migrate,
14
+ # execute the following command line generator command:
15
+ #
16
+ # $ script/generate persistence <storage_level>
17
+ #
18
+ # where <storage_level> can be either 'everything', 'outputs' or 'metadata', e.g.,
19
+ #
20
+ # $ script/generate persistence everything
21
+ #
22
+ class PersistenceGenerator < Rails::Generator::Base
23
+
24
+ # Need to explicitly define the paths to both the templates directory and the
25
+ # standard application migrations directory. These are equivalent when using
26
+ # the #template method it is assumed therein that there is a mapping to the
27
+ # /templates directory for the generator templates (and from there the sub-
28
+ # paths are the same). This assumption is not valid when accessing the
29
+ # templates and the existing application migrations otherwise.
30
+ #
31
+ DEFAULT_MIGRATION_PATH = File.join("db/migrate")
32
+ TEMPLATE_MIGRATION_PATH = File.join(File.dirname(__FILE__),"templates",DEFAULT_MIGRATION_PATH)
33
+
34
+ def manifest
35
+ record do |m|
36
+
37
+ ########################################
38
+ # persistence level configuration file #
39
+ ########################################
40
+
41
+ # Get method from command line - default is metadata
42
+ method = args[0] || 'metadata'
43
+ # Make sure there is a config directory
44
+ m.directory File.join("config")
45
+ # Create persistence.yml file
46
+ m.template File.join("config","persistence.yml.erb"),
47
+ File.join("config","persistence.yml"),
48
+ :assigns => {:method => method}
49
+
50
+
51
+
52
+ #######################
53
+ # database migrations #
54
+ #######################
55
+
56
+ # Check db/migrate exists
57
+ m.directory DEFAULT_MIGRATION_PATH
58
+ # Create migrations if not already represented
59
+ migration_template_files.each_with_index do |file_name,index|
60
+ unless migration_exists? file_name
61
+ template_path = File.join(DEFAULT_MIGRATION_PATH,file_name)
62
+ # increment timestamp to differentiate files generated within same second
63
+ destination_file_name = file_name.gsub(/\d{3}/,"#{Time.now.strftime("%Y%m%d%I%M%S").to_i+index}")
64
+ destination_path = File.join(DEFAULT_MIGRATION_PATH,destination_file_name)
65
+
66
+ m.template template_path, destination_path
67
+ else
68
+ # print to stdout in standard migration reporting format
69
+ puts " exists migration content in template: #{file_name}"
70
+ end
71
+ end
72
+
73
+ end
74
+ end
75
+
76
+ # Get names of all migration template files and sort them by version number
77
+ def migration_template_files
78
+ Dir.new(TEMPLATE_MIGRATION_PATH).entries.reject { |entry| File.directory? entry }.sort
79
+ end
80
+
81
+ # Check whether a migration already exists, by comparing the content of the
82
+ # migration template with any migrations which already exist in the
83
+ # applicaition's db/migrate directory. This is preferable to using file names
84
+ # since file names (1) have a time stamp and are therefore not consistent
85
+ # between separate instances of a file generation and (2) migration names may
86
+ # be changed in the future.
87
+ #
88
+ def migration_exists?(template)
89
+ template_content = File.read(File.join(TEMPLATE_MIGRATION_PATH,template))
90
+
91
+ Dir.new(DEFAULT_MIGRATION_PATH).entries.any? do |file|
92
+ next if File.directory?(file)
93
+ File.read(File.join(DEFAULT_MIGRATION_PATH,file)) == template_content
94
+ end
95
+ end
96
+
97
+ end