sqa 0.0.18 → 0.0.20

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7733f5cb84c4ccbad5e68105e818b35f1aca450fd97eeb3186cfb9a1962d44e
4
- data.tar.gz: a9b2bf2a0fa6a91de1367fd73beac6a28d263024ded37c216520120cc3181cc9
3
+ metadata.gz: eaf6c6d975b4bb899fc3f82e79b1fb87b6f4cdad17b19d7e2c5b8300d8cce107
4
+ data.tar.gz: 2b06b6ffcc711e4d593e18ba7f68508bfb423d60be9d4358ef0953ce2a8983d7
5
5
  SHA512:
6
- metadata.gz: 27280c675c37a92f450d5108c40848cc65a3975e8e783ca25cbbee0bfa18b1c570d697c4c33d4fd73d84c57d717df3e6cbb8667c51fb3ed8fe48df509f9d1f7e
7
- data.tar.gz: 475333a102814f5bef21dbea61126bf6b0b61836cccb6a333acc2dbcaa2ba5bc14c8c9191b31065777ca984fcec883fb37da36b07a9121f2afeb0a0004bc841b
6
+ metadata.gz: 9ddbd102bb0aa138c39177f4900159e5767739c60943e3ea5d03c07b0cfd1cdfa6cd78db3ea13f502aeee4a31826be64fb36e3d8f9ffa895c30263d5577e6759
7
+ data.tar.gz: 3b9365d693970575b0d922deccb2c37261ebb4a0ffe5c35109522e85ad861410d2391914b6a3ea7ff4b01d84be721470ee3dc783086517a0e55de84161e2d1c4
@@ -0,0 +1 @@
1
+ be42cf0864e1e35a06e177102943577683057e0023751a35421939fc6e096b0e1d16d2e218e33c9c363b45a5a9f57ed22d4361766365154433f5eb371210fb48
@@ -0,0 +1 @@
1
+ 46d87a1698df7159658dbb5be0d8d3b50209d85cac5085c5d7ee904b1d095c955a25f5f89a79f1af9a0a8c64cda51db58ebb8ae0b23ded2f8d4d680d8ed49606
@@ -0,0 +1,58 @@
1
+ # sqa/lib/patches/string.rb
2
+
3
+
4
+ #####################################################################
5
+ ###
6
+ ## File: string.rb
7
+ ## Desc: Monkey to the String class.
8
+ #
9
+
10
+ class String
11
+
12
+ ##################################
13
+ ## Convert CamelCase to camel_case
14
+ def to_underscore
15
+ self.gsub(/::/, '/')
16
+ .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
17
+ .gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("- ", "_")
18
+ .downcase
19
+ end
20
+
21
+ alias :to_snakecase :to_underscore
22
+ alias :snakecase :to_underscore
23
+ alias :snake_case :to_underscore
24
+ alias :underscore :to_underscore
25
+
26
+
27
+ ##################################
28
+ ## Convert camel_case to CamelCase
29
+ def to_camelcase
30
+ self.gsub(/\/(.?)/) { "::" + $1.upcase }
31
+ .gsub(/(^|_)(.)/) { $2.upcase }
32
+ end
33
+
34
+ alias :camelcase :to_camelcase
35
+ alias :camelize :to_camelcase
36
+
37
+
38
+ ##################################
39
+ ## Convert "CamelCase" into CamelCase
40
+ def to_constant
41
+ names = self.split('::')
42
+ names.shift if names.empty? || names.first.empty?
43
+
44
+ constant = Object
45
+ names.each do |name|
46
+ if '1.9' == RUBY_VERSION[0,3]
47
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
48
+ else
49
+ constant = constant.const_get(name) || constant.const_missing(name)
50
+ end
51
+ end
52
+ constant
53
+ end
54
+
55
+ alias :constantize :to_constant
56
+ end
57
+
58
+
@@ -22,11 +22,51 @@ class SQA::DataFrame
22
22
  attr_accessor :data
23
23
 
24
24
  # Expects a Hash of Arrays (hofa)
25
- def initialize(a_hash={})
26
- @data = Data.new(a_hash)
25
+ # mapping: and transformers: are optional
26
+ # mapping is a Hash { old_key => new_key }
27
+ # transformers is also a Hash { key => Proc}
28
+ def initialize(
29
+ aofh_or_hofa= {}, # Array of Hashes or hash of array or hash
30
+ mapping: {}, # { old_key => new_key }
31
+ transformers: {} # { key => Proc }
32
+ )
33
+
34
+ if aofh_or_hofa.is_a? Hash
35
+ initialize_hofa(aofh_or_hofa, mapping: mapping)
36
+
37
+ elsif aofh_or_hofa.is_a?(Array) &&
38
+ aofh_or_hofa.first.is_a?(Hash)
39
+ initialize_aofh(aofh_or_hofa, mapping: mapping)
40
+
41
+ else
42
+ raise BadParameterError, "Expecting Hash or Array of Hashes got: #{aofh_or_hofa.class}"
43
+ end
44
+
45
+ coerce_vectors!(transformers) unless transformers.empty?
46
+ end
47
+
48
+
49
+ def initialize_aofh(aofh, mapping:)
50
+ hofa = self.class.aofh_to_hofa(
51
+ aofh,
52
+ mapping: mapping
53
+ )
54
+
55
+ initialize_hofa(hofa, mapping: mapping)
56
+ end
57
+
58
+
59
+ def initialize_hofa(hofa, mapping:)
60
+ hofa = self.class.normalize_keys(
61
+ hofa,
62
+ adapter_mapping: mapping
63
+ ) unless mapping.empty?
64
+
65
+ @data = Data.new(hofa)
27
66
  end
28
67
 
29
68
 
69
+
30
70
  def to_csv(path_to_file)
31
71
  CSV.open(path_to_file, 'w') do |csv|
32
72
  csv << keys
@@ -74,9 +114,11 @@ class SQA::DataFrame
74
114
  def_delegator :@data, :[]=, :[]=
75
115
 
76
116
 
117
+ # same as values.transpose
118
+ # TODO: do benchmark to see if the transpose method if faster
77
119
  def rows
78
120
  result = []
79
- (0..size - 1).each do |x|
121
+ size.times do |x|
80
122
  entry = row(x)
81
123
  result << entry
82
124
  end
@@ -110,14 +152,14 @@ class SQA::DataFrame
110
152
  end
111
153
 
112
154
 
113
- def append(new_df)
155
+ def append!(new_df)
114
156
  raise(BadParameterError, "Key mismatch") if keys != new_df.keys
115
157
 
116
158
  keys.each do |key|
117
159
  @data[key] += new_df[key]
118
160
  end
119
161
  end
120
- alias_method :concat, :append
162
+ alias_method :concat!, :append!
121
163
 
122
164
 
123
165
  # Creates a new instance with new keys
@@ -144,7 +186,7 @@ class SQA::DataFrame
144
186
  # price: -> (v) {v.to_f.round(3)}
145
187
  # }
146
188
  #
147
- def coerce_vectors(transformers)
189
+ def coerce_vectors!(transformers)
148
190
  transformers.each_pair do |key, transformer|
149
191
  @data[key].map!{|v| transformer.call(v)}
150
192
  end
@@ -170,8 +212,8 @@ class SQA::DataFrame
170
212
  #################################################
171
213
  class << self
172
214
 
173
- def append(base_df, other_df)
174
- base_df.append(other_df)
215
+ def concat(base_df, other_df)
216
+ base_df.concat!(other_df)
175
217
  end
176
218
 
177
219
 
@@ -191,7 +233,7 @@ class SQA::DataFrame
191
233
  end
192
234
 
193
235
  unless transformers.empty?
194
- df.coerce_vectors(transformers)
236
+ df.coerce_vectors!(transformers)
195
237
  end
196
238
 
197
239
  df
@@ -200,11 +242,9 @@ class SQA::DataFrame
200
242
 
201
243
  def from_aofh(aofh, mapping: {}, transformers: {})
202
244
  new(
203
- aofh_to_hofa(
204
- aofh,
205
- mapping: mapping,
206
- transformers: transformers
207
- )
245
+ aofh,
246
+ mapping: mapping,
247
+ transformers: transformers
208
248
  )
209
249
  end
210
250
 
data/lib/sqa/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SQA
4
- VERSION = "0.0.18"
4
+ VERSION = "0.0.20"
5
5
 
6
6
  class << self
7
7
  def version
data/lib/sqa.rb CHANGED
@@ -16,8 +16,7 @@ end
16
16
  #############################################
17
17
  ## Additional Libraries
18
18
 
19
- require 'active_support/core_ext/string'
20
- require 'alphavantage' # TODO: add rate limiter to it; ** PR submitted! **
19
+ require 'alphavantage'
21
20
  require 'api_key_manager'
22
21
  require 'amazing_print'
23
22
  require 'faraday'
@@ -31,6 +30,12 @@ require 'tty-option'
31
30
  require 'tty-table'
32
31
 
33
32
 
33
+ #############################################
34
+ ## Apply core class monkey patches
35
+
36
+ require_relative "patches/string.rb"
37
+
38
+
34
39
  #############################################
35
40
  ## SQA soecufuc code
36
41
 
@@ -46,7 +51,7 @@ require_relative 'sqa/init.rb'
46
51
 
47
52
  require_relative "sqa/config"
48
53
  require_relative "sqa/constants" # SMELL: more app than gem
49
- require_relative "sqa/data_frame" # TODO: drop the daru gem
54
+ require_relative "sqa/data_frame"
50
55
  require_relative "sqa/indicator"
51
56
  require_relative "sqa/portfolio"
52
57
  require_relative "sqa/strategy"
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-18 00:00:00.000000000 Z
11
+ date: 2023-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 7.0.6
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 7.0.6
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: alphavantage
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -243,7 +229,9 @@ files:
243
229
  - checksums/sqa-0.0.15.gem.sha512
244
230
  - checksums/sqa-0.0.17.gem.sha512
245
231
  - checksums/sqa-0.0.18.gem.sha512
232
+ - checksums/sqa-0.0.19.gem.sha512
246
233
  - checksums/sqa-0.0.2.gem.sha512
234
+ - checksums/sqa-0.0.20.gem.sha512
247
235
  - checksums/sqa-0.0.3.gem.sha512
248
236
  - checksums/sqa-0.0.4.gem.sha512
249
237
  - checksums/sqa-0.0.5.gem.sha512
@@ -277,6 +265,7 @@ files:
277
265
  - docs/stochastic_oscillator.md
278
266
  - docs/strategy.md
279
267
  - docs/true_range.md
268
+ - lib/patches/string.rb
280
269
  - lib/sqa.rb
281
270
  - lib/sqa/activity.rb
282
271
  - lib/sqa/analysis.rb