coinmarketcap_free 0.4.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f99259c2770c1da474bbe12a544a7f58456937344edc89c8f0ff99c50b266610
4
- data.tar.gz: 70bb17060a85b994ec966d869eb6c64a621c504ab9ec70cd0957b6a43d875144
3
+ metadata.gz: 84d7327edba1a064c58e5b76ec5e5046519e7226fa91bc4e0f98dfb35c3fb34b
4
+ data.tar.gz: cecb71581b982b9fc34afab19606d085278e57ce39f4ecb2e497ce1abdafd2a2
5
5
  SHA512:
6
- metadata.gz: c5b48661bb1c59169e47210369320616695ea577faee4fb6b0a3bf3bcb8f413ed46cdaaea0d419fa6cceb74c9ae0e1e1a654175bd1224bcfc903cc6e3be27795
7
- data.tar.gz: ea3166026893e67d2d802dd16837ff47edde03d1a4bdee6cb8744c3fe6fc6bb43b714e4a8fda5e36eb8e67eba9815cd17ef21cf632e3825e0820c81ed198a300
6
+ metadata.gz: 976ec0dfecfe6cc6d553937d42ed6afac390100b94d0e9d8a4b2e8c57bb6b045b1588494eaa8dde8c30441dc0d6d15753a3cc722c6b33e1758c4e9d7f29203ac
7
+ data.tar.gz: 16818ff459c549b658992e4ffefef6464103edbd57ef6ad969a538e1298316f6b900d67c24383e52ff968ecdc6c2a7298c5c2dc5b0cff976d7817549b9791b8c
data/.DS_Store ADDED
Binary file
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coinmarketcap_free (0.4.0)
4
+ coinmarketcap_free (1.0.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -15,10 +15,75 @@ If bundler is not being used to manage dependencies, install the gem by executin
15
15
  ## How to use?
16
16
 
17
17
  ``` Ruby
18
- list = CoinmarketcapFree::Coin.list
18
+ coins = CoinmarketcapFree::Coin.list
19
19
  ```
20
20
 
21
- Result:
21
+ or
22
+
23
+ ``` Ruby
24
+ coins = CoinmarketcapFree.coins
25
+ ```
26
+
27
+ ####Result:
28
+
29
+ Model:
30
+ ```Ruby
31
+ [...
32
+ #<CoinmarketcapFree::Coin:0x00000001064388a0
33
+ @cmc_rank=1,
34
+ @id=1,
35
+ @market_pair_count=10861,
36
+ @name=#<struct Struct::FullName name="Bitcoin", symbol="BTC", slug="bitcoin">,
37
+ @quotes=
38
+ [#<struct Struct::Quotes
39
+ name="USD",
40
+ price=66949.41999188314,
41
+ volume_24h=92116022162.1663,
42
+ market_cap=1315314616282.593,
43
+ percent_change_1h=0.39277979,
44
+ percent_change_24h=3.06216236,
45
+ percent_change_7d=10.037655,
46
+ percent_change_30d=56.63354406,
47
+ percent_change_60d=52.21058851,
48
+ percent_change_90d=54.57419557,
49
+ percent_change_1y=197.24478021,
50
+ last_updated=#<DateTime: 2024-03-06T17:46:00+00:00 ((2460376j,63960s,0n),+0s,2299161j)>>],
51
+ @state=#<struct Struct::State last_updated=#<DateTime: 2024-03-06T17:46:00+00:00 ((2460376j,63960s,0n),+0s,2299161j)>, added=#<DateTime: 2010-07-13T00:00:00+00:00 ((2455391j,0s,0n),+0s,2299161j)>>,
52
+ @supply=#<struct Struct::Supply circulating=19646393.0, total=19646393.0, maximum=21000000.0>,
53
+ @tags=
54
+ ["mineable",
55
+ "pow",
56
+ "sha-256",
57
+ "store-of-value",
58
+ "state-channel",
59
+ "coinbase-ventures-portfolio",
60
+ "three-arrows-capital-portfolio",
61
+ "polychain-capital-portfolio",
62
+ "binance-labs-portfolio",
63
+ "blockchain-capital-portfolio",
64
+ "boostvc-portfolio",
65
+ "cms-holdings-portfolio",
66
+ "dcg-portfolio",
67
+ "dragonfly-capital-portfolio",
68
+ "electric-capital-portfolio",
69
+ "fabric-ventures-portfolio",
70
+ "framework-ventures-portfolio",
71
+ "galaxy-digital-portfolio",
72
+ "huobi-capital-portfolio",
73
+ "alameda-research-portfolio",
74
+ "a16z-portfolio",
75
+ "1confirmation-portfolio",
76
+ "winklevoss-capital-portfolio",
77
+ "usv-portfolio",
78
+ "placeholder-ventures-portfolio",
79
+ "pantera-capital-portfolio",
80
+ "multicoin-capital-portfolio",
81
+ "paradigm-portfolio",
82
+ "bitcoin-ecosystem",
83
+ "ftx-bankruptcy-estate"]>]
84
+ ```
85
+
86
+ Json data:
22
87
  ``` JSON
23
88
  {
24
89
  "data": {
@@ -103,70 +168,115 @@ Result:
103
168
  }
104
169
  ```
105
170
 
106
- If you want to sort in ascending, just write parameter:
171
+ Get a list of cryptocurrencies
172
+ ``` Ruby
173
+ list = CoinmarketcapFree.coins(limit: 100, start: 1)
174
+ ```
175
+
176
+ If you want to sort in ascending:
107
177
 
108
178
  ``` Ruby
109
- list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc')
179
+ list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'asc')
110
180
  ```
111
181
 
112
- You can also adding sort by:
182
+ or in descending
113
183
 
114
184
  ``` Ruby
115
- list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc', sort_by: 'name')
185
+ list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'desc')
116
186
  ```
117
187
 
118
- Convert all cryptocurrencies to USD,BTC,ETH:
188
+ Also you can sort by name with ascending:
119
189
 
120
190
  ``` Ruby
121
- list = CoinmarketcapFree::Coin.list(limit: 100,
122
- start: 1,
123
- sort_type:'asc',
124
- sort_by: 'name',
125
- convert: 'USD,BTC,ETH')
191
+ list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'asc', sort_by: 'name')
126
192
  ```
127
193
 
194
+ Convert cryptocurrency to USD:
128
195
 
129
- Parameters for CoinmarketcapFree::Coin.list:
196
+ ``` Ruby
197
+ list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD')
198
+ ```
199
+
200
+ or together
201
+
202
+ ``` Ruby
203
+ list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD,BTC,ETH')
204
+ ```
205
+
206
+ Parameters for ```CoinmarketcapFree::Coin.list``` or ```CoinmarketcapFree.coins```:
130
207
 
131
208
  | Name | Type | Description | Examples |
132
209
  |:------------------------------|:---------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------|
133
- | ```limit:``` | Integer. | Optionally specify the number of results to return. Use this parameter and the "start" parameter to determine your own pagination size. ||
134
- | ```start:``` | Integer. | Optionally offset the start (1-based index) of the paginated list of items to return. ||
135
- | ```sort_by:``` | String. | Default: ```market_cap```. (```rank```, ```name```, ```symbol```, ```date_added```, ```market_cap```, ```market_cap_strict```, ```price```, ```circulating_supply```, ```total_supply```, ```max_supply```, ```num_market_pairs```, ```volume_24h```, ```percent_change_1h```, ```percent_change_24h```, ```percent_change_7d```, ```market_cap_by_total_supply_strict```, ```volume_7d```, ```volume_30d```). What field to sort the list of cryptocurrencies by. ||
136
- | ```sort_type:``` | String. | Default: ```desc```. (```asc``` or ```desc```). The direction in which to order cryptocurrencies against the specified sort. ||
137
- | ```convert:``` | String. | Default: ```USD,BTC,ETH``` . Select cryptocurrencies to exchange (```AUD```, ```BRL```, ```CAD```, ```CHF```, ```CLP```, ```CNY```, ```CZK```, ```DKK```, ```EUR```, ```GBP```, ```HKD```, ```HUF```, ```IDR```, ```ILS```, ```INR```, ```JPY```, ```KRW```, ```MXN```, ```MYR```, ```NOK```, ```NZD```, ```PHP```, ```PKR```, ```PLN```, ```RUB```, ```SEK```, ```SGD```, ```THB```, ```TRY```, ```TWD```, ```ZAR```). | ```USD``` or ```USD,BTC,ETH``` |
138
- | ```crypto_type:``` | String. | Default: ```all```. (```all```, ```coins```, ```tokens```). The type of cryptocurrency to include. ||
139
- | ```tag_type:``` | String. | Default: ```all```. (```all```, ```defi```, ```filesharing```). The tag of cryptocurrency to include. ||
140
- | ```audited:``` | Boolean. | Show audited (true) or not (false) ||
141
- | ```aux:``` | String. | Optionally specify a comma-separated list of supplemental data fields to return. Pass ```ath, atl, high24h, low24h, num_market_pairs, cmc_rank, date_added, max_supply, circulating_supply, total_supply, volume_7d, volume_30d, self_reported_circulating_supply, self_reported_market_cap``` to include all auxiliary fields. | ```ath``` or ```ath, atl, high24h, low24h``` |
142
- | ```tags:``` | string. | If you want to see cryptocurrencies that can be mined, just type ```mineable```. ||
143
- | ```volume24h_range:``` | String. | Optionally specify a threshold 24 hour USD volume to filter results by. | ```0~100000000000000000``` |
144
- | ```percent_change24h_range:``` | String. | Optionally specify a threshold 24 hour percent change to filter results by. | ```0~100``` or ```-10~100``` |
145
- | ```circulating_supply_range:``` | String. | Optionally specify a threshold circulating supply to filter results by. | ```0~100000000000000000``` |
146
- | ```price_range:``` | String. | Optionally specify a threshold USD price to filter results by. | ```0~100000000000000000``` |
147
- | ```market_cap_range:``` | String. | Optionally specify a threshold market cap to filter results by. | ```0~100000000000000000``` |
210
+ | ```limit:``` | Integer | Optionally specify the number of results to return. Use this parameter and the "start" parameter to determine your own pagination size. ||
211
+ | ```start:``` | Integer | Optionally offset the start (1-based index) of the paginated list of items to return. ||
212
+ | ```sort_by:``` | String | Default: ```market_cap```. (```rank```, ```name```, ```symbol```, ```date_added```, ```market_cap```, ```market_cap_strict```, ```price```, ```circulating_supply```, ```total_supply```, ```max_supply```, ```num_market_pairs```, ```volume_24h```, ```percent_change_1h```, ```percent_change_24h```, ```percent_change_7d```, ```market_cap_by_total_supply_strict```, ```volume_7d```, ```volume_30d```). What field to sort the list of cryptocurrencies by. ||
213
+ | ```sort_type:``` | String | Default: ```desc```. (```asc``` or ```desc```). The direction in which to order cryptocurrencies against the specified sort. ||
214
+ | ```convert:``` | String | Default: ```USD``` . Select cryptocurrencies to exchange (```AUD```, ```BRL```, ```CAD```, ```CHF```, ```CLP```, ```CNY```, ```CZK```, ```DKK```, ```EUR```, ```GBP```, ```HKD```, ```HUF```, ```IDR```, ```ILS```, ```INR```, ```JPY```, ```KRW```, ```MXN```, ```MYR```, ```NOK```, ```NZD```, ```PHP```, ```PKR```, ```PLN```, ```RUB```, ```SEK```, ```SGD```, ```THB```, ```TRY```, ```TWD```, ```ZAR```). | ```USD``` or together ```USD,BTC,ETH``` |
215
+ | ```crypto_type:``` | String | Default: ```all```. (```all```, ```coins```, ```tokens```). The type of cryptocurrency to include. ||
216
+ | ```tag_type:``` | String | Default: ```all```. (```all```, ```defi```, ```filesharing```). The tag of cryptocurrency to include. ||
217
+ | ```audited:``` | Boolean | Show audited (true) or not (false) ||
218
+ | ```tags:``` | String | If you want to see cryptocurrencies that can be mined, just type ```mineable```. ||
219
+ | ```volume24h_range:``` | String | Optionally specify a threshold 24 hour USD volume to filter results by. | ```0~100000000000000000``` |
220
+ | ```percent_change24h_range:``` | String | Optionally specify a threshold 24 hour percent change to filter results by. | ```0~100``` or ```-10~100``` |
221
+ | ```circulating_supply_range:``` | String | Optionally specify a threshold circulating supply to filter results by. | ```0~100000000000000000``` |
222
+ | ```price_range:``` | String | Optionally specify a threshold USD price to filter results by. | ```0~100000000000000000``` |
223
+ | ```market_cap_range:``` | String | Optionally specify a threshold market cap to filter results by. | ```0~100000000000000000``` |
148
224
 
149
225
  ### Returns an interval of historic market quotes:
150
226
 
151
227
  ``` Ruby
152
- coin = CoinmarketcapFree::CoinHistory.custom_time(1, '1D')
153
- coin = CoinmarketcapFree::CoinHistory.custom_time(1, '1668981600~1671659999')
228
+ histories = CoinmarketcapFree::CoinHistory.custom_time(id_coin, '1D')
229
+ histories = CoinmarketcapFree::CoinHistory.custom_time(id_coin, '1668981600~1671659999')
154
230
  ```
155
231
 
156
- or
232
+ or short
157
233
 
158
234
  ``` Ruby
159
- coin = CoinmarketcapFree::CoinHistory.interval_day(1)
160
- coin = CoinmarketcapFree::CoinHistory.interval_seven_days(1)
161
- coin = CoinmarketcapFree::CoinHistory.interval_one_month(1)
162
- coin = CoinmarketcapFree::CoinHistory.interval_three_months(1)
163
- coin = CoinmarketcapFree::CoinHistory.interval_one_year(1)
164
- coin = CoinmarketcapFree::CoinHistory.interval_current_year(1)
165
- coin = CoinmarketcapFree::CoinHistory.interval_all_time(1)
235
+ histories = CoinmarketcapFree.coin_histories(id_coin, '1D')
236
+ histories = CoinmarketcapFree.coin_histories(id_coin, '1668981600~1671659999')
166
237
  ```
167
238
 
168
- Result:
169
- ``` JSON
239
+ Also you can call method like this:
240
+
241
+ ``` Ruby
242
+ histories = CoinmarketcapFree::CoinHistory.one_day(id_coin)
243
+ histories = CoinmarketcapFree::CoinHistory.seven_days(id_coin)
244
+ histories = CoinmarketcapFree::CoinHistory.one_month(id_coin)
245
+ histories = CoinmarketcapFree::CoinHistory.three_months(id_coin)
246
+ histories = CoinmarketcapFree::CoinHistory.one_year(id_coin)
247
+ histories = CoinmarketcapFree::CoinHistory.current_year(id_coin)
248
+ histories = CoinmarketcapFree::CoinHistory.all(id_coin)
249
+ ```
250
+
251
+ or in model ```CoinmarketcapFree::Coin```
252
+
253
+ ``` Ruby
254
+ coin = CoinmarketcapFree::Coin.list.first
255
+ histories = coin.histories('1D')
256
+ histories = coin.one_day
257
+ histories = coin.seven_days
258
+ histories = coin.one_month
259
+ histories = coin.three_months
260
+ histories = coin.one_year
261
+ histories = coin.current_year
262
+ histories = coin.all
263
+ ```
264
+
265
+ ####Result:
266
+
267
+ Model:
268
+
269
+ ```Ruby
270
+ [... #<CoinmarketcapFree::CoinHistory:0x0000000106479530
271
+ @market_cap=1317962149986.5,
272
+ @price=67084.17926825049,
273
+ @time=2024-03-06 19:50:10 +0200,
274
+ @totaly_supply=19646392.999999978,
275
+ @volume_24h=92029823321.77837>]
276
+ ```
277
+
278
+ Json:
279
+ ```JSON
170
280
  {
171
281
  "data": {
172
282
  "points": {
@@ -198,22 +308,21 @@ Result:
198
308
 
199
309
  ```
200
310
 
201
- Parameters for CoinmarketcapFree::CoinHistory.custom_time:
311
+ Parameters for ```CoinmarketcapFree::CoinHistory.custom_time``` or ```CoinmarketcapFree.coin_histories```:
202
312
 
203
313
  | Name | Type | Description | Examples |
204
314
  |:-----------------|:---------|:----------------------------------------------|:-------------------------------------------------------------------------------------------------------------------|
205
- | ```id``` | Integer. | Cryptocurrency identifier from coinmarketcap. | Bitcoin has the number 1 |
206
- | ```range_time``` | String. | Range time. | ```1D```, ```7D```, ```1M```, ```3M```, ```1Y```, ```YTD```, ```ALL``` or custom range ```1668981600~1671659999``` |
315
+ | ```id``` | Integer | Cryptocurrency identifier from coinmarketcap. | Bitcoin has id 1 |
316
+ | ```range_time``` | String | Range time. | ```1D```, ```7D```, ```1M```, ```3M```, ```1Y```, ```YTD```, ```ALL``` or custom range ```1668981600~1671659999``` |
207
317
 
208
- ### Generation a link to access the picture:
318
+ ### Generation a link:
209
319
 
210
320
  ``` Ruby
211
- logo_coin_url = CoinmarketcapFree::Icon.generate_url(1, 64)
321
+ coin = CoinmarketcapFree.coins.first # take first coin
322
+ icon = coin.get_icon(64) # generate string uri
212
323
  ```
213
324
 
214
- ``` Ruby
215
- "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png"
216
- ```
325
+ Result string: ```https://s2.coinmarketcap.com/static/img/coins/64x64/1.png```
217
326
 
218
327
  | Name | Type | Description | Examples |
219
328
  |:-----------------|:---------|:----------------------------------------------|:-------------------------------------------------------------------------------------------------------------------|
@@ -0,0 +1,29 @@
1
+ module CoinmarketcapFree
2
+ class Coin
3
+ # Create all methods for each time interval
4
+ CoinHistory::INTERVAL_TIME.each do |key, value|
5
+ class_eval("def #{key}; histories('#{value}'); end", __FILE__, __LINE__)
6
+ end
7
+
8
+ # Get the full history of cryptocurrencies and their prices.
9
+ #
10
+ # coin = CoinmarketcapFree::Coin.list.first
11
+ # histories = coin.histories('1D')
12
+ #
13
+ # or
14
+ #
15
+ # histories = coin.one_day
16
+ # histories = coin.seven_days
17
+ # histories = coin.one_month
18
+ # histories = coin.three_months
19
+ # histories = coin.one_year
20
+ # histories = coin.current_year
21
+ # histories = coin.all
22
+ #
23
+ # @param interval [String] Select time interval. ('1D', '7D', '1M', '3M', '1Y', 'YTD', 'ALL' or custom '1668981600~1671659999')
24
+ # @return [Array<CoinmarketcapFree::CoinHistory>] Return CoinHistory object
25
+ def histories(interval)
26
+ CoinHistory.custom_time(@id, interval)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CoinmarketcapFree
4
+ class Coin
5
+ # Generate a URI icon of a coin
6
+ #
7
+ # coin = CoinmarketcapFree::Coin.list.first
8
+ # logo = coin.get_icon(64) # size 64x64
9
+ #
10
+ # Result:
11
+ #
12
+ # "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png"
13
+ #
14
+ # @param [Integer] id_coin Identify coin. For example, bitcoin has 1
15
+ # @param [Integer] size Choose one size: 64, 128, 200
16
+ # @return [String] Return URI from coinmarketcap
17
+ def get_icon(size)
18
+ size_x_size = case size
19
+ when 64, 128, 200
20
+ "#{size}x#{size}"
21
+ else
22
+ raise ArgumentError, "Can't find this value: #{size}"
23
+ end
24
+ "https://s2.coinmarketcap.com/static/img/coins/#{size_x_size}/#{@id}.png"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,63 @@
1
+ module CoinmarketcapFree
2
+ class Coin
3
+ FullName = Struct.new('FullName',
4
+ :name,
5
+ :symbol,
6
+ :slug) do
7
+ def self.convert_json(data)
8
+ FullName.new(data['name'],
9
+ data['symbol'],
10
+ data['slug'])
11
+ end
12
+ end
13
+
14
+ Supply = Struct.new("Supply",
15
+ :circulating,
16
+ :total,
17
+ :maximum) do
18
+ def self.convert_json(data)
19
+ Supply.new(data['circulatingSupply'],
20
+ data['totalSupply'],
21
+ data['maxSupply'])
22
+ end
23
+ end
24
+
25
+ State = Struct.new("State",
26
+ :last_updated,
27
+ :added) do
28
+ def self.convert_json(data)
29
+ State.new(DateTime.parse(data['lastUpdated']),
30
+ DateTime.parse(data['dateAdded']))
31
+ end
32
+ end
33
+
34
+ Quotes = Struct.new("Quotes",
35
+ :name,
36
+ :price,
37
+ :volume_24h,
38
+ :market_cap,
39
+ :percent_change_1h,
40
+ :percent_change_24h,
41
+ :percent_change_7d,
42
+ :percent_change_30d,
43
+ :percent_change_60d,
44
+ :percent_change_90d,
45
+ :percent_change_1y,
46
+ :last_updated) do
47
+ def self.convert_json(data)
48
+ Quotes.new(data['name'],
49
+ data['price'],
50
+ data['volume24h'],
51
+ data['marketCap'],
52
+ data['percentChange1h'],
53
+ data['percentChange24h'],
54
+ data['percentChange7d'],
55
+ data['percentChange30d'],
56
+ data['percentChange60d'],
57
+ data['percentChange90d'],
58
+ data['percentChange1y'],
59
+ DateTime.parse(data['lastUpdated']))
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,18 +1,65 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'helper'
4
+ require_relative 'coin/icon'
5
+ require_relative 'coin/model'
6
+ require_relative 'coin_history'
7
+ require_relative 'coin/histories'
4
8
 
5
9
  module CoinmarketcapFree
6
- # All about cryptocurrencies and their prices.
7
- module Coin
8
- URI_API = "#{BASE_URI}#{VERSION_API}/cryptocurrency/listing"
10
+ # Model for Cryptocurrency
11
+ class Coin
12
+ attr_accessor :id,
13
+ :name,
14
+ :tags,
15
+ :cmc_rank,
16
+ :market_pair_count,
17
+ :supply,
18
+ :state,
19
+ :quotes
20
+
21
+ def initialize(id, name, tags, cmc_rank, market_pair_count, supply, state, quotes)
22
+ @id = id
23
+ @name = name
24
+ @tags = tags
25
+ @cmc_rank = cmc_rank
26
+ @market_pair_count = market_pair_count
27
+ @supply = supply
28
+ @state = state
29
+ @quotes = quotes
30
+ end
9
31
 
10
32
  class << self
11
33
  # Get a list of cryptocurrencies
12
34
  #
13
35
  # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1)
14
36
  #
15
- # Result json:
37
+ # If you want to sort in ascending, just write parameter:
38
+ #
39
+ # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc')
40
+ #
41
+ # or in descending
42
+ #
43
+ # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'desc')
44
+ #
45
+ # Or sort by name with ascending:
46
+ #
47
+ # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc', sort_by: 'name')
48
+ #
49
+ # Convert cryptocurrency to USD:
50
+ #
51
+ # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, convert: 'USD')
52
+ #
53
+ # or together
54
+ #
55
+ # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, convert: 'USD,BTC,ETH')
56
+ #
57
+ # Also you can get all histories of cryptocurrency:
58
+ #
59
+ # coin = CoinmarketcapFree::Coin.list(limit: 100, start: 1).first
60
+ # coin.histories('1D')
61
+ #
62
+ # Result json data:
16
63
  #
17
64
  # {
18
65
  # "data": {
@@ -101,24 +148,6 @@ module CoinmarketcapFree
101
148
  # 'totalCount' - Total number of cryptocurrencies
102
149
  # 'status' - Standardized status object for API calls.
103
150
  #
104
- # If you want to sort in ascending, just write parameter:
105
- #
106
- # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc')
107
- #
108
- # or
109
- #
110
- # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'desc')
111
- #
112
- # You can also adding sort by:
113
- #
114
- # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, sort_type:'asc', sort_by: 'name')
115
- #
116
- # Convert cryptocurrency to::
117
- #
118
- # list = CoinmarketcapFree::Coin.list(limit: 100, start: 1, convert: 'USD,BTC,ETH')
119
- #
120
- #
121
- # @return [String]
122
151
  # @param start [Integer] Optionally offset the start (1-based index) of the paginated list of items to return.
123
152
  # @param limit [Integer] Optionally specify the number of results to return. Use this parameter and the 'start' parameter to determine your own pagination size.
124
153
  # @param sort_by [String] What field to sort the list of cryptocurrencies by. ('rank', 'name', 'symbol', 'date_added', 'market_cap', 'market_cap_strict', 'price', 'circulating_supply', 'total_supply', 'max_supply', 'num_market_pairs', 'volume_24h', 'percent_change_1h', 'percent_change_24h', 'percent_change_7d', 'market_cap_by_total_supply_strict', 'volume_7d', 'volume_30d")
@@ -127,14 +156,48 @@ module CoinmarketcapFree
127
156
  # @param crypto_type [String] The type of cryptocurrency to include. ('all', 'coins', 'tokens')
128
157
  # @param tag_type [String] The tag of cryptocurrency to include. ('all', 'defi', 'filesharing')
129
158
  # @param audited [TrueClass, FalseClass] Show audited 'true' or not 'false'
130
- # @param aux [String] Optionally specify a comma-separated list of supplemental data fields to return. Pass 'ath, atl, high24h, low24h, num_market_pairs, cmc_rank, date_added, max_supply, circulating_supply, total_supply, volume_7d, volume_30d, self_reported_circulating_supply, self_reported_market_cap' to include all auxiliary fields.
131
159
  # @param tags [String] If you want to see cryptocurrencies that can be mined, just type 'mineable'.
132
160
  # @param volume24h_range [String] Optionally specify a threshold 24 hour USD volume to filter results by. For example, '0~100000000000000000'
133
161
  # @param percent_change24h_range [String] Optionally specify a threshold 24 hour percent change to filter results by. For example, '0~100' or '-10~100'
134
162
  # @param circulating_supply_range [String] Optionally specify a threshold circulating supply to filter results by. For example, '0~100000000000000000'
135
163
  # @param price_range [String] Optionally specify a threshold USD price to filter results by. For example, '0~100000000000000000'
136
164
  # @param market_cap_range [String] Optionally specify a threshold market cap to filter results by. For example, '0~100000000000000000'
165
+ # @return [CoinmarketcapFree::Coin] Return Coin object
137
166
  def list(**params)
167
+ options = generate_options(params)
168
+ json = Helper.get_cryptocarencies(options)
169
+
170
+ @total_count = json['data']['totalCount'].to_i # update total count
171
+
172
+ json['data']["cryptoCurrencyList"].map { |coin| Coin.convert_json(coin) }
173
+ end
174
+
175
+ def total_count
176
+ @total_count || 0
177
+ end
178
+
179
+ # Convert json data to Coin
180
+ # @param data [Hash] Data
181
+ # @return [CoinmarketcapFree::Coin] Return Coin object
182
+ def convert_json(data)
183
+ id = data['id']
184
+ name = FullName.convert_json(data)
185
+ tags = data['tags'] || []
186
+ cmc_rank = data['cmcRank']
187
+ market_pair_count = data['marketPairCount']
188
+ supply = Supply.convert_json(data)
189
+ state = State.convert_json(data)
190
+ quotes = data['quotes'].nil? ? [] : data['quotes'].map { |quote| Quotes.convert_json(quote) }
191
+
192
+ Coin.new(id, name, tags, cmc_rank, market_pair_count, supply, state, quotes)
193
+ end
194
+
195
+ private
196
+
197
+ # Generate options
198
+ # @param params [Hash]
199
+ # @return [Hash] Return options
200
+ def generate_options(params)
138
201
  options = {}
139
202
 
140
203
  options[:start] = params[:start] || 1 # Integer
@@ -145,7 +208,6 @@ module CoinmarketcapFree
145
208
  options[:cryptoType] = params[:crypto_type] || 'all' # String
146
209
  options[:tagType] = params[:tag_type] || 'all' # String
147
210
  options[:audited] = params[:audited] || false # Boolean
148
- options[:aux] = params[:aux] # String
149
211
  options[:tags] = params[:tags] # String
150
212
  options[:volume24hRange] = params[:volume24h_range] # String
151
213
  options[:percentChange24hRange] = params[:percent_change24h_range] # String
@@ -153,7 +215,7 @@ module CoinmarketcapFree
153
215
  options[:priceRange] = params[:price_range] # String
154
216
  options[:marketCapRange] = params[:market_cap_range] # String
155
217
 
156
- Helper.http_get(URI_API, options)
218
+ options
157
219
  end
158
220
  end
159
221
  end
@@ -1,12 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'helper'
4
2
 
5
3
  module CoinmarketcapFree
6
- # All history cryptocurrency and their prices.
7
- module CoinHistory
8
- URI_API = "#{BASE_URI}#{VERSION_API}/cryptocurrency/detail/chart"
9
-
4
+ # Model for Cryptocurrency History
5
+ class CoinHistory
10
6
  INTERVAL_TIME = {
11
7
  one_day: '1D',
12
8
  seven_days: '7D',
@@ -17,36 +13,56 @@ module CoinmarketcapFree
17
13
  all: 'ALL'
18
14
  }.freeze
19
15
 
16
+ attr_accessor :time,
17
+ :price,
18
+ :volume_24h,
19
+ :market_cap,
20
+ :totaly_supply
21
+
22
+ def initialize(date, price, volume_24h, market_cap, totaly_supply)
23
+ @time = date
24
+ @price = price
25
+ @volume_24h = volume_24h
26
+ @market_cap = market_cap
27
+ @totaly_supply = totaly_supply
28
+ end
29
+
20
30
  class << self
21
31
  # Returns an interval of historic market quotes for any cryptocurrency based on time and interval parameters.
22
32
  #
23
- # You can use one of the following intervals: 1D, 7D, 1M, 3M, 1Y, YTD, ALL
33
+ # You can use one of the following intervals: 1D, 7D, 1M, 3M, 1Y, YTD, ALL or custom range '1668981600~1671659999'
34
+ # or call the method by its full name: one_day, seven_days, one_month, three_months, one_year, current_year, all
24
35
  #
25
- # history = CoinmarketcapFree::CoinHistory.custom_time(1, '1D')
36
+ # history = CoinmarketcapFree::CoinHistory.custom_time(id_coin, '1D')
26
37
  #
27
- # Also you can use this method like this:
38
+ # or
28
39
  #
29
- # history = CoinmarketcapFree::CoinHistory.interval_one_day(1)
40
+ # histories = CoinmarketcapFree::CoinHistory.one_day(id_coin)
41
+ # histories = CoinmarketcapFree::CoinHistory.seven_days(id_coin)
42
+ # histories = CoinmarketcapFree::CoinHistory.one_month(id_coin)
43
+ # histories = CoinmarketcapFree::CoinHistory.three_months(id_coin)
44
+ # histories = CoinmarketcapFree::CoinHistory.one_year(id_coin)
45
+ # histories = CoinmarketcapFree::CoinHistory.current_year(id_coin)
46
+ # histories = CoinmarketcapFree::CoinHistory.all(id_coin)
30
47
  #
31
- # Just add a prefix to the method: interval_(one_day, seven_days, one_month, three_months, one_year, current_year, all)
32
48
  #
33
49
  # Result json:
34
50
  #
35
51
  # {
36
52
  # "data": {
37
53
  # "points": {
38
- # "1673192010": {
54
+ # "1673192010": { # time in seconds
39
55
  # "v": [
40
- # 16953.771282696678,
41
- # 7609543976.45,
42
- # 326457581376.786557398500,
56
+ # 16953.771282696678, # price
57
+ # 7609543976.45, # volume 24h
58
+ # 326457581376.786557398500, # market cap
43
59
  # 1,
44
- # 19255750.00000000000000000000
60
+ # 19255750.00000000000000000000 # total supply
45
61
  # ],
46
62
  # "c": [
47
- # 16953.771282696678,
48
- # 7609543976.45,
49
- # 326457581376.786557398500
63
+ # 16953.771282696678, # price
64
+ # 7609543976.45, # volume 24h
65
+ # 326457581376.786557398500 # market cap
50
66
  # ]
51
67
  # },
52
68
  # ...
@@ -68,19 +84,35 @@ module CoinmarketcapFree
68
84
  #
69
85
  # @param id [Integer] Cryptocurrency identifier from coinmarketcap. For example, Bitcoin has the number 1
70
86
  # @param range_time [String] Range time. For example, '1D', '7D', '1M', '3M', '1Y', 'YTD', 'ALL' or custom range '1668981600~1671659999'
71
- # @return [String]
87
+ # @return [Array<CoinmarketcapFree::CoinHistory] Return CoinHistory object
72
88
  def custom_time(id, range_time)
73
- Helper.http_get(URI_API, { id: id, range: range_time })
89
+ json = Helper.get_cryptocurrency_histories({ id: id, range: range_time })
90
+
91
+ json['data']['points'].map { |key, value| CoinHistory.convert_json(key, value['v']) }
74
92
  end
75
93
 
76
- # Creating interval methods
94
+ # Create interval methods
77
95
  INTERVAL_TIME.each do |key, value|
78
96
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
79
- def interval_#{key}
97
+ def #{key}(id)
80
98
  custom_time(id, '#{value}')
81
99
  end
82
100
  RUBY
83
101
  end
102
+
103
+ # Convert json data to CoinHistory
104
+ # @param utc_timestamp [Integer] Time in seconds
105
+ # @param data [Array] Data
106
+ # @return [CoinmarketcapFree::CoinHistory] Return CoinHistory object
107
+ def convert_json(utc_timestamp, data)
108
+ timestamp = utc_timestamp.is_a?(String) ? utc_timestamp.to_i : utc_timestamp
109
+
110
+ CoinHistory.new(Time.at(timestamp), # convert time utc
111
+ data[0], # price
112
+ data[1], # volume 24h
113
+ data[2], # market cap
114
+ data[4]) # total supply
115
+ end
84
116
  end
85
117
  end
86
118
  end
@@ -1,24 +1,42 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'uri'
4
2
  require 'net/http'
5
3
  require 'openssl'
6
4
  require 'json'
5
+ require 'date'
7
6
 
8
7
  module CoinmarketcapFree
9
- BASE_URI = 'https://api.coinmarketcap.com/data-api/'
10
- VERSION_API = 'v3'
11
-
12
- # Helper module for CoinmarketcapFree
8
+ # Helper module
13
9
  module Helper
10
+ BASE_URI = 'https://api.coinmarketcap.com/data-api/'
11
+ VERSION_API = 'v3'
12
+
13
+ URI_API_CRYPTOCURRENCIES = "#{BASE_URI}#{VERSION_API}/cryptocurrency/listing"
14
+ URI_API_CRYPTOCURRENCY_HISTORIES = "#{BASE_URI}#{VERSION_API}/cryptocurrency/detail/chart"
15
+
14
16
  class << self
17
+ # Get cryptocurrency of histories
18
+ # @param data [Hash] Parameters for Coinmarketcap API
19
+ # @return [Hash] Return coin histories
20
+ def get_cryptocurrency_histories(data)
21
+ str = http_get(URI_API_CRYPTOCURRENCY_HISTORIES, data)
22
+ JSON.parse(str)
23
+ end
24
+
25
+ # Get cryptocurrencies
26
+ # @param data [Hash] Parameters for Coinmarketcap API
27
+ # @return [Hash] Return cryptocurrencies
28
+ def get_cryptocarencies(data)
29
+ str = http_get(URI_API_CRYPTOCURRENCIES, data)
30
+ JSON.parse(str)
31
+ end
32
+
33
+ private
34
+
15
35
  def http_get(url, data = nil)
16
36
  uri = URI(generate_url(url, data))
17
37
  Net::HTTP.get(uri)
18
38
  end
19
39
 
20
- private
21
-
22
40
  def generate_url(url, data = nil)
23
41
  "#{url}#{data ? '?' : ''}#{data.map { |key, value| "#{key}=#{value}" }.join('&')}"
24
42
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  # Get data from Coinmarketcap API without requiring an API key.
4
4
  module CoinmarketcapFree
5
- MAJOR = 0
6
- MINOR = 4
7
- PATCH = 0
5
+ MAJOR = 1
6
+ MINOR = 0
7
+ PATCH = 1
8
8
 
9
9
  private_constant :MAJOR, :MINOR, :PATCH
10
10
 
@@ -1,8 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'coinmarketcap_free/coin_history'
4
2
  require_relative 'coinmarketcap_free/coin'
5
- require_relative 'coinmarketcap_free/icon'
6
3
  require_relative 'coinmarketcap_free/version'
7
4
 
8
5
  # Get data from Coinmarketcap API without requiring an API key.
@@ -16,24 +13,21 @@ module CoinmarketcapFree
16
13
  #
17
14
  # list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'asc')
18
15
  #
19
- # or
16
+ # or in descending
20
17
  #
21
18
  # list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'desc')
22
19
  #
23
- # You can also adding sort by:
20
+ # Or sort by name with ascending:
24
21
  #
25
22
  # list = CoinmarketcapFree.coins(limit: 100, start: 1, sort_type:'asc', sort_by: 'name')
26
23
  #
27
- # Convert cryptocurrency to::
28
- #
29
- # list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD,BTC,ETH')
24
+ # Convert cryptocurrency to USD:
30
25
  #
31
- # Also you can use this method like this:
26
+ # list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD')
32
27
  #
33
- # list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD,BTC,ETH') do |data|
34
- # JSON.parse(data)
35
- # end
28
+ # or together
36
29
  #
30
+ # list = CoinmarketcapFree.coins(limit: 100, start: 1, convert: 'USD,BTC,ETH')
37
31
  #
38
32
  # @param start [Integer] Optionally offset the start (1-based index) of the paginated list of items to return.
39
33
  # @param limit [Integer] Optionally specify the number of results to return. Use this parameter and the 'start' parameter to determine your own pagination size.
@@ -43,61 +37,33 @@ module CoinmarketcapFree
43
37
  # @param crypto_type [String] The type of cryptocurrency to include. ('all', 'coins', 'tokens')
44
38
  # @param tag_type [String] The tag of cryptocurrency to include. ('all', 'defi', 'filesharing')
45
39
  # @param audited [TrueClass, FalseClass] Show audited 'true' or not 'false'
46
- # @param aux [String] Optionally specify a comma-separated list of supplemental data fields to return. Pass 'ath, atl, high24h, low24h, num_market_pairs, cmc_rank, date_added, max_supply, circulating_supply, total_supply, volume_7d, volume_30d, self_reported_circulating_supply, self_reported_market_cap' to include all auxiliary fields.
47
40
  # @param tags [String] If you want to see cryptocurrencies that can be mined, just type 'mineable'.
48
41
  # @param volume24h_range [String] Optionally specify a threshold 24 hour USD volume to filter results by. For example, '0~100000000000000000'
49
42
  # @param percent_change24h_range [String] Optionally specify a threshold 24 hour percent change to filter results by. For example, '0~100' or '-10~100'
50
43
  # @param circulating_supply_range [String] Optionally specify a threshold circulating supply to filter results by. For example, '0~100000000000000000'
51
44
  # @param price_range [String] Optionally specify a threshold USD price to filter results by. For example, '0~100000000000000000'
52
45
  # @param market_cap_range [String] Optionally specify a threshold market cap to filter results by. For example, '0~100000000000000000'
53
- # @return [Hash]
46
+ # @return [Array<CoinmarketcapFree::Coin>] Return CoinmarketcapFree::Coin object
54
47
  def coins(**params)
55
- data = Coin.list(params)
56
-
57
- return yield data if block_given?
58
-
59
- JSON.parse(data)
48
+ Coin.list(**params)
60
49
  end
61
50
 
62
51
  # Returns an interval of historic market quotes for any cryptocurrency based on time and interval parameters.
63
52
  #
64
- # You can use one of the following intervals: 1D, 7D, 1M, 3M, 1Y, YTD, ALL
65
- #
66
- # history = CoinmarketcapFree.coin_history(1, '1D')
53
+ # You can use one of the following intervals: 1D, 7D, 1M, 3M, 1Y, YTD, ALL or custom range like this '1668981600~1671659999'
54
+ # or call the method by its full name: one_day, seven_days, one_month, three_months, one_year, current_year, all
67
55
  #
68
- # Also you can use this method like this:
56
+ # history = CoinmarketcapFree::CoinHistory.custom_time(id_coin, '1D')
69
57
  #
70
- # history = CoinmarketcapFree.coin_history(1, '1668981600~1671659999') do |data|
71
- # JSON.parse(data)
72
- # end
58
+ # OR
73
59
  #
74
- # 'data' - Results of your query returned as an object map.
75
- # 'points' - Price range history
76
- # 'status' - Standardized status object for API calls.
60
+ # history = CoinmarketcapFree::CoinHistory.one_day(id_coin)
77
61
  #
78
62
  # @param id [Integer] Cryptocurrency identifier from coinmarketcap. For example, Bitcoin has the number 1
79
- # @param range_time [String] Range time. For example, '1D', '7D', '1M', '3M', '1Y', 'YTD', 'ALL' or custom range '1668981600~1671659999'
80
- # @return [Hash]
81
- def coin_history(id, range_time)
82
- data = CoinHistory.custom_time(id, range_time)
83
-
84
- return yield data if block_given?
85
-
86
- JSON.parse(data)
87
- end
88
-
89
- # Generate URI image of a coin
90
- #
91
- # logo = CoinmarketcapFree.coin_icon(1, 64)
92
- #
93
- # Result:
94
- # "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png"
95
- #
96
- # @param [Integer] id_coin Identify coin. For example, bitcoin has 1
97
- # @param [Integer] size Choose one size: 64, 128, 200
98
- # @return [String] Return URI from coinmarketcap
99
- def coin_icon(id_coin, size)
100
- Icon.generate_url(id_coin, size)
63
+ # @param range_time [String] Range time. For example, '1D', '7D', '1M', '3M', '1Y', 'YTD', 'ALL' or custom range like this '1668981600~1671659999'
64
+ # @return [Array<CoinmarketcapFree::CoinHistory] Return CoinHistory object
65
+ def coin_histories(id, range_time)
66
+ CoinHistory.custom_time(id, range_time)
101
67
  end
102
68
  end
103
- end
69
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coinmarketcap_free
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitalii Bakun
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-12 00:00:00.000000000 Z
11
+ date: 2024-03-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Cryptocurrency information from the Coinmarketcap site without a key.
14
14
  email:
@@ -17,6 +17,7 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".DS_Store"
20
21
  - ".rubocop.yml"
21
22
  - Gemfile
22
23
  - Gemfile.lock
@@ -25,9 +26,11 @@ files:
25
26
  - Rakefile
26
27
  - lib/coinmarketcap_free.rb
27
28
  - lib/coinmarketcap_free/coin.rb
29
+ - lib/coinmarketcap_free/coin/histories.rb
30
+ - lib/coinmarketcap_free/coin/icon.rb
31
+ - lib/coinmarketcap_free/coin/model.rb
28
32
  - lib/coinmarketcap_free/coin_history.rb
29
33
  - lib/coinmarketcap_free/helper.rb
30
- - lib/coinmarketcap_free/icon.rb
31
34
  - lib/coinmarketcap_free/version.rb
32
35
  homepage:
33
36
  licenses:
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CoinmarketcapFree
4
- # Get static image of a coin from coinmarketcap.com
5
- module Icon
6
- class << self
7
- # Generate URI image of a coin
8
- #
9
- # logo = CoinmarketcapFree::Icon.generate_url(1, 64)
10
- #
11
- # Result:
12
- # "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png"
13
- #
14
- # @param [Integer] id_coin Identify coin. For example, bitcoin has 1
15
- # @param [Integer] size Choose one size: 64, 128, 200
16
- # @return [String] Return URI from coinmarketcap
17
- def generate_url(id_coin, size)
18
- size_x_size = case size
19
- when 64, 128, 200
20
- "#{size}x#{size}"
21
- else
22
- raise ArgumentError, "Can't find this value: #{size}"
23
- end
24
- "https://s2.coinmarketcap.com/static/img/coins/#{size_x_size}/#{id_coin}.png"
25
- end
26
- end
27
- end
28
- end