harshed 0.1.0 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +4 -0
- data/Gemfile +1 -5
- data/README.md +22 -3
- data/Rakefile +0 -16
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/data/.gitignore +2 -2
- data/harshed.gemspec +6 -4
- data/lib/harshed.rb +3 -94
- data/lib/harshed/harsh.rb +95 -0
- data/lib/harshed/version.rb +3 -0
- metadata +27 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28bb5bf44b780690fbbe646c505cb02f0bc7ef38
|
4
|
+
data.tar.gz: a9aa91b9e408e57a8bedd5da138a4c60fbcffe77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d415cbe289df4e384241b06d3cda246482d49f0fe4f485af1d5b74ebc86c1b81fdf037e2a85a17901dd70e1b93480cd5b82d77feae89a9feffbf12e9c615a2c
|
7
|
+
data.tar.gz: 76f166a66a44a80c111db5a2ca3fcc20daa40f2bc663338d3f0cb7c4903c946d616c232e5df738e7babfee38fc4b38ad0c7bebec3cca1f071f9befbac1f97ccb
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,25 @@
|
|
1
1
|
# Harshed
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/harshed)
|
4
|
+
[](https://travis-ci.org/folkengine/harshed)
|
5
|
+
|
3
6
|
Ruby Serializable Hashed Array Utility
|
4
7
|
|
8
|
+
A Harsh is a hashed array that can be quickly written to and read from disk in a format that can be easily reviewed.
|
9
|
+
Take a collection of same type objects. Pick a pivot point, aka, a field unique to each object that can be used as the key
|
10
|
+
for the hash.
|
11
|
+
|
12
|
+
I wrote this module to support development/testing techniques that I've grown use to. As a developer I am squarely in the
|
13
|
+
[classical, anti-mockist camp](https://agilewarrior.wordpress.com/2015/04/18/classical-vs-mockist-testing/). Harshed helps with that.
|
14
|
+
|
15
|
+
Eventually, I'd like to update this module to support the following features:
|
16
|
+
|
17
|
+
1. Support for JSON
|
18
|
+
2. Support for XML
|
19
|
+
3. Ability to pivot on a field not in the object being serialized.
|
20
|
+
4. Harshed DB support
|
21
|
+
5. Deal with the sure to be their defect of spaces on the pivot field
|
22
|
+
|
5
23
|
## Installation
|
6
24
|
|
7
25
|
Add this line to your application's Gemfile:
|
@@ -43,13 +61,14 @@ Or install it yourself as:
|
|
43
61
|
|
44
62
|
@heroes.to_disk
|
45
63
|
|
46
|
-
@heroes_reborn = Harshed.new(:character_name, storage_folder: 'characters')
|
64
|
+
@heroes_reborn = Harshed.new(:character_name, storage_folder: 'characters')
|
65
|
+
.from_disk
|
47
66
|
|
48
67
|
## Development
|
49
68
|
|
50
|
-
To run tests
|
69
|
+
To run tests:
|
51
70
|
|
52
|
-
$> rake
|
71
|
+
$> rake
|
53
72
|
|
54
73
|
## Contributing
|
55
74
|
|
data/Rakefile
CHANGED
@@ -1,26 +1,10 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'rake/testtask'
|
3
|
-
require 'reek/rake/task'
|
4
|
-
require 'rubocop/rake_task'
|
5
3
|
|
6
4
|
task default: :test
|
7
5
|
|
8
|
-
Reek::Rake::Task.new do |t|
|
9
|
-
t.fail_on_error = false
|
10
|
-
end
|
11
|
-
|
12
|
-
RuboCop::RakeTask.new
|
13
|
-
|
14
6
|
Rake::TestTask.new do |t|
|
15
7
|
t.libs << 'test'
|
16
8
|
t.test_files = FileList['test/**/test*.rb']
|
17
9
|
t.verbose = true
|
18
10
|
end
|
19
|
-
|
20
|
-
task :boom do
|
21
|
-
Rake::Task['test'].execute
|
22
|
-
puts 'Running Reek...'
|
23
|
-
Rake::Task['reek'].execute
|
24
|
-
puts
|
25
|
-
Rake::Task['rubocop'].execute
|
26
|
-
end
|
data/bin/console
ADDED
data/bin/setup
ADDED
data/data/.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
*.yml
|
2
|
+
*.yaml
|
data/harshed.gemspec
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'harshed'
|
4
|
+
require 'harshed/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'harshed'
|
8
8
|
spec.version = Harshed::VERSION
|
9
9
|
spec.authors = ['Folkengine']
|
10
10
|
spec.email = ['gaoler@electronicpanopticon.com']
|
11
|
+
spec.license = 'MIT'
|
11
12
|
|
12
13
|
spec.summary = 'Ruby Serializable Hashed Array Utility'
|
13
|
-
spec.description = ''
|
14
|
+
spec.description = 'Utility to quickly save and retrieve objects from disk'
|
14
15
|
spec.homepage = 'https://github.com/folkengine/harshed'
|
15
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
17
|
spec.require_paths = ['lib']
|
17
18
|
|
18
|
-
spec.
|
19
|
-
spec.add_development_dependency '
|
19
|
+
spec.add_runtime_dependency 'yamlable', '>= 0.0.2'
|
20
|
+
spec.add_development_dependency 'bundler', '>= 1.7.6'
|
21
|
+
spec.add_development_dependency 'rake', "~> 10.0"
|
20
22
|
end
|
data/lib/harshed.rb
CHANGED
@@ -1,101 +1,10 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'yamlable'
|
3
|
+
require 'harshed/harsh'
|
4
|
+
require 'harshed/version'
|
3
5
|
|
4
6
|
# Ruby Serializable Hashed Array Utility
|
5
|
-
|
6
|
-
include Yamlable
|
7
|
-
|
8
|
-
VERSION = '0.1.0'.freeze
|
9
|
-
|
10
|
-
attr_reader :hash, :key_to_map
|
11
|
-
|
12
|
-
def initialize(key_to_map, items = [],
|
13
|
-
storage_base: Harshed.default_base_folder,
|
14
|
-
storage_folder: '')
|
15
|
-
@key_to_map = key_to_map
|
16
|
-
@hash = {}
|
17
|
-
@storage_folder = storage_folder
|
18
|
-
@storage_base = storage_base
|
19
|
-
store(items)
|
20
|
-
end
|
21
|
-
|
22
|
-
def store(items)
|
23
|
-
# Hack to get around how Array() mangles Hashes and Structs
|
24
|
-
if items.is_a?(Array)
|
25
|
-
items.each { |item| store_item(item) }
|
26
|
-
else
|
27
|
-
store_item(items)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def store_item(item)
|
32
|
-
validate_type(item)
|
33
|
-
@hash[item.send(@key_to_map)] = item
|
34
|
-
end
|
35
|
-
|
36
|
-
def valid_type?(item)
|
37
|
-
@hash.values.last.class == item.class
|
38
|
-
end
|
39
|
-
|
40
|
-
def validate_type(item)
|
41
|
-
return if @hash.empty?
|
42
|
-
unless valid_type?(item)
|
43
|
-
raise TypeError "Harshed Object class types (#{last_class}/#{item_class}) must be the same."
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def to_a
|
48
|
-
@hash.values
|
49
|
-
end
|
50
|
-
|
51
|
-
def key?(key)
|
52
|
-
@hash.key?(key)
|
53
|
-
end
|
54
|
-
|
55
|
-
def value(my_key)
|
56
|
-
@hash[my_key]
|
57
|
-
end
|
58
|
-
|
59
|
-
def sample
|
60
|
-
@hash.values.sample
|
61
|
-
end
|
62
|
-
|
63
|
-
def from_disk
|
64
|
-
Dir["#{folder_path}/*.yml"].each do |filename|
|
65
|
-
yml = File.read(filename)
|
66
|
-
store(Psych.load(yml, filename))
|
67
|
-
end
|
68
|
-
self
|
69
|
-
end
|
70
|
-
|
71
|
-
# This method smells of :reek:NestedIterators
|
72
|
-
def to_disk
|
73
|
-
mkdir
|
74
|
-
@hash.each do |key, value|
|
75
|
-
File.open(filename(key), 'w') { |file| file.write(value.to_yaml) }
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def mkdir
|
80
|
-
Dir.mkdir(folder_path) unless Dir.exist?(folder_path)
|
81
|
-
end
|
82
|
-
|
83
|
-
def rm_r
|
84
|
-
FileUtils.remove_dir folder_path
|
85
|
-
end
|
86
|
-
|
87
|
-
def folder_path
|
88
|
-
if @storage_folder.empty?
|
89
|
-
File.join(@storage_base, @hash.values.first.class.to_s)
|
90
|
-
else
|
91
|
-
File.join(@storage_base, @storage_folder)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def filename(key)
|
96
|
-
File.join(folder_path, "#{key}.yml")
|
97
|
-
end
|
98
|
-
|
7
|
+
module Harshed
|
99
8
|
def self.default_base_folder
|
100
9
|
File.join(File.dirname(__FILE__), '..', 'data')
|
101
10
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Ruby Serializable Hashed Array Utility
|
2
|
+
module Harshed
|
3
|
+
class Harsh
|
4
|
+
include Yamlable
|
5
|
+
|
6
|
+
attr_reader :hash, :key_to_map
|
7
|
+
|
8
|
+
def initialize(key_to_map, items = [],
|
9
|
+
storage_base: Harshed.default_base_folder,
|
10
|
+
storage_folder: '')
|
11
|
+
@key_to_map = key_to_map
|
12
|
+
@hash = {}
|
13
|
+
@storage_folder = storage_folder
|
14
|
+
@storage_base = storage_base
|
15
|
+
store(items)
|
16
|
+
end
|
17
|
+
|
18
|
+
def store(items)
|
19
|
+
# Hack to get around how Array() mangles Hashes and Structs
|
20
|
+
if items.is_a?(Array)
|
21
|
+
items.each { |item| store_item(item) }
|
22
|
+
else
|
23
|
+
store_item(items)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def store_item(item)
|
28
|
+
validate_type(item)
|
29
|
+
@hash[item.send(@key_to_map)] = item
|
30
|
+
end
|
31
|
+
|
32
|
+
def valid_type?(item)
|
33
|
+
@hash.values.last.class == item.class
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate_type(item)
|
37
|
+
return if @hash.empty?
|
38
|
+
unless valid_type?(item)
|
39
|
+
raise TypeError "Harshed Object class types (#{last_class}/#{item_class}) must be the same."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_a
|
44
|
+
@hash.values
|
45
|
+
end
|
46
|
+
|
47
|
+
def key?(key)
|
48
|
+
@hash.key?(key)
|
49
|
+
end
|
50
|
+
|
51
|
+
def value(my_key)
|
52
|
+
@hash[my_key]
|
53
|
+
end
|
54
|
+
|
55
|
+
def sample
|
56
|
+
@hash.values.sample
|
57
|
+
end
|
58
|
+
|
59
|
+
def from_disk
|
60
|
+
Dir["#{folder_path}/*.yml"].each do |filename|
|
61
|
+
yml = File.read(filename)
|
62
|
+
store(Psych.load(yml, filename))
|
63
|
+
end
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
# This method smells of :reek:NestedIterators
|
68
|
+
def to_disk
|
69
|
+
mkdir
|
70
|
+
@hash.each do |key, value|
|
71
|
+
File.open(filename(key), 'w') { |file| file.write(value.to_yaml) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def mkdir
|
76
|
+
Dir.mkdir(folder_path) unless Dir.exist?(folder_path)
|
77
|
+
end
|
78
|
+
|
79
|
+
def rm_r
|
80
|
+
FileUtils.remove_dir folder_path
|
81
|
+
end
|
82
|
+
|
83
|
+
def folder_path
|
84
|
+
if @storage_folder.empty?
|
85
|
+
File.join(@storage_base, @hash.values.first.class.to_s)
|
86
|
+
else
|
87
|
+
File.join(@storage_base, @storage_folder)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def filename(key)
|
92
|
+
File.join(folder_path, "#{key}.yml")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harshed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Folkengine
|
@@ -10,20 +10,34 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: yamlable
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.2
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - "
|
31
|
+
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
33
|
+
version: 1.7.6
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- - "
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
40
|
+
version: 1.7.6
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,7 +52,7 @@ dependencies:
|
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '10.0'
|
41
|
-
description:
|
55
|
+
description: Utility to quickly save and retrieve objects from disk
|
42
56
|
email:
|
43
57
|
- gaoler@electronicpanopticon.com
|
44
58
|
executables: []
|
@@ -47,15 +61,21 @@ extra_rdoc_files: []
|
|
47
61
|
files:
|
48
62
|
- ".gitignore"
|
49
63
|
- ".rubocop.yml"
|
64
|
+
- ".travis.yml"
|
50
65
|
- Gemfile
|
51
66
|
- LICENSE
|
52
67
|
- README.md
|
53
68
|
- Rakefile
|
69
|
+
- bin/console
|
70
|
+
- bin/setup
|
54
71
|
- data/.gitignore
|
55
72
|
- harshed.gemspec
|
56
73
|
- lib/harshed.rb
|
74
|
+
- lib/harshed/harsh.rb
|
75
|
+
- lib/harshed/version.rb
|
57
76
|
homepage: https://github.com/folkengine/harshed
|
58
|
-
licenses:
|
77
|
+
licenses:
|
78
|
+
- MIT
|
59
79
|
metadata: {}
|
60
80
|
post_install_message:
|
61
81
|
rdoc_options: []
|