relishable 0.1 → 0.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.
Files changed (3) hide show
  1. data/lib/relish.rb +26 -0
  2. data/lib/relish/release.rb +122 -0
  3. metadata +4 -2
@@ -0,0 +1,26 @@
1
+ require "press"
2
+ require "relish/release"
3
+
4
+ module Relish
5
+ extend Press
6
+
7
+ def self.create(id, data)
8
+ pdfm __FILE__, __method__, id: id
9
+ Release.create(id, data)
10
+ end
11
+
12
+ def self.read(id, version)
13
+ pdfm __FILE__, __method__, id: id, version: version
14
+ Release.read(id, version)
15
+ end
16
+
17
+ def self.readall(id)
18
+ pdfm __FILE__, __method__, id: id
19
+ Release.readall(id)
20
+ end
21
+
22
+ def self.update(id, version, data)
23
+ pdfm __FILE__, __method__, id: id, version: version
24
+ Release.update(id, version, data)
25
+ end
26
+ end
@@ -0,0 +1,122 @@
1
+ require "press"
2
+ require "fog"
3
+
4
+ module Relish
5
+ class Release
6
+ extend Press
7
+
8
+ attr_accessor :items
9
+
10
+ def self.conf(*attrs)
11
+ attrs.each do |attr|
12
+ instance_eval "def #{attr}; @#{attr} ||= ENV['#{attr.upcase}'] || raise('missing configuration: #{attr.upcase}') end", __FILE__, __LINE__
13
+ end
14
+ end
15
+
16
+ conf :relish_aws_access_key,
17
+ :relish_aws_secret_key,
18
+ :relish_table_name
19
+
20
+ def self.schema(attrs)
21
+ attrs.each do |attr, type|
22
+ class_eval "def #{attr}; @items['#{attr}']['#{type}'] if @items.key? '#{attr}' end", __FILE__, __LINE__
23
+ class_eval "def #{attr}= value; @items['#{attr}'] = {'#{type}' => value} end", __FILE__, __LINE__
24
+ end
25
+ end
26
+
27
+ schema id: :S,
28
+ version: :N,
29
+ descr: :S,
30
+ user_id: :N,
31
+ slug_id: :S,
32
+ slug_version: :N,
33
+ stack: :S,
34
+ language_pack: :S,
35
+ env_json: :S,
36
+ pstable_json: :S,
37
+ addons_json: :S
38
+
39
+ def self.db
40
+ @db ||= Fog::AWS::DynamoDB.new(aws_access_key_id: relish_aws_access_key, aws_secret_access_key: relish_aws_secret_key)
41
+ end
42
+
43
+ def self.query_current_version(id)
44
+ response = db.query(relish_table_name, {S: id}, ConsistentRead: true, Limit: 1, ScanIndexForward: false)
45
+ if response.status != 200
46
+ raise('status: #{response.status}')
47
+ end
48
+ if response.body['Count'] == 1
49
+ response.body['Items'].first
50
+ end
51
+ end
52
+
53
+ def self.put_current_version(items)
54
+ response = db.put_item(relish_table_name, items, {Expected: {id: {Exists: false}, version: {Exists: false}}})
55
+ if response.status != 200
56
+ raise('status: #{response.status}')
57
+ end
58
+ end
59
+
60
+ def self.get_version(id, version)
61
+ response = db.get_item(relish_table_name, {HashKeyElement: {S: id}, RangeKeyElement: {N: version}})
62
+ if response.status != 200
63
+ raise('status: #{response.status}')
64
+ end
65
+ response.body['Item']
66
+ end
67
+
68
+ def self.put_version(id, version, items)
69
+ response = db.put_item(relish_table_name, items, {Expected: {id: {Value: {S: id}}, version: {Value: {N: version}}}})
70
+ if response.status != 200
71
+ raise('status: #{response.status}')
72
+ end
73
+ end
74
+
75
+ def self.create(id, data)
76
+ pdfm __FILE__, __method__, id: id
77
+ items = query_current_version(id)
78
+ release = new
79
+ if items.nil?
80
+ release.items = {}
81
+ release.id = id
82
+ release.version = "1"
83
+ else
84
+ release.items = items
85
+ release.version = (release.version.to_i + 1).to_s
86
+ end
87
+ data.each do |k, v|
88
+ release.send("#{k}=", v)
89
+ end
90
+ put_current_version(release.items)
91
+ release
92
+ end
93
+
94
+ def self.read(id, version)
95
+ pdfm __FILE__, __method__, id: id, version: version
96
+ items = get_version(id, version)
97
+ unless items.nil?
98
+ release = new
99
+ release.items = items
100
+ release
101
+ end
102
+ end
103
+
104
+ def self.readall(id)
105
+ pdfm __FILE__, __method__, id: id
106
+ end
107
+
108
+ def self.update(id, version, data)
109
+ pdfm __FILE__, __method__, id: id, version: version
110
+ items = get_version(id, version)
111
+ unless items.nil?
112
+ release = new
113
+ release.items = items
114
+ data.each do |k, v|
115
+ release.send("#{k}=", v)
116
+ end
117
+ put_version(id, version, release.items)
118
+ release
119
+ end
120
+ end
121
+ end
122
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relishable
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-05 00:00:00.000000000 Z
12
+ date: 2012-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: press
@@ -49,6 +49,8 @@ executables: []
49
49
  extensions: []
50
50
  extra_rdoc_files: []
51
51
  files:
52
+ - lib/relish/release.rb
53
+ - lib/relish.rb
52
54
  - Gemfile
53
55
  - Gemfile.lock
54
56
  homepage: http://github.com/heroku/relish