Giter Club home page Giter Club logo

tropos's Introduction

Tropos

Circle CI

Weather and forecasts for humans. Information you can act on.

Most weather apps throw a lot of information at you but that doesn't answer the question of "What does it feel like outside?". Tropos answers this by relating the current conditions to conditions at the same time yesterday.

Download on the App Store

Setup

Run bin/setup

This will:

  • Install fastlane, swiftlint and xcpretty
  • Install the carthage dependencies
  • Create Secrets.h. TRForecastAPIKey is the only one required for the application to run. You can get a key from https://developer.forecast.io. You should include all keys for production builds.

Testing

Run bin/test

This will run the tests from the command line, and pipe the result through XCPretty.

Contributing

See the CONTRIBUTING document. Thank you, contributors!

Need Help?

We offer 1-on-1 coaching. We can help you with ReactiveCocoa, getting started writing unit tests, converting from Objective-C to Swift, and more. Get in touch.

License

Tropos is Copyright (c) 2019 thoughtbot, inc. It is free software, and may be redistributed under the terms specified in the LICENSE file.

About

thoughtbot

Tropos is maintained and funded by thoughtbot, inc. The names and logos for thoughtbot are trademarks of thoughtbot, inc.

We love open source software! See our other projects or hire us to help build your product.

tropos's People

Contributors

aenglund avatar andreamazz avatar bogren avatar cpytel avatar croaky avatar danbee avatar dazmuda avatar epmatsw avatar gfontenot avatar hyperspacemark avatar jakecraige avatar jamescmartinez avatar katsuroo avatar keith avatar klaaspieter avatar ryancoughlin avatar sebbean avatar sharplet avatar tailec avatar tomkowz avatar tysongach avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tropos's Issues

Improve offline state

I’d love see a friendlier message when the device has no cell service or wifi. The current “Update Failed” message makes it seem like the app is at fault, rather than the fact that you have no connection.

A message along the lines of “You’re currently offline” would be more clear.

2015-05-17 22 38 51

Consider using CocoaPods-Keys

We faced similar problems keeping keys secret when open sourcing our app Eidolon, so @orta made CocoaPods-Keys, a CocoaPods plugin designed specifically for the use case you have here.

If you'd like to see what using CocoaPods-Keys instead of Secrets.h would look like, I'd be happy to send a pull request.

Think about forecast scroll

It seems like the forecast paging only relies on velocity. You can see the issue I'm talking about if you very slowly scroll up and let go. Even if you pass the forecast view it bounces back

Unsupported countries

Forecast currently only supports the US (from here). We should handle when the user tries to refresh the app in an unsupported country.

App Store Optimization

Short short, I think we should change:

  • App Name to "Tropos - Local weather forecasts for humans"
  • Keywords to sun, rain, snow, cloud, wind, local, sunny, high, low, cloudy, rainy, storm, tornado, hurricane, fahrenheit

Not sure whether this is a code change or iTunes Connect-only?

Details:

I did a little research into App Store Optimization for Tropos and its competitors using https://sensortower.com:

Yahoo! Weather app

  • Estimated to be worth $187 million.
  • Ranked #2 in "Essentials-Weather" category.
  • Ranked #7 in Top Free iPhone Apps.
  • Won an Apple Design Award.
  • A+ keyword optimization for weather, map, noaa, radar, best, sunset, sunrise, location, solar, watch, rain, snow, forecast, photo, storm, wind, sunny, hurricane

Weather Channel

  • Estimated to be worth $252 million.
  • Ranked #1 in "Essentials"
  • Ranked #1 in "Top Free iPhone Apps"
  • B+ keyword optimization for map, radar, sunset, best, tornado, wach, snow, rain, forecast, local, storm, ski, wind, alert, severe, weather

Weather Underground

  • Estimated to be worth $25 million.
  • Ranked #6 in Top Free iPhone Apps
  • Ranked #16 in Top Grossing iPhone Apps - Weather
  • Ranked #19 in Forecasts & Alerts

Tropos

  • Estimated to be worth $1,330
  • Ranked #187 in Top Grossing iPhone Apps - Weather
  • Ranked #115 in Top Paid iPhone Apps - Weather
  • iPhone Rank of 926 for "forecast"
  • iPhone Rank of 868 for "rain"
  • iPhone Rank of 961 for "sun"
  • iPhone Rank of 1,377 for "weather"
  • iPhone Rank of 1,470 for "cloud"
  • iPhone Rank of 519 for "wind"

Analysis of Ranking Difficulty

I ran through a calculation to balance traffic, iPhone difficulty, and word length (we have a 100 letter limit in the Keywords field), and ranked by Traffic per Letter:

https://docs.google.com/a/thoughtbot.com/spreadsheets/d/1xVdWMrc7zUld0C6KG-…

Result:

  • For what Tropos is and the ranked results, I think we want to ignore nws, noaa, tornado, storm, hurricane, temperature, thermometer, radar, etc.
  • I think we want to include sun, rain, snow, local, cloud, wind, weather

Some App Keyword Best Practices, Info

  • Don't repeat keywords
  • Don't use company or app name in keywords, these already discoverable
  • Avoid keywords where you're not competitive
  • App Name acts like keywords, but does not seem to be weighted more than actual keywords
  • App Name is used to create app URL, which can help with Google

Current and Proposed App Name + Keywords

At https://itunes.apple.com/us/app/tropos-weather-forecasts-for/id955209376

  • App Name is "Tropos - Weather and forecasts for humans"
  • Keywords are weather, forecast, forecasts, conditions, temperatures, high, low, wind, sunny, sun, cloudy, cloud, rainy, rain

The next time we update the app, I'm proposing we update to:

  • App Name changed to "Tropos - Local weather forecasts for humans"
  • Keywords changed to sun, rain, snow, cloud, wind, local, sunny, high, low, cloudy, rainy, storm, tornado, hurricane, fahrenheit

Increase line height on phrase label

I looked into this and im not too clear on how to do it. I tried with IB and using "Attributed" type then it made all the text tiny without our right font.

Improve conditions descriptions localizations

Right now we're localizing the parts of these strings individually which could possibly lead to some odd translations in languages that don't have the same grammar structure as English.

Temperature.celsiusValue should be a computed property

The problem with a lazy var is you can overwrite it:

lazy var celsiusValue: Int = {
return Int(round(Float(self.fahrenheitValue - 32) * 5.0 / 9.0))
}()

let temp = Temperature(fahrenheitValue: 20)
temp.celsiusValue = 20

The math isn't particularly expensive, so using a computed variable is probably good enough. If we really want to lazily load the celsius value, we can do so with a private lazy var, which the computed variable calls/returns.

Convert classes from Models directory to Swift classes

Hey,

As mentioned in another talk if some change will be bigger one I should create a task for it to lock some part of the project. And I would because I digged in the project and started changing it into Swift. I would like to lock entire /Models directory and work on it.

  • Precipitation - PR #145
  • Temperature - PR #141
  • WeatherUpdateCache
  • DailyForecast - PR #148
  • WeatherUpdate

I think it should take one day and should be ready in next 24h (-9h to San Francisco time).

TRWeatherLocation is unused.

I started rewriting classes from /Model directory to Swift and see that TRWeatherLocation is unused. Is there any purpose that this file is still listed in project instead of being deleted? Don't know if should move it to Swift or just delete it.

Initial location state

The first time we launch the app we see this. I'm not sure but we might want to hide those icons at the bottom at first.

2015-01-04 17 38 21

Refresh infinitely

If you pull to refresh, let go, and pull back down before the refreshing is over. You can reverse the animation. Then when you let go the loading animation exists forever.

CocoaPods Error On Build

I'm trying to build the app on my laptop, but I'm running into an issue with bin/setup.

It looks like the gemfile installs 0.35.0, but the pods file actually requires 0.37+. Running bundle update followed by ./bin/setup appears to fix the error. This is using ruby 2.2.1p85 on OSX 10.11.

Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Installing i18n 0.6.11
Using json 1.8.1
Installing minitest 5.4.3
Installing thread_safe 0.3.4
Installing tzinfo 1.2.2
Installing activesupport 4.1.8
Installing claide 0.7.0
Installing fuzzy_match 2.0.4
Installing nap 0.8.0
Installing cocoapods-core 0.35.0
Installing cocoapods-downloader 0.8.0
Installing cocoapods-plugins 0.3.2
Installing netrc 0.7.8
Installing cocoapods-trunk 0.4.1
Installing cocoapods-try 0.4.2
Using colored 1.2
Installing escape 0.0.4
Installing molinillo 0.1.2
Installing open4 1.3.4
Installing xcodeproj 0.20.2
Installing cocoapods 0.35.0
Installing xcpretty 0.1.7
Using bundler 1.10.4
Bundle complete! 2 Gemfile dependencies, 23 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Analyzing dependencies
[!] The version of CocoaPods used to generate the lockfile (0.37.2) is higher than the version of the current executable (0.35.0). Incompatibility issues may arise.
/Users/will/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/pathname.rb:430:in `open': No such file or directory @ dir_initialize - /Users/will/.cocoapods/repos (Errno::ENOENT)
    from /Users/will/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/pathname.rb:430:in `foreach'
    from /Users/will/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/pathname.rb:430:in `children'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/lib/cocoapods/sources_manager.rb:63:in `all'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:130:in `repo_information'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:34:in `report'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:58:in `report_error'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/claide-0.7.0/lib/claide/command.rb:300:in `handle_exception'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/claide-0.7.0/lib/claide/command.rb:274:in `rescue in run'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/claide-0.7.0/lib/claide/command.rb:264:in `run'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:45:in `run'
    from /Users/will/.rvm/gems/ruby-2.2.1/gems/cocoapods-0.35.0/bin/pod:43:in `<top (required)>'
    from /Users/will/.rvm/gems/ruby-2.2.1/bin/pod:23:in `load'
    from /Users/will/.rvm/gems/ruby-2.2.1/bin/pod:23:in `<main>'
    from /Users/will/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `eval'
    from /Users/will/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `<main>'

-------------------------------------------------
Created Tropos/Secrets.h. Please add your keys to it.
-------------------------------------------------

MVVM Architecture Question

Hey folks,

Thanks for open sourcing the project! Its great to watch the ThoughtBot team (and now others) doing what they do best.

My question is around MVVM Architecture, other implementations of MVVM seem to throw everything into the viewModel where Tropos has a controller object that seems to do most of the heavy lifting. What is the thinking around this? How do you decide where the responsibility of the controller & viewModel starts and ends?

To use an example, lets say Tropos one day requires user authentication in order to see the weather updates, this introduces a authenticationViewController, authenticationController and authenticationViewModel.

If the authenticated state is determined by presence of a accessToken in userDefaults is it the controller that would be providing a RAC signal here? Is the viewModel aware of the authenticated state?

Thanks again!

Update failed sticks around

I just hit a case where my update had failed because of connectivity. Then after the next update the label continued to say failed. Not worth spending a lot of time on if we can't reproduce.

Fix CI

Circle is broken, we should look at going back to Travis.

Change in CocoaPods 0.38 causing setup exception

CocoaPods 0.38 throws an exception with this project on pod install. Looks like this is due to a change in the post-install hook. Setting CocoaPods to 0.37.2 in the Gemfile is a simple workaround for anyone else running in to this issue.

$ pod install
Analyzing dependencies

CocoaPods 0.38.0.beta.1 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Pre-downloading: `Specta` from `https://github.com/specta/specta.git`, tag `v0.3.0.beta1`
Downloading dependencies
Installing Expecta (0.3.1)
Installing HockeySDK (3.6.2)
Installing Mixpanel (2.7.2)
Installing OCMock (3.1.2)
Installing OHHTTPStubs (3.1.10)
Installing ReactiveCocoa (2.4.7)
Installing Specta (0.3.0.beta1)
Generating Pods project
2015-06-28 14:13:38.395 ruby[10572:1662232] [MT] DVTAssertions: ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-8123.33/IDEFoundation/Initialization/IDEInitialization.m:590
Details:  Assertion failed: _initializationCompletedSuccessfully
Function: BOOL IDEIsInitializedForUserInteraction()
Thread:   <NSThread: 0x10508f720>{number = 1, name = main}
Hints: None
Backtrace:
  0  0x0000000108a19047 -[DVTAssertionHandler handleFailureInFunction:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in DVTFoundation)
  1  0x0000000108a187d4 _DVTAssertionHandler (in DVTFoundation)
  2  0x0000000108a18a40 _DVTAssertionFailureHandler (in DVTFoundation)
  3  0x0000000108a189a2 _DVTAssertionFailureHandler (in DVTFoundation)
  4  0x000000010e4491a9 IDEIsInitializedForUserInteraction (in IDEFoundation)
  5  0x000000011235fa5d +[PBXProject projectWithFile:errorHandler:readOnly:] (in DevToolsCore)
  6  0x00000001123615e2 +[PBXProject projectWithFile:errorHandler:] (in DevToolsCore)
  7  0x00007fff9c770f14 ffi_call_unix64 (in libffi.dylib)
Abort trap: 6

mismatched CocoaPods version Gemfile.lock vs Podfile.lock

Podfile.lock created with version 0.38.2: https://github.com/thoughtbot/Tropos/blob/master/Podfile.lock#L48
Gemfile.lock has cocoapods versioned at 0.37.2
https://github.com/thoughtbot/Tropos/blob/master/Gemfile.lock#L11

Resulting in this warning in bin/setup:

[!] The version of CocoaPods used to generate the lockfile (0.38.2) is higher than the version of the current executable (0.37.2). Incompatibility issues may arise.

and possibly related error later in bin/setup : Generating Pods project
screen shot 2015-11-30 at 1 59 32 pm

And, lastly, in workspace:

screen shot 2015-11-30 at 2 02 54 pm

Seeing if I can whip up a quick fix.

Convert classes from ViewMode and Formatters directories to Swift

Just started converting classes from ViewModel.

Here you can find status of conversion.

  • TRDailyForecastViewModel
  • TRWeatherViewModel

Pull requests will be created after classes from #137 are merged because these new classes needs those from #137.

I also decided to convert few formatters to make my work simpler with converting TRWeatherViewModel.

  • TRPrecipitationChanceFormatter
  • TRTemperatureFormatter
  • TRDateFormatter
  • TRBearingFormatter
  • TRWindSpeedFormatter
  • TRTemperatureComparisonFormatter
  • UIColor+TRTemperatureColors

Moving app to Swift

Hey guys!

The app looks nice, it's very simple but looks gorgeous. I like such simple design ;) I found the repo via Open Sourcing Tropos, Our iOS Weather App. Gordon wrote about moving app to Swift. It means that new classes, etc. should be created in Swift or we can also play and rewrite existing classes in Swift?

Thanks!

@troposweather Twitter account

Why:

  • More links to the troposweather.com website (SEO)
  • Run ads (acquisition)

What:

  • Announce releases, new capabilities
  • Share amusing weather events

Weather difference incorrect for cold climates

Yesterday Tropos said that it was "hotter" today than yesterday, but that was because it was like 0 the day before and was 14 or something that morning.

I think it would be good if this language was adjusted to never say "hot" if the temperature is below freezing.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.